var
  { exchange #3081
    приходится городить огород с глобальной переменной при загрузке IK.UK.
    это нужно потому что там требуется определить только название поля
    косгу/аубу без сохранения его в строке. а по другому - это придется
    дорабатывать другие загрузчики и тащить локальную переменную в них.}
  v3081_BK_Field_Name_AuBu: string;
{------------------------------------------------------------------------------}
{~GetNameField_AuBu_of_Mode
  exchange #3081
  возвращает название поля aField в строке эд ау/бу для режима aMode.

  aField - названия поля:
    'КОСГУ','KESR','KES'
    'КВР','KVR'
    'CR_ANAL_KIND','ТИП_КЛАССИФИКАЦИИ','КЛАССИФИКАЦИЯ'
    'CR_DIRECTION','НАПРАВЛЕНИЕ_ОПЕРАЦИИ','НАПРАВЛЕНИЕ'
  aMode - режим:
    0 - для строки эд 195 по IK.ZR, 194 IK.ZN, SDP.SPRR (IK/SP)
    1 - для ZR эд 195 - классификация получателя.
    2 - для 195.ZV.вариант 1
    3 - для 195.ZV.вариант 2
    4 - для 195го по VI/VJ
    5 - для эд 5/24го по BDPD (IK/VI/VJ/VK)
    6 - для эд 193 по BH.ZV/BH.ZR
    7 - для эд 199 по IK.UK
    8 - для эд 214го по ZF
  результат:
    название поля в строке.}
function GetNameField_AuBu_of_Mode( aField: string; aMode: integer): string;
begin
    try
      case UPPERCASE( aField) of
        'КОСГУ','KESR','KES':
              case aMode of
                1,2,3:
                     Result := 'KESR_HEAD_CODE';
                5:   Result := 'AUBU_KESR_CODE';
                else Result := 'KESR_CODE';
              end;//case//

        'КВР','KVR':
              case aMode of
                1,2,3:
                     Result := 'KVR_HEAD_CODE';
                5:   Result := 'AUBU_KVR_CODE';
                else Result := 'KVR_CODE';
              end;//case//

        'КФСР','KFSR':
              case aMode of
                1,2,3:
                     Result := 'KFSR_HEAD_CODE';
                5:   Result := 'AUBU_KFSR_CODE';
                else Result := 'KFSR_CODE';
              end;//case//

        'KSDA':
              case aMode of
                1,2,3:
                     Result := 'KSDA_HEAD_CODE';
                5: Result := 'AUBU_KSDA_CODE';
                else Result := 'KSDA_CODE';
              end;

        'CR_ANAL_KIND','ТИП_КЛАССИФИКАЦИИ','КЛАССИФИКАЦИЯ':
              case aMode of
                1,2,3:
                     Result := 'HEAD_CR_ANAL_KIND';
                5:   Result := 'CR_ANAL_KIND';
                else Result := 'CR_ANAL_KIND';
              end;//case//

        'CR_DIRECTION','НАПРАВЛЕНИЕ_ОПЕРАЦИИ','НАПРАВЛЕНИЕ':
              case aMode of
                1,2,3:
                     Result := 'HEAD_CR_DIRECTION';
                5:   Result := 'CR_DIRECTION';
                else Result := 'CR_DIRECTION';
              end;//case//

      end;//case//
      except
        ExceptionProc( 'GetNameField_AuBu_of_Mode');
    end;
end;
{------------------------------------------------------------------------------}
{~GetAUBU_KVR_EXP_FLAG_for_OrgID
  возвращает =true, если ид.орг указан и флаг AUBU_KVR_EXP_FLAG в карточке
  орг = 1.
  это определяет загрузку КВР. для остальных случаев - КОСГУ.
  если орг не указана - возвращается =false.}
function GetAUBU_KVR_EXP_FLAG_for_OrgID( aOrgID: string): boolean;
{  var
  xOrgID: string;}
begin
    try
    (*
      case aClassED of
        '195','194':
            xOrgID := GetNodeAttributeEx( aXmlED, //aXmlEDLine.ParentNode.ParentNode,
                                          'PAY_ID');

      end;//case//
      *)
      if (LENGTH( aOrgID) <= 0)
        then Result := FALSE
        else Result := (QueryField(
                            'select AUBU_KVR_EXP_FLAG Z from org where id=?',
                            [ aOrgID],
                            'Z') = '1');
      except
        ExceptionProc( 'GetAUBU_KVR_EXP_FLAG_for_OrgID');
    end;
end;
{------------------------------------------------------------------------------}
{~FillLineED_AuBu_by3081
  exchange #3062 - унификация кода
  exchange #3081
  сохранение в строке aXmlLine:
    тип классификации, направление, косгу или квр.
    для разных режимов (aMode).

  косгу или квр только для расходной строки по настройке конфига
  в переменной v3081_ExchangeKES_for_aubu.
  для доходной и источников - всегда косгу.

    если сохраняется квр, то поле косгу инициализируется 000,
  а в aOutCheckKES возвращается false.

    если сохр. косгу, то поле квр не заполняется,
  а в aOutCheckKES возвращается true.

  Правило 1.
  Определение значения полей «тип классификации» и «направление операции»
  определяется из реквизита «тип КБК» плательщика или получателя
  в зависимости от класса загружаемого документа.
  сли значение типа КБК имеет:
    10 – то значению поля «тип классификации» присвоить значение «Расходы»,
          значению поля «Направление операции» присвоить значение
          в зависимости от класса загружаемого документа;
    20 – то значению поля «тип классификации» присвоить значение «Доходы»,
          значению поля «Направление операции» присвоить значение
          в зависимости от класса загружаемого документа;
    31 – то значению поля «тип классификации» присвоить значение «Источники»,
          значению поля «Направление операции» присвоить значение
          в зависимости от класса загружаемого документа.

  Правило 2.
    Формирование значения кода аналитической классификации в строке
  формируемого ЭД. Значение с 18 по 20 знак реквизита «Код по КБК»
  структурированного файла требуется сохранять в поле «КВР»,
  если определен тип классификации  «10» - «Расходы» и  в карточке
  организации-плательщика (получателя, в зависимости от класса документа)
  поле «Аналитический учет расходов по КВР» равно «1», иначе - в поле «КОСГУ».

  Правило 3.
  При загрузке значения поля «Идентификатор платежа» всегда сохранять
  строку с типом «Доходы».

  Правило 4.
  Формирование значений «Классификация получателя» и «Классификация
  получателя для ФК».
    1.	В какую из строк «Классификация получателя для ФК» или
        «Классификация получателя» загружаемого ЭД  требуется осуществлять
        загрузку, определяется по значению поля КБК.
        Если с 1 по 17 знак значения равны 0 (семнадцати нулям), то заполнять
        группу полей «Классификация получателя», иначе в группу полей
        «Классификация полей для ФК».

    2.	Заполнение группы полей «Классификация получателя».
      2.1.	Заполнение полей «Тип классификации», «Направление операции»
           осуществляется на основании значения типа КБК расшифровки ЭД
           структурированного файла, если :
       	10 – то значению поля «тип классификации» присвоить значение «Расходы»,
              значению поля «Направление операции» присвоить значение
              в зависимости от класса загружаемого документа;
       	20 – то значению поля «тип классификации» присвоить значение «Доходы»,
              значению поля «Направление операции» присвоить значение
              в зависимости от класса загружаемого документа;
       	31 – то значению поля «тип классификации» присвоить значение «Источники»,
              значению поля «Направление операции» присвоить значение
              в зависимости от класса загружаемого документа.

      2.2.	Если значение поля «тип классификации» определено, то значение
          с 18 по 20 знак реквизита КБК получателя сохраняется:
            в поле КВР, если значение поля «тип классификации» определен как
          «Расходы» и в карточке организации блока «Получатель» поле
          «Аналитический учет расходов по КВР» равно «1»,
            в поле КОСГУ в любом другом случае (в том числе и отсутствие
          организации блока «Получатель» в справочнике «Организации»).

    3.	Заполнение группы полей «Классификация получателя для ФК»
      Тип КБК = 10 – если тип строки «Расходы», соответственно
          КБК = КВСР+КФСР+КЦСР+КВР;
      Тип КБК=20 – если тип строки «Доходы», соответственно КБК= Админ.+КВД;
      Тип КБК=31(32) – если тип строки «Источники» и первые два знака поля
          «КВИ»=01(02), соответственно КБК=Админ+КВИ.

  режим:
    0 (по умолчанию) - для строки эд 195 по IK.ZR, по BDPD, 194 IK.ZN
    1 - для ZR эд 195 - классификация получателя
                      или классификация получателя для ФК.
    2 - для 195.ZV.вариант 1
          в поле «Тип классификации» строки сохранять значение «доходы»,
          «Направление операции» - «поступления»,
          значение с 18 по 20 знак реквизита aKBK сохранять в поле «КОСГУ».
    3 - для 195.ZV.вариант 2
          в поле «Тип классификации» строки сохранять значение «расходы»,
          «Направление операции» - «восстановление выплат»,
          значение с 18 по 20 знак реквизита ZVDOCPOL.KBK_RCP
          сохранять в зависимости от значения параметра добавленного
          по ФТ-1, в поле «КОСГУ»,
          если значение параметра «КОСГУ», или «КВР»,
          если значение параметра «КВР».
    4 - для 195го по VI/VJ по BDPD
    5 - для эд 5го по BDPD (IK/VI/VJ/VK)
    6 - для эд 193 по BH.ZR/BH.ZV
    7 - для эд 199 по IK.UK.
          допускается, если строка не указана (aXmlLine = null)
          заполнение кода не выполняется и результат поверки кода косгу/квр
          должен быть отрицательным.
    8 - для эд 214го по ZF
        exchange #3114
        поле КОСГУ значением с 18 по 20 знаки ZFPP.KBK,
        "тип классификации" - "Доходы",
        "Направлениеоперации" - "Поступление".}
procedure FillLineED_AuBu_by3081( aBudgetID: string;
                                  {aXmlED, }aXmlLine: variant;
                                  aKBK, aKbkType, aClassED: string;
                                  var aOutCheckKES: boolean;
                                  var aOutCheckKVR: boolean;
                                  aMode: integer;
                                  aOrgID: string = '');
  {----------------------------------------------------------------------------}
var
  xFieldNameKES: string;
  xFieldNameKVR: string;
  xFieldNameKFSR: string;
  xFieldNameKSDA: string;
  xFieldNameCR_ANAL_KIND: string;
  xFieldNameCR_DIRECTION: string;
//  xKBK: string;
begin
    try
      xFieldNameKES := GetNameField_AuBu_of_Mode( 'KES', aMode);
      xFieldNameKVR := GetNameField_AuBu_of_Mode( 'KVR', aMode);
      xFieldNameKFSR := GetNameField_AuBu_of_Mode( 'KFSR', aMode);
      xFieldNameKSDA := GetNameField_AuBu_of_Mode( 'KSDA', aMode);
      xFieldNameCR_ANAL_KIND := GetNameField_AuBu_of_Mode( 'CR_ANAL_KIND', aMode);
      xFieldNameCR_DIRECTION := GetNameField_AuBu_of_Mode( 'CR_DIRECTION', aMode);
      // по умолчанию определяется поле КОСГУ
      v3081_BK_Field_Name_AuBu := xFieldNameKES;

      case aMode of
        0: begin
              // нач. значение косгу - 000
              InsertKES_for_Line_Created_ED(  aXmlLine,
                                              xFieldNameKES,
                                              KesCodeFormat( '0', aBudgetID),
                                              FALSE,
                                              aOutCheckKES);
              aOutCheckKVR := FALSE;
            end;

        1: begin
              // правило 4
              if NOT KBK_is_0( COPY( aKBK, 1, 17)) then begin
                // ид. получателя для ФК
                aXmlLine.SetAttribute( 'FK_BUDGET_CODE', aKBK);
                case aKbkType of
                  '20': aXmlLine.SetAttribute( 'FK_ANAL_KIND', '1');
                  '10': aXmlLine.SetAttribute( 'FK_ANAL_KIND', '2');
                  '31',
                  '32': aXmlLine.SetAttribute( 'FK_ANAL_KIND', '3');
                end;//case//
                aOutCheckKES := FALSE;
                aOutCheckKVR := FALSE;
                EXIT;
              end;


              InsertKES_for_Line_Created_ED(  aXmlLine,
                                              xFieldNameKES,
                                              '',
                                              FALSE,
                                              aOutCheckKES);
              aOutCheckKVR := FALSE;
            end;

        2: begin
              aXmlLine.SetAttribute( xFieldNameKES,
                                     DoEncodeKBK_KES_or_KVR( aKBK));
              aOutCheckKES := TRUE;
              aOutCheckKVR := FALSE;
              EXIT;
            end;

        3: begin
              if GetAUBU_KVR_EXP_FLAG_for_OrgID( aOrgID) then begin
                InsertKES_for_Line_Created_ED( aXmlLine,
                                                xFieldNameKVR,
                                                DoEncodeKBK_KES_or_KVR( aKBK),
                                                TRUE,
                                                aOutCheckKVR);
                aOutCheckKES := FALSE;
              end else begin
                InsertKES_for_Line_Created_ED( aXmlLine,
                                                xFieldNameKES,
                                                DoEncodeKBK_KES_or_KVR( aKBK),
                                                TRUE,
                                                aOutCheckKES);
                aOutCheckKVR := FALSE;
              end;
              EXIT;
            end;

        4: begin
              InsertKES_for_Line_Created_ED(  aXmlLine,
                                              xFieldNameKES,
                                              KesCodeFormat( '0', aBudgetID),
                                              FALSE,
                                              aOutCheckKES);
              aOutCheckKVR := FALSE;
            end;

        5: begin
              InsertKES_for_Line_Created_ED(  aXmlLine,
                                              xFieldNameKES,
                                              KesCodeFormat( '0', aBudgetID),
                                              FALSE,
                                              aOutCheckKES);
              aOutCheckKVR := FALSE;
            end;

        6: begin
              // нач. значение КОСГУ - пусто
              InsertKES_for_Line_Created_ED(  aXmlLine,
                                              xFieldNameKES,
                                              '',
                                              FALSE,
                                              aOutCheckKES);
              aOutCheckKVR := FALSE;
            end;

(*
        7: begin
              // нач. значение косгу - пусто
              InsertKES_for_Line_Created_ED(  aXmlLine,
                                              xFieldNameKES,
                                              '',
                                              FALSE,
                                              aOutCheckKES);
              aOutCheckKVR := FALSE;
            end;
            *)

        8: begin
              if StrIsEmpty( aKBK) then begin
                aXmlLine.SetAttribute( xFieldNameKSDA,
                                       FormatKbk('KSDA', '0', aBudgetID));
              end else begin
                if SysParamBudgetValue(aBudgetID,'aubu.title','aubu.get_source_for_cr_anal_kind_direction') = '0' then begin
                  aXmlLine.SetAttribute( xFieldNameKES,
                                           DoEncodeKBK_KES_or_KVR( aKBK));
                  aXmlLine.SetAttribute( xFieldNameKSDA,
                                         FormatKbk( 'KSDA', '0', aBudgetID));
                end else begin
                  aXmlLine.SetAttribute( xFieldNameCR_ANAL_KIND,
                                           '1');
                  aXmlLine.SetAttribute( xFieldNameCR_DIRECTION,
                                           '2');
                  aXmlLine.SetAttribute( xFieldNameKSDA,
                                           DoEncodeKBK_KES_or_KVR( aKBK));
                  CheckKSDA_for_Line_Created_ED_Ex(aBudgetID, aXmlLine, xFieldNameKSDA, True);

                  aXmlLine.SetAttribute( xFieldNameKES,
                                         FormatKbk( 'KES', '0', aBudgetID));
                end;
              end;
              aOutCheckKES := FALSE;
              EXIT;
            end;

      end;//case//

      // загрузка кода, если кбк содержит хотя бы 3 символа
      if (LENGTH( aKBK) >= 3) then
        // если расходы, тогда возможно косгу или квр + требуется проверка кода
        if (aKbkType = '10') then
        begin
          //в карточке организации-получателя ВКЛючен признак "Аналитический учет расходов по КВР"
          if GetAUBU_KVR_EXP_FLAG_for_OrgID( aOrgID) then begin
            v3081_BK_Field_Name_AuBu := xFieldNameKVR;
//            if VarIsNULL( aXmlLine) then begin
              aXmlLine.SetAttribute( xFieldNameKVR,
                                     DoEncodeKBK_KES_or_KVR( aKBK));
              aOutCheckKVR := TRUE;
//            end;
              aXmlLine.SetAttribute( xFieldNameKES,
                                   FormatKbk( 'KES', '0', aBudgetID));
          end
          else begin
  {          if VarIsNULL( aXmlLine)
              then} InsertKES_for_Line_Created_ED( aXmlLine,
                                                  xFieldNameKES,
                                                  DoEncodeKBK_KES_or_KVR( aKBK),
                                                  TRUE,
                                                  aOutCheckKES);
            aXmlLine.SetAttribute( xFieldNameKVR,
                                   FormatKbk( 'KVR', '0', aBudgetID));
          end;
          aXmlLine.SetAttribute( xFieldNameKFSR,
                                   DoEncodeKBK_KFSR( aKBK));
          aXmlLine.SetAttribute( xFieldNameKSDA,
                                   FormatKbk( 'KSDA', '0', aBudgetID));
        end
        else begin
          if SysParamBudgetValue(aBudgetID,'aubu.title','aubu.get_source_for_cr_anal_kind_direction') = '0' then begin
            aXmlLine.SetAttribute( xFieldNameKES,
                                     DoEncodeKBK_KES_or_KVR( aKBK));
            aXmlLine.SetAttribute( xFieldNameKSDA,
                                   FormatKbk( 'KSDA', '0', aBudgetID));
          end
          else begin
            aXmlLine.SetAttribute( xFieldNameKSDA,
                                     DoEncodeKBK_KES_or_KVR( aKBK));
            CheckKSDA_for_Line_Created_ED_Ex(aBudgetID, aXmlLine, xFieldNameKSDA, True);

            aXmlLine.SetAttribute( xFieldNameKES,
                                   FormatKbk( 'KES', '0', aBudgetID));
          end;

          aXmlLine.SetAttribute( xFieldNameKVR,
                                   FormatKbk( 'KVR', '0', aBudgetID));
          aXmlLine.SetAttribute( xFieldNameKFSR,
                                   FormatKbk( 'KFSR', '0', aBudgetID));
        end;
        Fill_CR_DATA_AuBu(aXmlLine,
                          aBudgetID,
                          aClassED,
                          aXmlLine.getAttribute(xFieldNameKVR),
                          aXmlLine.getAttribute(xFieldNameKES),
                          aXmlLine.getAttribute(xFieldNameKFSR),
                          aXmlLine.getAttribute(xFieldNameKSDA),
                          xFieldNameCR_ANAL_KIND,
                          xFieldNameCR_DIRECTION
                          );

      except
        ExceptionProc( 'FillLineED_AuBu_by3081');
    end;
end;
{------------------------------------------------------------------------------}
{~CheckKES_or_KVR_AuBu_by3081
  exchange #3081
  проверяются отдельно коды бк для строки эд ау/бу в бд с заменой на 0:
    косгу (если aOutCheckKES=true)
    квр (если aOutCheckKVR=true)
  коды беруться из строки эд aXmlLine с названиями, соответствующими
  режиму aMode (см.функцию GetNameKES_of_Mode/GetNameKVR_of_Mode).
  если aXmlLine = null, проверка не выполняется и результат =true.
  результат:
    =false - есть проблемы (код не найден)
    =true - все норм или проверка кодов не выполнена.}
function CheckKES_or_KVR_AuBu_by3081( aBudgetID: string;
                                      aXmlLine: variant;
                                      aOutCheckKES: boolean;
                                      aOutCheckKVR: boolean;
                                      aMode: integer): boolean;
begin

    try
      Result := TRUE;

//      if VarIsNULL( aXmlLine) then EXIT;

      if NOT CheckKES_for_Line_Created_ED_Ex(
                                      aBudgetID,
                                      aXmlLine,
                                      GetNameField_AuBu_of_Mode( 'KES', aMode),
                                      aOutCheckKES)
        then Result := FALSE;

      if NOT CheckKVR_for_Line_Created_ED_Ex(
                                      aBudgetID,
                                      aXmlLine,
                                      GetNameField_AuBu_of_Mode( 'KVR', aMode),
                                      aOutCheckKVR)
        then Result := FALSE;
      except
        ExceptionProc( 'CheckKES_or_KVR_AuBu_by3081');
    end;

end;
{------------------------------------------------------------------------------}
{~FillAndCheck_LineED_AuBu_by3081
  exchange #3081
  заполнение и проверка заполнения косгу/квр в строке aXmlLine эд aClassED
  для режима aMode.
  это аналитическая строка для эд ау/бу или эд 5/24/195 класса
  или поля классификации получателя для эд 195го. }
function FillAndCheck_LineED_AuBu_by3081( aBudgetID: string;
                                          {aXmlED, }aXmlLine: variant;
                                          aKBK, aKbkType, aClassED: string;
                                          aMode: integer;
                                          aOrgID: string = ''): boolean;
var
  xOutCheckKES: boolean;
  xOutCheckKVR: boolean;
begin
    try
      FillLineED_AuBu_by3081( aBudgetID,
//                              aXmlED,
                              aXmlLine,
                              aKBK,
                              aKbkType,
                              aClassED,
                              xOutCheckKES,
                              xOutCheckKVR,
                              aMode,
                              aOrgID);
      Result := CheckKES_or_KVR_AuBu_by3081( aBudgetID,
                                             aXmlLine,
                                             xOutCheckKES,
                                             xOutCheckKVR,
                                             aMode);
      except
        ExceptionProc( 'FillAndCheck_LineED_AuBu_by3081');
    end;
end;
{------------------------------------------------------------------------------}
{~CopyFieldsLineED_AuBu
  exchange #3081
  перенос полей ау/бу из aXmlLineED_To в aXmlLineED_From по режиму из/в}
procedure CopyFieldsLineED_AuBu( aXmlLineED_To: Variant;
                                 aMode_To: integer;
                                 aXmlLineED_From: Variant;
                                 aMode_From: integer);
  {----------------------------------------------------------------------}
  procedure CopyField_( aFieldName: string);
  begin
  
      try
        aXmlLineED_To.SetAttribute(
            GetNameField_AuBu_of_Mode( aFieldName, aMode_To),
            GetNodeAttributeEx(
                      aXmlLineED_From,
                      GetNameField_AuBu_of_Mode( aFieldName, aMode_From)));
        except
          ExceptionProc( 'CopyField_');
      end;
  
  end;
  {----------------------------------------------------------------------}
begin

    try
      CopyField_( 'CR_ANAL_KIND');
      CopyField_( 'CR_DIRECTION');
      CopyField_( 'KES');
      CopyField_( 'KVR');
      except
        ExceptionProc( 'CopyFieldsLineED_AuBu');
    end;

end;
{------------------------------------------------------------------------------}
{~DoFill3801_FK_BUDGET_CODE
  exchange #3801

  Правило 4.
  Формирование значений «Классификация получателя» и
  «Классификация получателя для ФК».
    1.	В какую из строк «Классификация получателя для ФК»
        или «Классификация получателя» загружаемого ЭД  требуется осуществлять
        загрузку, определяется по значению поля КБК.
        Если с 1 по 17 знак значения равны 0 (семнадцати нулям),
        то заполнять группу полей «Классификация получателя»,
        иначе в группу полей «Классификация полей для ФК».

  результат:
    =false - поле aKBK не 20 знаков или первые 17 знаков aKBK заполнены нулями
    =true - первые 17 знаков не нулевые.}
function DoFill3801_FK_BUDGET_CODE( aKBK: string): boolean;
begin

    try
      Result := FALSE;
      if (LENGTH( aKBK) = 20) then
        if NOT KBK_is_0( COPY( aKBK, 1, 17))
          then Result := TRUE;
      except
        ExceptionProc( 'DoFill3801_FK_BUDGET_CODE');
    end;

end;
{------------------------------------------------------------------------------}
{~UpdateLineED_AuBu_by3081_Direction
  exchange #3081
  доработка заполнения направления
  вариант:
    0 - для эд 194 по IK.ZN/IK.ZS
        При типе классификации:
          «Расходы», направление операции «выплаты»;
          «Доходы», направление операции «возврат поступлений»;
          «Источники», направление операции^
             «выплаты» для значения КОСГУ «610»,
             «возврат поступлений» для значения КОСГУ «510»;
    1 - SPD.SPRR (IK/SP)
        exchange #3126
        exchange #3129
        Если строка ЭД формируется на основании поля «KREDIT»
        и тип классификации:
          «Расходы», направление операции «восстановление выплат»;
          «Доходы», направление операции «поступление»;
          «Источники», направление операции:
              "Восстановление выплат" для типа классификации "Источники",
                  если значение поля "КОСГУ"=610;
              "Поступление" для типа классификации "Источники",
                  если значение поля "КОСГУ"=510;
              "Поступление" для типа классификации "Источники",
                  если значение поля "КОСГУ" отлично от 610 или 510.
    2 - для эд 5го BDPD (VI/VJ/VK/IK)
        При типе классификации:
          «Расходы», направление операции «выплаты»;
          «Доходы», направление операции «возврат поступлений»;
          «Источники», направление операции:
             «выплаты» для значения КОСГУ «610»,
             «возврат поступлений» для значения КОСГУ «510»;
    3 - для эд 24го BDPD (VI/VJ/VK/IK)
        При типе классификации:
          «Расходы», направление операции «восстановление выплат»;
          «Доходы», направление операции «поступление»;
          «Источники», направление операции:
              «восстановление выплат» для значения КОСГУ «610»,
              «поступления» для значения КОСГУ «510»;
    4 - SPD.SPRR (IK/SP)
        exchange #3129
        Если строка ЭД формируется на основании поля «DEBET» и тип классификации:
          «Расходы» , направление операции «выплаты»;
          «Доходы», направление операции «возврат поступлений»;
          «Источники», направление операции:
              «выплаты» для значения КОСГУ «610»,
              «возврат поступлений» для значения КОСГУ «510»,
              для других значений «выплаты»;
        Если тип классификации не удалось определить,
        по-умолчанию принимаем "расходы" - "выплаты".}
procedure UpdateLineED_AuBu_by3081_Direction( aDocLine: Variant;
                                              aVariant: integer;
                                              aPrefix: string = '');
var
  xFieldNameKES: string;
  xFieldNameKVR: string;
  xFieldNameCR_ANAL_KIND: string;
  xFieldNameCR_DIRECTION: string;
begin

    try
      case aVariant of
        //-----------------------------------------------------------------
        // эд 194 IK.ZN
        0: begin
             // пока нужно имя поля направления
             xFieldNameCR_DIRECTION :=
                        aPrefix + GetNameField_AuBu_of_Mode( 'CR_DIRECTION', 0);
             // проверяем вид классификации
             case GetNodeAttributeEx(
                    aDocLine,
                    aPrefix + GetNameField_AuBu_of_Mode( 'CR_ANAL_KIND', 0)) of
              // дох
              '1': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '4');
              // расх
              '2': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '1');
              // ист
              '3': case GetNodeAttributeEx(
                            aDocLine,
                            aPrefix + GetNameField_AuBu_of_Mode( 'KES', 0)) of
                    '610': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '1');
                    '510': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '4');
                   end;//case//
             end;//case//
           end;
        //-----------------------------------------------------------------
        // SPD.SPRR (IK/SP) KREDIT
        1: begin
             // пока нужно имя поля направления
             xFieldNameCR_DIRECTION :=
                                aPrefix + GetNameField_AuBu_of_Mode( 'CR_DIRECTION', 0);
             // проверяем вид классификации
             case GetNodeAttributeEx(
                          aDocLine,
                          aPrefix + GetNameField_AuBu_of_Mode( 'CR_ANAL_KIND', 0)) of
              // дох
              '1': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '2');
              // расх
              '2': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '3');
              // ист
              '3': case GetNodeAttributeEx(
                                aDocLine,
                                aPrefix + GetNameField_AuBu_of_Mode( 'KES', 0)) of
                    '610': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '3');
                    '510': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '2');
                    else   aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '2');
                   end;//case//
             end;//case//
           end;
        //-----------------------------------------------------------------
        // эд 5 BDPD
        2: begin
             // пока нужно имя поля направления
             xFieldNameCR_DIRECTION :=
                                aPrefix + GetNameField_AuBu_of_Mode( 'CR_DIRECTION', 5);
             // проверяем вид классификации
             case GetNodeAttributeEx(
                          aDocLine,
                          aPrefix + GetNameField_AuBu_of_Mode( 'CR_ANAL_KIND', 5)) of
              // дох
              '1': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '4');
              // расх
              '2': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '1');
              // ист
              '3': case GetNodeAttributeEx(
                                aDocLine,
                                aPrefix + GetNameField_AuBu_of_Mode( 'KES', 5)) of
                    '610': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '1');
                    '510': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '4');
                   end;//case//
             end;//case//
           end;
        //-----------------------------------------------------------------
        // эд 24го BDPD
        3: begin
             // пока нужно имя поля направления
             xFieldNameCR_DIRECTION :=
                                aPrefix + GetNameField_AuBu_of_Mode( 'CR_DIRECTION', 5);
             // проверяем вид классификации
             case GetNodeAttributeEx(
                          aDocLine,
                          aPrefix + GetNameField_AuBu_of_Mode( 'CR_ANAL_KIND', 5)) of
              // дох
              '1': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '2');
              // расх
              '2': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '3');
              // ист
              '3': case GetNodeAttributeEx(
                                aDocLine,
                                aPrefix + GetNameField_AuBu_of_Mode( 'KES', 5)) of
                    '610': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '3');
                    '510': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '2');
                   end;//case//
             end;//case//
           end;
        //-----------------------------------------------------------------
        // SPD.SPRR (IK/SP) DEBET
        4: begin
             // пока нужно имя поля направления
             xFieldNameCR_DIRECTION :=
                        aPrefix + GetNameField_AuBu_of_Mode( 'CR_DIRECTION', 0);
             // проверяем вид классификации
             case GetNodeAttributeEx(
                        aDocLine,
                        aPrefix + GetNameField_AuBu_of_Mode( 'CR_ANAL_KIND', 0)) of
              // дох
              '1': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '4');
              // расх
              '2': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '1');
              // ист
              '3': case GetNodeAttributeEx(
                                aDocLine,
                                aPrefix + GetNameField_AuBu_of_Mode( 'KES', 0)) of
                    '610': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '1');
                    '510': aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '4');
                    else   aDocLine.SetAttribute( xFieldNameCR_DIRECTION, '1');
                   end;//case//
             end;//case//
           end;
        //-----------------------------------------------------------------
        // прочее является сбоем
        else Raise( FORMAT( 'Вариант %s не обрабатывается.',
                            [ INTTOSTR( aVariant)]));
      end;//case//
      except
        ExceptionProc( 'UpdateLineED_AuBu_by3081_Direction');
    end;

end;

procedure Fill_CR_DATA_AuBu( aXmlEDLine: Variant;
                                  aBudgetID, aClassED: string;
                                  aKvrCode, aKesrCode, aKfsrCode, aKsdaCode: string;
                                  aAnalKindName: String = 'CR_ANAL_KIND';
                                  aDirectionName: String = 'CR_DIRECTION';
                                  );
var
  XmlDoc: Variant;
  XMl: String;
begin
  try
    XmlDoc := CreateOleObject('Microsoft.XmlDom');
    if (aClassED = '195') and (aXmlEDLine.TagName = 'DOCUMENT') then
      aClassED := '193';
    XML := '<AUBUBUDGETLINE action="get_cr_data" ' +
      ' BUDGET_ID="' + aBudgetID + '" DOCUMENTCLASS_ID="' + aClassED;
    if(not VarIsNull(aKvrCode)) then
      XML := XML + '" KVR_CODE="' + aKvrCode;
    if(not VarIsNull(aKesrCode)) then
      XML := XML + '" KESR_CODE="' + aKesrCode;
    if(not VarIsNull(aKfsrCode)) then
      XML := XML + '" KFSR_CODE="' + aKfsrCode;
    if(not VarIsNull(aKsdaCode)) then
      XML := XML + '" KSDA_CODE="' + aKsdaCode;
    XML := XML + '"/>';
    XmlDoc.LoadXML(XML);
    XmlDoc.LoadXML(ExecXml(XmlDoc.xml));
    aXmlEDLine.setAttribute(aAnalKindName, XmlDoc.documentElement.getAttribute('CR_ANAL_KIND'));
    aXmlEDLine.setAttribute(aDirectionName, XmlDoc.documentElement.getAttribute('CR_DIRECTION'));
  except
    ExceptionLog('Сбой Fill_CR_DATA_AuBu');
  end;
end;


{------------------------------------------------------------------------------}
begin
end.
