{~IsCheckKBK_NodeSection_By2492
  exchange #2492
  требуется проверка КБК в разделе ZNKBK IK файла.
  перенеся проверку в отдельную функцию выполняется унификация кода.
  результат:
    =true - если раздел aNode называется ZNKBK.}
function IsCheckKBK_NodeSection_By2492( aNode: Variant): boolean;
begin
  Result := (aNode.NodeName = 'ZNKBK');
end;


{~CheckParseSectionZN_By2492
  вызывается при проверке раздела ZN: будет или не будет обрабатываться
  этот раздел в файле IK.
  в рабочем режиме подпрограмма ничего не должна делать.
  в исходном коде до правки #2492 здесь должно быть сообщение в журнал,
  что раздел ZN не обрабатывается.}
procedure CheckParseSectionZN_By2492;
begin
end;


{~ParseSectionZN_By2492
  разбор раздела ZN в файле IK.
  описывается ЭД в XML: описываются предварительные параметры.
  важной особенностью является заполнение атрибута aDoc.CASH=2.
  это указывает создание ЭД по разделу ZN в подпрограмме CreateDocuments
  вызываемой из Answer_Documents.}
procedure ParseSectionZN_By2492( aDoc, aDocXml: Variant);
var
  i: integer;
  xSumma: Variant;
  xDocXmlNode: Variant;
begin

    try
      if VarToStrDef(aDocXml.getAttribute('GUID_FK'), '') = '' then begin
        WriteInfo( 'Не заполнено поле GUID_FK = <'
                    + aDocXml.getAttribute('GUID_FK')
                    + '> для блока ZN', True);
        EXIT;
      end;

      WriteInfo('АЦК: "Заявка на оплату расходов" № ' +
        aDocXml.getAttribute('NOM_ZN') + ' Дата: ' +
        aDocXml.getAttribute('DATE_ZN') + ' Сумма = ' +
        aDocXml.getAttribute('SUMMA_ITOG'), True);

      // exchange #2855
      if NOT CheckIK_ZN_ZNKBK_2855( aDocXml) then EXIT;

      if aDocXml.selectSingleNode('ZNKBK').getAttribute('TYPE_KBK') <> '10'
        then begin
          WriteInfo( 'ЭД не будет создан - ожидается только расходная строка.');
          EXIT;
        end;

      aDoc.setAttribute('DOC_NUMBER', aDocXml.getAttribute('NOM_ZN'));
      aDoc.setAttribute('DOC_DATE', aDocXml.getAttribute('DATE_ZN'));

      // сумму нужно расчитать по строкам, а не брать из поля SUMMA_ITOG
      //aDoc.setAttribute('AMOUNT', aDocXml.getAttribute('SUMMA_ITOG'));
      xSumma := 0;
      for i := 0 to aDocXml.ChildNodes.Length - 1 do begin
        xDocXmlNode := aDocXml.ChildNodes.Item[i];
        xSumma      := xSumma + StrToCurrDef( xDocXmlNode.getAttribute('SUMMA'), 0);
      end;//for//
      aDoc.setAttribute('AMOUNT', Format('%0.2f', [ xSumma]));

      // это внутреннее поле, по которому формируется ЭД
      // используется в подпрограмме CreateDocuments вызванной
      // из Answer_Documents. значение специально заменено на
      // отличное от 0 и 1 для определения, что ЭД нужно создавать
      // из раздела ZN.
      aDoc.setAttribute('CASH', '2');

      aDoc.setAttribute('LS', aDocXml.parentNode.getAttribute('LS_UBP'));
      aDoc.setAttribute('FOREIGN_KEY', aDocXml.getAttribute('GUID_FK'));
      aDoc.setAttribute('class', '11');

      // exchange #2823 - загрузка поля FAIP
      if ExchImport_FAIP_Code( aDocXml.getAttribute( 'FAIP_CODE'), aDoc)
        then Answer_Documents(aDoc, aDocXml, aDocXml.parentNode);
      except
        ExceptionLog( 'Сбой Un_ImpIK_2492.ParseSectionZN_By2492');
    end;

end;


{~CreateDocZN_By2492
  exchange #2492
  добавлено создание ЭД 11го класса из ZN по значению атрибута aDoc.CASH=2.
  прочие значения игнорируются.

  exchange #2866
  добавлен параметр aCfgCreateED5 - создание эд 5го из создаваемого эд aDoc.}
function CreateDocZN_By2492( aDoc, aDocXml, aIK: Variant;
                             aBudgetId: string;
                             aparam_Search_Bo: boolean;
                             aparam_UseGroupBuh25: boolean;
                             aCfgCreateED5: boolean = FALSE): boolean;
begin

    try
      if (VarToStr( aDoc.getAttribute('CASH')) <> '2')
        then Result := FALSE
        else begin
          // exchange #3010
          // список игнорируемых ошибок ацк-ф
          SetIgnoreAzkErrors( ';AZK-1099;1099;');
          try
            if CreateDoc11ZN_By2492( aDoc,
                                      aDocXml,
                                      aIK,
                                      aBudgetId,
                                      aparam_Search_Bo,
                                      aparam_UseGroupBuh25)
              then Exec_ChildDoc( aDoc.getAttribute('BUDGET_ID'),
                                  '',
                                  aDoc,
                                  aCfgCreateED5,
                                  aCfgCreateED5);
            finally
              SetIgnoreAzkErrors( '');
          end;
          Result := TRUE;
        end;
      except
        ExceptionLog( 'Сбой Un_ImpIK_2492.CreateDocZN_By2492');
    end;

end;


{~GetAccountFieldID2862
   exchange 2862
   "Счет" блока "Расходование" ЭД класса 11 заполнять значением поля
   «Счёт для наличных (деб.карты)» карточки лицевого счета,
   указанного в поле «Счет для финансирования».
   Если значение поля пустое, то заполнять значением поля «Счет для наличных»

   параметры:
     aAccID - ид. «Счет для финансирования»

   результат:
     название поля, которое нужно подставить в запрос для получения номера
     и описания счета.
     в результате допускается одно из двух названий полей:
       KEEPERACC_ID или DEBCARDSACC_ID}
function GetAccountFieldID2862( aAccID: string): string;
begin

    try
      if (LENGTH( QueryField( ' select oaa.DEBCARDSACC_ID D'
                             +' from orgaccount oaa where oaa.ID = ?',
                              [ aAccID],
                              'D')) > 0)
        then Result := 'DEBCARDSACC_ID'
        else Result := 'KEEPERACC_ID';

      except
        ExceptionLog( 'Сбой GetAccountFieldID2862');
    end;

end;


{~CreateDoc11ZN
  exchange #2492
  добавлена загрузка ZN из файлов IK: 
  создание ЭД 11-го класса из ZN.
  exchange #2492 - постановка }
function CreateDoc11ZN_By2492( aXmlED11, aXmlZN, aXmlIK: Variant;
                                aBudgetId: string;
                                aParam_Search_Bo: boolean;
                                aParam_UseGroupBuh25: boolean): Boolean;
var
  i: Integer;
  xFio, xDolzhnost: String;
  Est_Kind, Contract_Name, Contract_Number,
  Contract_Date, Payment_Name, Payment_Number, Payment_Date: String;
  XmlOrg, XmlAcc, Permission, Line, Contract: Variant;
  //BO, Condebts: Variant;
  xKbk: Variant;
  xKbkNode: Variant;
  xKbkLine: Variant;
  xXmlOrgID: string;
  xBudgetID: string;
  xDoxXml_ZNKBK: Variant;
  xDocOwnerDoc: Variant;
  xDocXmlNode: Variant;
  xDocLines: Variant;
  xDocLine: Variant;
//  xKbkDS,
  xKbkDE: string;
  xAmount: Variant;
  xContractNode: Variant;
  xORGACCOUNT_ID: string;


  procedure DoCopyPurposefulgrant;
  begin
  
      try
        // код цели - подставляем из КБК поля ADD_CLASS и если не
        // заполнен - автозаполняем по #2389
        xDocLine.setAttribute( 'PURPOSEFULGRANT_ID',
                               xDocXmlNode.GetAttribute('PURPOSEFULGRANT_ID'));
        Exch2389_Update_PURPOSEFULGRANT_ID(
                              xDocLine,   // строка
                              '10',       // расходы
                              xBudgetID,
                              'PURPOSEFULGRANT_ID',
                              '11',          // класс ЭД
                              '');// для расходов тип доходов не указывается
        except
          ExceptionLog( 'Сбой Un_ImpIK_2492.CreateDoc11ZN.DoCopyPurposefulgrant');
      end;
  
  end;

  procedure DoCopySumma;
  var xSumma: Variant;
  begin
  
      try
        // заполнение суммы в строке + расчет общей суммы в строках
        xSumma := StrToCurrDef(xDocXmlNode.getAttribute('SUMMA'), 0);
        xDocLine.setAttribute('AMOUNT', Format('%0.2f', [ xSumma]));
        xAmount := xAmount + xSumma;

        except
          ExceptionLog( 'Сбой Un_ImpIK_2492.CreateDoc11ZN.DoCopySumma');
      end;
  
  end;


  procedure DoSearchBO;
  begin
  
      try
        //Exchange#2218 - поиск договора при авторазборе назначения платежа
        xContractNode := NULL;
        if NOT aParam_Search_Bo
          then WriteLog( 'Автоподстановка бюджетного обязательства не производится '
                        +'(выключен параметр "Автоподстановка бюджетного обязательства")')
          else begin
            WriteLog('Поиск бюджетного обязательства в назначении платежа');
            ParceDescription( xDocXmlNode.getAttribute('PURPOSE'),
                              Contract_Name,
                              Contract_Number,
                              Contract_Date,
                              Payment_Name,
                              Payment_Number,
                              Payment_Date);
            if (Trim(Contract_Name) = '')
                or (Trim(Contract_Number) = '')
                or (Contract_Date = '')
              then WriteInfo('Невозможно распознать реквизиты документа-основания в назначении платежа', True)
              else begin
                // проводим поиск по типу наименования договора
                Contract := GetContract( Contract_Name,
                                         Contract_Number,
                                         Contract_Date,
                                         aBudgetId);
                if Contract.documentElement.childNodes.Length <> 1
                  then WriteInfo(  'Не удалось однозначно определить ЭД "Договор", автоподстановка '
                                  +' бюджетного обязательства не производится')
                  else begin
                    WriteInfo(  'Найден ЭД "Договор" №' + Contract_Number + ' от ' + Contract_Date, True);
                    xContractNode := Contract.documentElement.childNodes.Item[0];
                  end;
              end;
          end;

        except
          ExceptionLog( 'Сбой Un_ImpIK_2492.CreateDoc11ZN.DoSearchBO');
      end;
  
  end;


  procedure DoCopyBO;
  var BO, Condebts: Variant;
  begin
  
      try
        // Exchange#2218 - поиск БО
//              if Contract.documentElement.childNodes.Length = 1 then begin
//                xContractNode := Contract.documentElement.childNodes.Item[0];
        if VarIsNull( xContractNode) then EXIT;

        // проводим поиск БО на основании строки кбк и ранее найденного договора
        BO := GetBoByContractAndKBK( xContractNode, xDocLine);

        if (BO.documentElement.childNodes.Length <> 1)
          then WriteLog('Не найдено бюджетное обязательство для строки')
          else begin
            xDocLine.setAttribute(
                      'BO_ID',
                      BO.documentElement.childNodes.Item[0].getAttribute('ID'));
            // проставляем ссылку на БО только в однострочных ЭД
            if (xDoxXml_ZNKBK.Length = 1)
              then aXmlED11.SetAttribute('BO_ID', xDocLine.getAttribute('BO_ID'));
          end;

        // если стоит галка "Оплата в разрезе выставленых счетов" проводим поиск выставленного счета
        if (xContractNode.getAttribute('PAYABLE') = '1') then begin
          Condebts := GetCondebts( Payment_Name,
                                   Payment_Number,
                                   Payment_Date,
                                   xContractNode.getAttribute('ID'));

          if (Condebts.documentElement.childNodes.Length <> 1)
            then WriteLog('Не найден выставленный счет')
            else begin
              Condebts := Condebts.documentElement.childNodes.Item[0];
              aXmlED11.setAttribute( 'CONDEBTS_ID', Condebts.getAttribute('ID'));
              if (Condebts.getAttribute('ADVMARK') = '1')
                then aXmlED11.SetAttribute('ADVANCE_PAYMENT', 1)
                else aXmlED11.SetAttribute('ADVANCE_PAYMENT', 0);
            end;
        end;
        except
          ExceptionLog( 'Сбой Un_ImpIK_2492.CreateDoc11ZN.DoCopyBO');
      end;
  
  end;


  procedure DoCopyDirection;
  begin
  
      try
        xDocLine.setAttribute('DIRECTION_ID', '');
        //1-Контролировать, 0-нет, 2-запрещать
        if isDirectionAutoFill
             and (isDirectionControl( aXmlED11.getAttribute('DOCUMENTCLASS_ID'),
                                      aXmlED11.getAttribute('EST_KIND')) <> '2')
          then xDocLine.setAttribute( 'DIRECTION_ID',
                                      DirectionAutoFill( xDocLine, xBudgetID));

        except
          ExceptionLog( 'Сбой Un_ImpIK_2492.CreateDoc11ZN.DoCopyDirection');
      end;
  
  end;

begin

    try
      Result := False;

      // сохраняем корневой раздел XML создаваемого ЭД.
      // это понадобится при формировании строк в ЭД.
      xDocOwnerDoc := aXmlED11.ownerDocument;


      // один раз запоминаем ид.бюджета
      xBudgetID := aXmlED11.getAttribute( 'F_BUDGET_ID');


      // exchange #3062 - перенос проверки строк в создание эд
      // проверка выполняется уже после того, как в логе указано
      // какой эд создается.
      if NOT CheckKBK_All_ZNKBK( aXmlZN, xBudgetID)
        then EXIT;

      // определяем раздел ZNKBK.
      // это упростит дальнейший код, чтобы не искать этот узел несколько раз.
      xDoxXml_ZNKBK := aXmlZN.selectSingleNode( 'ZNKBK');


      aXmlED11.setAttribute('action', 'insert');
      aXmlED11.setAttribute('BUDGET_ID', xBudgetID);
      aXmlED11.setAttribute('GUID_FK', aXmlED11.getAttribute('FOREIGN_KEY'));

      // Признак «Заявка от ФК» - Устанавливать признак
      aXmlED11.setAttribute('FK_FLAG', 1);

      // дата документа - в формате YYYY-MM-DD
      // заполняется при обработке раздела ZN из файла (dd.mm.yyyy)
      aXmlED11.setAttribute( 'DOC_DATE',
                        DateTimeToXml(StrToDate(aXmlED11.getAttribute('DOC_DATE'))));

      // Очередность - Согласно параметру «Системные параметры/Платежное
      // поручение/Очередность/Заявка на оплату расходов по счету ЛСФК»
      aXmlED11.setAttribute('QUEUE_KIND', GetQueueKind);
      // Exchange #2239 (взято из ZS)
      // exchange #2703 цифра 6 заменена на 5
      if aXmlED11.getAttribute('QUEUE_KIND') = '='
        then aXmlED11.setAttribute('QUEUE_KIND', '5');

      // Предельная дата исполнения - не заполняется
      aXmlED11.setAttribute('LIMITING_DATE', '');

      // Внешний статус	- Заполняется значением «Не выгружен»
      aXmlED11.setAttribute('EXTSTATUS_ID', 0);

      // получение наличных - галочку ставим
      aXmlED11.setAttribute( 'CASH_INCOME', 1);
      // способ получения наличных - карта
      aXmlED11.setAttribute( 'WAYTOGETCASH', '1');

      // пока сумма в строке =0
      aXmlED11.setAttribute('AMOUNT', 0);

      // Признак платежа в УФК - Заполнять значением «не авансовый»
      aXmlED11.setAttribute('ADVANCE_PAYMENT', 0);

      // символ кассового плана (на форме: символ кассы) - не заполнять
      aXmlED11.setAttribute( 'SYMBCASH_ID', '');

      // exchange #2823 - загрузка поля FAIP
      if NOT ExchImport_FAIP_Code( aXmlZN.getAttribute( 'FAIP_CODE'), aXmlED11)
        then begin
          Result := False;
          Exit;
        end;

      // определяем бюджетополучателя
      aXmlED11.setAttribute('RECIPIENT_ID', '');
      WriteLog('Заполнение данных бюджетополучателя', True);
      if (LENGTH( Trim(aXmlIK.getAttribute('INN_UBP'))) <= 0) then begin
        WriteInfo('Не создан - не определен референс бюджетополучателя');
        Result := False;
        Exit;
      end;

      WriteLog('Поиск референса бюджетополучателя по ИНН и КПП', True);
      XmlOrg := GetOrgByTaxKpp( aXmlIK.getAttribute('INN_UBP'),
                                aXmlIK.getAttribute('KPP_UBP'),
                                '',
                                '',
                                False,
                                aXmlED11);

      // ид.организации - если хоть какая орг.найдена
      // если найдено несколько - берем ид.первой организации
      if (XmlOrg.documentElement.childNodes.Length > 0)
        then xXmlOrgID := XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID')
        else xXmlOrgID := '';

      if not ((XmlOrg.documentElement.childNodes.Length = 1)
                and HasOrgRole( xXmlOrgID, '0')
                and IsActual( xXmlOrgID, xBudgetID)) then begin
        WriteLog('Не удалось найти референс бюджетополучателя по ИНН и КПП. Поиск' +
          ' референса бюджетополучателя по ИНН, КПП и коду организации');
        //Exchange#2093
        XmlOrg := GetOrgByTaxKppBudgIdCode( aXmlIK.getAttribute('INN_UBP'),
                                            aXmlIK.getAttribute('KPP_UBP'),
                                            xBudgetID,
                                            aXmlIK.getAttribute('KOD_UBP_PUBP'),
                                            '0');
      end;

      if (XmlOrg.documentElement.childNodes.Length <> 1) then begin
        WriteInfo('Не создан - не определен референс бюджетополучателя');
        Result := False;
        Exit;
      end;

      XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
      // копируем ид.организации
      xXmlOrgID := XmlOrg.getAttribute('ID');
      WriteLog('Найден бюджетополучатель с референсом: ' + xXmlOrgID);
      aXmlED11.setAttribute( 'RECIPIENT_ID', xXmlOrgID);
      //чтобы не ломать общий поиск разрешения, записываем референс в шапку
      aXmlED11.setAttribute( 'ORG_ID', xXmlOrgID);

      // определяем счет для финансирования
      if aXmlIK.getAttribute('LS_UBP') = '' then begin
        WriteInfo('Не создан - не определен счет для финансирования');
        Result := False;
        Exit;
      end;

      // Счет для финансирования (Номер лицевого счета) aXmlIK.LS_UBP
      // Счет организации-бюджетополучателя должен определяться по
      // алгоритму: номер совпадать с номером в отчете, тип счета 5,
      // без признака «Распорядительный». Ищем счет с галкой «Бюджетный
      xORGACCOUNT_ID := GetLicAcc( xXmlOrgID, '5', aXmlIK.getAttribute('LS_UBP'));
      if (xORGACCOUNT_ID = '') then begin
        WriteInfo('Не создан - не определен референс счета для финансирования');
        Result := False;
        Exit;
      end;
      aXmlED11.setAttribute( 'ORGACCOUNT_ID', xORGACCOUNT_ID);

      // exchange #2977
      // поиск в РЧБ будет с учетом кода цели. если поле ADD_CLASS
      // будет не заполнено - искать с КЦ=0 и заполнять его тоже нулем.
      // копируем значение ид.КЦ из строки файла в строку ЭД, при этом
      // проверяем значение поля.
      // но так же сохраняем поле КЦ как было в исходной стрке, чтобы потом
      // восстановить его обратно. это для того, что строки заполняются по
      // разному, и вернуть нужно еще до заполнения строк
      xDocLine := xDoxXml_ZNKBK.CloneNode( FALSE);
      if (LENGTH( GetNodeAttributeEx( xDocLine, 'PURPOSEFULGRANT_ID')) <= 0)
        then xDocLine.SetAttribute(
                  'PURPOSEFULGRANT_ID',
                  Exch2389_GetPURPOSEFULGRANT_ID_NULL_ByBudget( aBudgetId));

      // определяем бланк расходов
      // ищем единственным вариантом без проверки КИФ. в задании опечатка.
      // КИФ всегда =1 и варианта, когда КИФ=2 и искать бланк расходов по
      // другому - это ошибка в задании.
      aXmlED11.setAttribute( 'ESTIMATE_ID',
                        GetEstimateId_PG( xBudgetID,
                                       xXmlOrgID,
                                       xORGACCOUNT_ID,
                                       //aXmlZN.selectSingleNode('ZNKBK')
                                       xDocLine));
      if aXmlED11.getAttribute('ESTIMATE_ID') = '' then begin
        WriteInfo('Не создан - не определен бланк расходов плательщика');
        Result := False;

        Exit;
      end;

      // Дата поступления - не заполняется
      aXmlED11.setAttribute( 'DATE_DELIVERY', '');

      { Закладка «Ответственные лица и чек»
        Для убыстрения обработки отчета заполняется по следующему механизму
        (без учета настройки системных параметров/УФК/Заполнение/Ответственные
        лица): Смотрим организацию-владельца бланка расходов, заполняем с ее
        закладки «Ответственные лица» }
      // ФИО и должность руководителя – ФИО и должность с кодом -2
      GetRespersonEx( xXmlOrgID, '-2', xFio, xDolzhnost);
      aXmlED11.setAttribute( 'CHEQUE_FIO_BOSS_STR' , xFio);
      aXmlED11.setAttribute( 'CHEQUE_BOSS_POST'    , xDolzhnost);
      // ФИО и должность гл. бухгалтера – ФИО и должность с кодом -3
      GetRespersonEx( xXmlOrgID, '-3', xFio, xDolzhnost);
      aXmlED11.setAttribute( 'CHEQUE_FIO_BUHGALT_STR'  , xFio);
      aXmlED11.setAttribute( 'CHEQUE_BUHGALT_POST'     , xDolzhnost);
      // Дата подписания - заполнять датой документа
      aXmlED11.setAttribute( 'RESPPERSON_SIG_DATE', aXmlED11.GetAttribute( 'DOC_DATE'));


      { Блок «Чек»
        ФИО доверенного лица -	Не заполнять
        Должность доверенного лица- Не заполнять
        Наименование документа- Не заполнять
        Номер документа - Не заполнять
        Организация, выдавшая документ - Не заполнять
        поэтому эти поля вообще не трогаем.}

      // заполнение реквизитов чека
      // Номер чека	-	Не заполнять
      aXmlED11.setAttribute( 'CHEQUE_NUM', '');
      // Серия чека - Не заполнять
      aXmlED11.setAttribute( 'CHEQUE_SER', '');

      // Дата чека - Не заполнять
      aXmlED11.setAttribute( 'CHEQUE_DATE', '');

      // Срок действия чека	-	Не заполнять
      aXmlED11.setAttribute( 'CHEQUE_ENDURANCE_DATE', '');

      // номер карты
      aXmlED11.setAttribute( 'CARD_NUMBER',
                        VarToStr( aXmlZN.getAttribute( 'CARD_NUM')));

      // заполнение блока "Расходование"
      WriteLog('Заполнение данных получателя', True);

      //поиск референса получателя
      WriteLog('Поиск референса получателя и референса счета получателя', True);
//      XmlOrg := GetOrgByCashAcc(aXmlED11.getAttribute('ORGACCOUNT_ID'));
      // exchange 2862
      // "Счет" блока "Расходование" ЭД класса 11 заполнять значением поля
      // «Счёт для наличных (деб.карты)» карточки лицевого счета,
      // указанного в поле «Счет для финансирования».
      // Если значение поля пустое, то заполнять значением поля
      // «Счет для наличных»
      // в данном случае запрос поиска орг. взят из функции GetOrgByCashAcc
      // но поле счета для связки будет получено из функции GetAccountFieldID2862.
      XmlOrg := QueryXml(  ' Select O.Taxcode, O.Kpp, O.Id Org_Id,'
                          +' O.Description Org_Description,'
                          +' KeeperAcc.Id Account_Id, KeeperAcc.Account_Number,'
                          +' B.Id Bank_Id, B.Bic, B.Coraccount,'
                          +' B.Description Bank_Description'
                          +' From OrgAccount Oa'
                          +' Join OrgAccount KeeperAcc on'
                          +' Oa.' + GetAccountFieldID2862( xORGACCOUNT_ID)
                          +' = KeeperAcc.Id'
                          +' Join Org O on O.Id = KeeperAcc.Org_Id'
                          +' Join Bank B On B.Id = KeeperAcc.Bank_Id'
                          +' Where Oa.Id = ?',
                           [ xORGACCOUNT_ID]);
      if (XmlOrg.documentElement.childNodes.Length <> 1) then begin
        WriteInfo('Не создан - не определен "Счет для наличных" в карточке счета для финансирования');
        Result := False;
        Exit;
      end;
      XmlOrg := XmlOrg.documentElement.childNodes.Item[0];

      WriteLog('Найден получатель с референсом: ' + XmlOrg.getAttribute('ORG_ID'));

      aXmlED11.setAttribute('REC_TAXCODE'  , XmlOrg.getAttribute('TAXCODE'));
      aXmlED11.setAttribute('REC_KPP'      , XmlOrg.getAttribute('KPP'));
      aXmlED11.setAttribute('REC_NAME'     , XmlOrg.getAttribute('ORG_DESCRIPTION'));
      aXmlED11.setAttribute('REC_ID'       , XmlOrg.getAttribute('ORG_ID'));

      // заполняем поля по счету блока расходования
      WriteLog('Найден счет получателя с референсом: ' + XmlOrg.getAttribute('ACCOUNT_ID'));
      aXmlED11.setAttribute('REC_ACCOUNT'    , XmlOrg.getAttribute('ACCOUNT_NUMBER'));
      aXmlED11.setAttribute('REC_ACC_ID'     , XmlOrg.getAttribute('ACCOUNT_ID'));
      aXmlED11.setAttribute('REC_BIC'        , XmlOrg.getAttribute('BIC'));
      aXmlED11.setAttribute('REC_B_NAME'     , XmlOrg.getAttribute('BANK_DESCRIPTION'));
      aXmlED11.setAttribute('REC_CORACCOUNT' , XmlOrg.getAttribute('CORACCOUNT'));

      //Определяем тип бланка расходов
      Est_Kind := 'EST_KIND'
                   + QueryField( 'Select EstKind_Id From Estimate Where Id = ?',
                                 [ aXmlED11.getAttribute('ESTIMATE_ID')],
                                 'ESTKIND_ID');

      aXmlED11.setAttribute('EST_KIND', Est_Kind);

      // ГРБС в начале заполняем по полю гл.администратора, а название не
      // заполняем - на случай, если код в справочнике не найдем.
      aXmlED11.setAttribute('CODE_GRBS', xDoxXml_ZNKBK.getAttribute('KADMR_CODE'));
      aXmlED11.setAttribute('ORG_GRBS', '');
      // затем запрашиваем ведомственный классификатор расходов,
      // для получения всех кодов по коду гл.администратора из КБК
      // для указанного бюджета (из ЭД). тут запрашиваются все строки
      // для указанного кода. ищем среди них ту строку, у которой дата
      // импорта (текущая дата операции) входит в интервал начала-окончания.
      // в результате ищем подходящий узел (любой)
      xKbk := QueryXml( ' Select Kl.* From Kadm_lines Kl '
                      +' Left Join kadm K on K.Id = Kl.master_id'
                      +' Where Kl.Budget_Id = ? and K.Code = ? '
                      +' order by Kl.Begin_Date desc',
                       [ xBudgetID,
                         xDoxXml_ZNKBK.getAttribute('KADMR_CODE')]);
      xKbk := xKbk.ChildNodes.Item[0];
      if (xKbk.ChildNodes.Length > 0) then begin
        // если интервала не найдем, или будет только одна строка
        // берем эту строку.
        xKbkLine := xKbk.ChildNodes.item[0];
        if (xKbk.ChildNodes.Length > 1) then
          for i := 0 to xKbk.ChildNodes.Length -1 do begin
            xKbkNode  := xKbk.ChildNodes.item[i];
//              xKbkDS    := xKbkNode.GetAttribute('BEGIN_DATE')
            xKbkDE    := xKbkNode.GetAttribute('END_DATE');
            // если начало периода не указано - такого в принципе
            // не должно быть, поэтому это условие не проверяем.
{
            if (LENGTH( xKbkDS) <= 0) then begin
              // проверяем окончание периода. если не указано - открытый
              // интервал - удовлетворяет поиску
              if (LENGTH( xKbkDE) <= 0)
                then xKbkLine := xKbkNode
                else
                  // если дата окончания известна - она должна быть больще
                  // текущей даты
                  if ( Work_Date <= XmlToDateTime( xKbkDE))
                    then xKbkLine := xKbkNode;
            end else
}
            // начало интервала больше текущей даты или нет?
            // если больше, дату окончания проверять безсмысленно
            if ( Work_Date <= XmlToDateTime( xKbkNode.GetAttribute('BEGIN_DATE'))) then
              if (LENGTH( xKbkDE) <= 0)
                then xKbkLine := xKbkNode
                else
                  // если дата окончания известна - она должна быть больще
                  // текущей даты
                  if ( Work_Date <= XmlToDateTime( xKbkDE))
                    then xKbkLine := xKbkNode;
          end;//for//
        // название кода - строка будет найдена железно!
        aXmlED11.setAttribute( 'ORG_GRBS', xKbkLine.getAttribute('DESCRIPTION'));
      end;
{
            if (xKbkNode.GetAttribute('END_DATE')
            if Kbk.getAttribute('END_DATE') = '' then
              aXmlED11.setAttribute('ORG_GRBS', Kbk.getAttribute('DESCRIPTION'))
            else if (Work_Date >= XmlToDateTime(Kbk.getAttribute('BEGIN_DATE'))) and
              (Work_Date <= XmlToDateTime(Kbk.getAttribute('END_DATE'))) then
              aXmlED11.setAttribute('ORG_GRBS', Kbk.getAttribute('DESCRIPTION'));
            Kbk := Kbk.parentNode;
          end;
          if aXmlED11.getAttribute('ORG_GRBS') = '' then
            aXmlED11.setAttribute('ORG_GRBS', Kbk.selectSingleNode('ROW').getAttribute('DESCRIPTION'));
        end;
        }

      // сумма в шапке ЭД
      // так делаем, чтобы упростить понимание формирования строк.
      // строки формируем так: если сработает формирование строк по разрешениям,
      // в конце формирования строк выполняем выход методом EXIT.
      // второй алгоритм выполняется вслед за первым.
      // тем самым отсутствует длинный IF THEN ELSE. вместо него будет IF-THEN.
      xAmount := 0;

      // строки ЭД
      xDocLines := aXmlED11.appendChild( xDocOwnerDoc.createElement('LINES'));

      try
        //ищем разрешение и его строку по расходной классифкации(по первой строке)
        //если нашли, при создании будем проверять каждую строку
        Permission := GetPermissionRash(aXmlED11, xDoxXml_ZNKBK, True);
        //Exchange #1997
        //Ищем разрешение с учетом групп по бухгалтерии
        if VarIsNull(Permission) and aParam_UseGroupBuh25
          then Permission := GetPermissionRashUseGroupBuh(aXmlED11, xDoxXml_ZNKBK, True);
        if not VarIsNull(Permission) then begin
//          aXmlED11 := aXmlED11.appendChild(aXmlED11.ownerDocument.createElement('LINES'));
          for i := 0 to aXmlZN.ChildNodes.Length - 1 do begin
            xDocXmlNode := aXmlZN.ChildNodes.Item[i];
            //ищем разрешение для данной строки
            if xDocXmlNode.NodeName = 'ZNKBK' then begin
              Permission := GetPermissionRash(aXmlED11{.parentNode}, xDocXmlNode, True);
              if VarIsNull(Permission) then begin
                if NOT aParam_UseGroupBuh25 then begin
                  WriteInfo('Не создан - не определено разрешение на открытие лс');
//                  aXmlZN := aXmlZN.parentNode.parentNode;
                  Exit;
                end;
                Permission := GetPermissionRashUseGroupBuh(aXmlED11{.parentNode}, xDocXmlNode, True);
                if VarIsNull(Permission) then begin
                  WriteInfo('Не создан - не определено разрешение на открытие лс');
//                    aXmlZN := aXmlZN.parentNode.parentNode;
                  Exit;
                end;
              end;
//              aXmlED11 := aXmlED11.appendChild(aXmlED11.ownerDocument.createElement('LINE'));
              xDocLine := xDocLines.appendChild( xDocOwnerDoc.createElement('LINE'));

              xDocLine.setAttribute('DOCUMENTCLASS_ID', aXmlED11.getAttribute('class'));
              xDocLine.setAttribute('RECIPIENT_ID', Permission.getAttribute('RECIPIENT_ID'));
              xDocLine.setAttribute('ESTIMATE_ID', aXmlED11.getAttribute('ESTIMATE_ID'));
              xDocLine.setAttribute('ORGACCOUNT_ID', aXmlED11.getAttribute('ORGACCOUNT_ID'));
              xDocLine.setAttribute('QUEUE_KIND',aXmlED11.getAttribute('QUEUE_KIND'));
              xDocLine.setAttribute('SYMBCASH_ID', aXmlED11.getAttribute('SYMBCASH_ID'));
              xDocLine.setAttribute('FK_FLAG',aXmlED11.getAttribute('FK_FLAG'));
              xDocLine.setAttribute('CHEQUE_FIO_BOSS_STR', aXmlED11.getAttribute('CHEQUE_FIO_BOSS_STR'));
              xDocLine.setAttribute('CHEQUE_BOSS_POST', aXmlED11.getAttribute('CHEQUE_BOSS_POST'));
              xDocLine.setAttribute('CHEQUE_FIO_BUHGALT_STR', aXmlED11.getAttribute('CHEQUE_FIO_BUHGALT_STR'));
              xDocLine.setAttribute('CHEQUE_BUHGALT_POST', aXmlED11.getAttribute('CHEQUE_BUHGALT_POST'));

              DoCopySumma;
{
              // заполнение суммы в строке + расчет общей суммы в строках
              xSumma := StrToCurrDef(xDocXmlNode.getAttribute('SUMMA'), 0);
              xDocLine.setAttribute('AMOUNT', Format('%0.2f', [ xSumma]));
              xAmount := xAmount + xSumma;
{                aXmlED11.setAttribute('AMOUNT',
                StrToCurrDef(aXmlED11.getAttribute('AMOUNT'), 0) +
                StrToCurrDef(xDocLine.getAttribute('AMOUNT'), 0));}
              xDocLine.setAttribute('DESCRIPTION_LINES', xDocXmlNode.getAttribute('PURPOSE'));

              //Exchange#2218 - поиск договора при авторазборе назначения платежа
              DoSearchBO;
{
              xContractNode := NULL;
              if NOT param_Search_Bo
                then WriteLog( 'Автоподстановка бюджетного обязательства не производится '
                              +'(выключен параметр "Автоподстановка бюджетного обязательства")')
                else begin
                  WriteLog('Поиск бюджетного обязательства в назначении платежа');
                  ParceDescription( xDocXmlNode.getAttribute('PURPOSE'),
                                    Contract_Name,
                                    Contract_Number,
                                    Contract_Date,
                                    Payment_Name,
                                    Payment_Number,
                                    Payment_Date);
                  if (Trim(Contract_Name) = '')
                      or (Trim(Contract_Number) = '')
                      or (Contract_Date = '')
                    then WriteInfo('Невозможно распознать реквизиты документа-основания в назначении платежа', True)
                    else begin
                      // проводим поиск по типу наименования договора
                      Contract := GetContract( Contract_Name,
                                               Contract_Number,
                                               Contract_Date,
                                               BudgetId);
                      if Contract.documentElement.childNodes.Length <> 1
                        then WriteInfo(  'Не удалось однозначно определить ЭД "Договор", автоподстановка '
                                        +' бюджетного обязательства не производится')
                        else begin
                          WriteInfo(  'Найден ЭД "Договор" №' + Contract_Number + ' от ' + Contract_Date, True);
                          xContractNode := Contract.documentElement.childNodes.Item[0];
                        end;
                    end;
                end;
}
              xDocLine.setAttribute('NOTE', xDocXmlNode.getAttribute('NOTE'));
              xDocLine.setAttribute('KFSR_CODE', xDocXmlNode.getAttribute('KFSR_CODE'));
              xDocLine.setAttribute('KCSR_CODE', xDocXmlNode.getAttribute('KCSR_CODE'));
              xDocLine.setAttribute('KVR_CODE', xDocXmlNode.getAttribute('KVR_CODE'));
            // exchange #3062 - отмена косгу
//              xDocLine.setAttribute('KESR_CODE', xDocXmlNode.getAttribute('KESR_CODE'));
              xDocLine.setAttribute('KADMR_CODE', xDocXmlNode.getAttribute('KADMR_CODE'));
              xDocLine.setAttribute('FSR_ID', Permission.getAttribute('FSR_ID'));
              xDocLine.setAttribute('KDF_CODE', Permission.getAttribute('KDF_CODE'));
              xDocLine.setAttribute('KDE_CODE', Permission.getAttribute('KDE_CODE'));
              xDocLine.setAttribute('KDR_CODE', Permission.getAttribute('KDR_CODE'));
              xDocLine.setAttribute('ANAL_KIND', xDocXmlNode.getAttribute('ANAL_KIND'));

{              // код цели - подставляем из КБК поля ADD_CLASS и если не
              // заполнен - автозаполняем по #2389
              xDocLine.setAttribute( 'PURPOSEFULGRANT_ID',
                                     xDocXmlNode.GetAttribute('PURPOSEFULGRANT_ID'));
              Exch2389_Update_PURPOSEFULGRANT_ID( xDocLine,   // строка
                                                  '10',       // расходы
                                                  xBudgetID,
                                                  'PURPOSEFULGRANT_ID',
                                                  '11');          // класс ЭД
}

{
              xDocLine.setAttribute('DIRECTION_ID', '');
              //1-Контролировать, 0-нет, 2-запрещать
              if isDirectionAutoFill
                  and (isDirectionControl( xDocLine.getAttribute('DOCUMENTCLASS_ID'),
                                           aXmlED11.getAttribute('EST_KIND')) <> '2')
                then xDocLine.setAttribute(
                              'DIRECTION_ID',
                              DirectionAutoFill( xDocLine, xBudgetID));
}
              xDocLine.setAttribute('PERMISSIONLINE_ID', Permission.getAttribute('PERMISSIONLINE_ID'));
              xDocLine.setAttribute('FUNDSOURCE_ID', Permission.getAttribute('FUNDSOURCE_ID'));

              // Exchange#2218 - поиск БО
              DoCopyBO;

              // код цели необходимо заполнять в самую последнюю очередь,
              // поскольку для этой операции используются поля КБК, доп.код
              // и др.параметры строки
              DoCopyPurposefulgrant;

              // exchange #2921
              // поле код цели нужно заполнять перед заполнением поля РО
              DoCopyDirection;

{
//              if Contract.documentElement.childNodes.Length = 1 then begin
//                xContractNode := Contract.documentElement.childNodes.Item[0];
              if NOT VarIsNull( xContractNode) then begin
                // проводим поиск БО на основании строки кбк и ранее найденного договора
                BO := GetBoByContractAndKBK( xContractNode, xDocLine);
                if (BO.documentElement.childNodes.Length <> 1)
                  then WriteLog('Не найдено бюджетное обязательство для строки')
                  else begin
                    xDocLine.setAttribute('BO_ID', BO.documentElement.childNodes.Item[0].getAttribute('ID'));
                    // проставляем ссылку на БО только в однострочных ЭД
                    if (xDoxXml_ZNKBK.Length = 1)
                      then aXmlED11.SetAttribute('BO_ID', xDocLine.getAttribute('BO_ID'));
                  end;

                // если стоит галка "Оплата в разрезе выставленых счетов" проводим поиск выставленного счета
                if (xContractNode.getAttribute('PAYABLE') = '1') then begin
                  Condebts := GetCondebts( Payment_Name,
                                           Payment_Number,
                                           Payment_Date,
                                           xContractNode.getAttribute('ID'));
                  if (Condebts.documentElement.childNodes.Length <> 1)
                    then WriteLog('Не найден выставленный счет')
                    else begin
                      Condebts := Condebts.documentElement.childNodes.Item[0];
                      aXmlED11.setAttribute( 'CONDEBTS_ID', Condebts.getAttribute('ID'));
                      if (Condebts.getAttribute('ADVMARK') = '1')
                        then aXmlED11.SetAttribute('ADVANCE_PAYMENT', 1)
                        else aXmlED11.SetAttribute('ADVANCE_PAYMENT', 0);
                    end;
                end;
              end;
}
//              aXmlED11 := aXmlED11.parentNode;
            end;
//            aXmlZN := aXmlZN.parentNode;
          end;//for//
          // завершение алгоритма формирвоания строк с проверкой разрешений.
          Result := True;
          EXIT;
        end;

        // создаем ЗОР без разрешения для КИФ=1
//        aXmlED11 := aXmlED11.appendChild(aXmlED11.ownerDocument.createElement('LINES'));
        for i := 0 to aXmlZN.ChildNodes.Length - 1 do begin
          xDocXmlNode := aXmlZN.ChildNodes.Item[i];
          if xDocXmlNode.NodeName = 'ZNKBK' then begin

//            aXmlED11 := aXmlED11.appendChild(aXmlED11.ownerDocument.createElement('LINE'));
            xDocLine := xDocLines.appendChild( xDocOwnerDoc.createElement('LINE'));

            xDocLine.setAttribute('DOCUMENTCLASS_ID', aXmlED11.getAttribute('class'));
            xDocLine.setAttribute('ESTIMATE_ID', aXmlED11.getAttribute('ESTIMATE_ID'));
            xDocLine.setAttribute('ORGACCOUNT_ID', aXmlED11.getAttribute('ORGACCOUNT_ID'));
            xDocLine.setAttribute('RECIPIENT_ID', aXmlED11.getAttribute('RECIPIENT_ID'));
            xDocLine.setAttribute('QUEUE_KIND',aXmlED11.getAttribute('QUEUE_KIND'));
            xDocLine.setAttribute('SYMBCASH_ID', aXmlED11.getAttribute('SYMBCASH_ID'));
            xDocLine.setAttribute('FK_FLAG',aXmlED11.getAttribute('FK_FLAG'));
            xDocLine.setAttribute('CHEQUE_FIO_BOSS_STR', aXmlED11.getAttribute('CHEQUE_FIO_BOSS_STR'));
            xDocLine.setAttribute('CHEQUE_BOSS_POST', aXmlED11.getAttribute('CHEQUE_BOSS_POST'));
            xDocLine.setAttribute('CHEQUE_FIO_BUHGALT_STR', aXmlED11.getAttribute('CHEQUE_FIO_BUHGALT_STR'));
            xDocLine.setAttribute('CHEQUE_BUHGALT_POST', aXmlED11.getAttribute('CHEQUE_BUHGALT_POST'));

//            DoCopyPurposefulgrant;
            DoCopySumma;
{
            // заполнение суммы в строке + расчет общей суммы в строках
            xSumma := StrToCurrDef(xDocXmlNode.getAttribute('SUMMA'), 0);
            xDocLine.setAttribute('AMOUNT', Format('%0.2f', [ xSumma]));
            xAmount := xAmount + xSumma;
            }
{
            xDocLine.setAttribute('AMOUNT', Format('%0.2f', [StrToCurrDef(aXmlZN.getAttribute('SUMR_KBK'), 0)]));
            aXmlED11.parentNode.parentNode.setAttribute('AMOUNT',
              StrToCurrDef(aXmlED11.parentNode.parentNode.getAttribute('AMOUNT'), 0) +
              StrToCurrDef(aXmlED11.getAttribute('AMOUNT'), 0));
}
            xDocLine.setAttribute('DESCRIPTION_LINES', xDocXmlNode.getAttribute('PURPOSE'));

            //Exchange#2218 - поиск договора при авторазборе назначения платежа
            DoSearchBO;
{
            xContractNode := NULL;
            if NOT param_Search_Bo
              then WriteLog( 'Автоподстановка бюджетного обязательства не производится '
                            +'(выключен параметр "Автоподстановка бюджетного обязательства")')
              else begin
                WriteLog('Поиск бюджетного обязательства в назначении платежа');
                ParceDescription(aXmlZN.getAttribute('PURPOSE'), Contract_Name, Contract_Number,
                  Contract_Date, Payment_Name, Payment_Number, Payment_Date);
                if (Trim(Contract_Name) = '') or (Trim(Contract_Number) = '') or (Contract_Date = '')
                  then WriteInfo('Невозможно распознать реквизиты документа-основания в назначении платежа', True)
                  else begin
                    // проводим поиск по типу наименования договора
                    Contract := GetContract(Contract_Name, Contract_Number, Contract_Date, BudgetId);
                    if Contract.documentElement.childNodes.Length <> 1
                      then WriteInfo( 'Не удалось однозначно определить ЭД "Договор", '
                                      +'автоподстановка бюджетного обязательства не производится')
                      else begin
                        WriteInfo('Найден ЭД "Договор" №' + Contract_Number + ' от ' + Contract_Date, True);
                        xContractNode := Contract.documentElement.childNodes.Item[0];
                      end;
                  end;
              end;
}
            xDocLine.setAttribute('NOTE', xDocXmlNode.getAttribute('NOTE'));
            xDocLine.setAttribute('KFSR_CODE', xDocXmlNode.getAttribute('KFSR_CODE'));
            xDocLine.setAttribute('KCSR_CODE', xDocXmlNode.getAttribute('KCSR_CODE'));
            xDocLine.setAttribute('KVR_CODE', xDocXmlNode.getAttribute('KVR_CODE'));
            // exchange #3062 - отмена косгу
            //xDocLine.setAttribute('KESR_CODE', xDocXmlNode.getAttribute('KESR_CODE'));
            xDocLine.setAttribute('KADMR_CODE', xDocXmlNode.getAttribute('KADMR_CODE'));
            xDocLine.setAttribute('ANAL_KIND', xDocXmlNode.getAttribute('ANAL_KIND'));
{
            // exchange #2449
            // для решения задачи проверки строки с кодом цели, ножно в начале
            // заполнить код цели в строке - перенос кода сюда.
            aXmlED11.setAttribute('PURPOSEFULGRANT_ID', xDocXmlNode.getAttribute('PURPOSEFULGRANT_ID'));
{
            if (aXmlZN.getAttribute('PURPOSEFULGRANT_ID') = '') and
              (isPurposeFulgrantAutoFill('11', Est_Kind)) then
              aXmlED11.setAttribute('PURPOSEFULGRANT_ID', PurposeFulgrantAutoFill(aXmlZN,
                aXmlED11.parentNode.parentNode.getAttribute('BUDGET_ID')));
}
            // exchange #2977
            // поиск в РЧБ будет с учетом кода цели. если поле ADD_CLASS
            // будет не заполнено - искать с КЦ=0 и заполнять его тоже нулем.
            // копируем значение ид.КЦ из строки файла в строку ЭД, при этом
            // проверяем значение поля.
            if (LENGTH( CopyNodeAttributeEx(
                                xDocLine, 'PURPOSEFULGRANT_ID',
                                xDocXmlNode, 'PURPOSEFULGRANT_ID')) <= 0)
              then xDocLine.SetAttribute(
                        'PURPOSEFULGRANT_ID',
                        Exch2389_GetPURPOSEFULGRANT_ID_NULL_ByBudget( aBudgetId));

            // Exchange#2143
            Line := GetLineExpbudget( xDocLine, xBudgetID);
            if (Line.documentElement.childNodes.Length = 1) then begin
              Line := Line.documentElement.childNodes.item[0];
              xDocLine.setAttribute('KDF_CODE', Line.getAttribute('KDF_CODE'));
              xDocLine.setAttribute('KDE_CODE', Line.getAttribute('KDE_CODE'));
              xDocLine.setAttribute('KDR_CODE', Line.getAttribute('KDR_CODE'));
              xDocLine.setAttribute('FSR_ID', Line.getAttribute('FSR_ID'));
            end else begin
              xDocLine.setAttribute('KDF_CODE', xDocXmlNode.getAttribute('KDF_CODE'));
              xDocLine.setAttribute('KDE_CODE', xDocXmlNode.getAttribute('KDE_CODE'));
              xDocLine.setAttribute('KDR_CODE', xDocXmlNode.getAttribute('KDR_CODE'));
              xDocLine.setAttribute('FSR_ID', xDocXmlNode.getAttribute('FSR_ID'));
            end;

//            xDocLine.setAttribute('FSR_ID', '1');
{
            aXmlED11.setAttribute('PURPOSEFULGRANT_ID', aXmlZN.getAttribute('PURPOSEFULGRANT_ID'));
            if (aXmlZN.getAttribute('PURPOSEFULGRANT_ID') = '') and
              (isPurposeFulgrantAutoFill('11', Est_Kind)) then
              aXmlED11.setAttribute('PURPOSEFULGRANT_ID', PurposeFulgrantAutoFill(aXmlZN,
                aXmlED11.parentNode.parentNode.getAttribute('BUDGET_ID')));
}
{
            aXmlED11.setAttribute('DIRECTION_ID', '');
            //1-Контролировать, 0-нет, 2-запрещать
            if isDirectionAutoFill
                 and (isDirectionControl( aXmlED11.getAttribute('DOCUMENTCLASS_ID'),
                                          aXmlED11.getAttribute('EST_KIND')) <> '2')
              then xDocLine.setAttribute( 'DIRECTION_ID',
                                          DirectionAutoFill( xDocLine, xBudgetID));
}
            // Exchange#2218 - поиск БО
            DoCopyBO;

            // код цели необходимо заполнять в самую последнюю очередь,
            // поскольку для этой операции используются поля КБК, доп.код
            // и др.параметры строки
            // exchange #2977
            // поиск в РЧБ будет с учетом кода цели. если поле ADD_CLASS
            // будет не заполнено - искать с КЦ=0 и заполнять его тоже нулем.
            // алгоритм заполнения КЦ перенесен выше - перед поиском в РЧБ
            //DoCopyPurposefulgrant;

            // exchange #2921
            // поле код цели нужно заполнять перед заполнением поля РО
            DoCopyDirection;
{
//            if Contract.documentElement.childNodes.Length = 1 then
            if NOT VarIsNull( xContractNode) then begin
//              xContractNode := Contract.documentElement.childNodes.Item[0];
              // проводим поиск БО на основании строки кбк и ранее найденного договора
              BO := GetBoByContractAndKBK( xContractNode, xDocLine);
              if BO.documentElement.childNodes.Length = 1 then
              begin
                aXmlED11.setAttribute('BO_ID', BO.documentElement.childNodes.Item[0].getAttribute('ID'));
                // проставляем ссылку на БО только в однострочных ЭД
                if aXmlZN.parentNode.selectNodes('ZSCH2').Length = 1 then
                  aXmlED11.parentNode.parentNode.setAttribute('BO_ID', aXmlED11.getAttribute('BO_ID'));
              end
              else
                WriteLog('Не найдено бюджетное обязательство для строки');
              // если стоит галка "Оплата в разрезе выставленых счетов" проводим поиск выставленного счета
              if Contract.documentElement.childNodes.Item[0].getAttribute('PAYABLE') = 1 then
              begin
                Condebts := GetCondebts(Payment_Name, Payment_Number, Payment_Date,
                  Contract.documentElement.childNodes.Item[0].getAttribute('ID'));
                if Condebts.documentElement.childNodes.Length = 1 then
                begin
                  Condebts := Condebts.documentElement.childNodes.Item[0];
                  aXmlED11.parentNode.parentNode.setAttribute('CONDEBTS_ID', Condebts.getAttribute('ID'));
                  if Condebts.getAttribute('ADVMARK') = 1 then
                    aXmlED11.parentNode.parentNode.setAttribute('ADVANCE_PAYMENT', 1)
                  else
                    aXmlED11.parentNode.parentNode.setAttribute('ADVANCE_PAYMENT', 0);
                end
                else
                  WriteLog('Не найден выставленный счет');
              end;
            end;
            }
//            aXmlED11 := aXmlED11.parentNode;

          end;
//          aXmlZN := aXmlZN.parentNode;
        end;//for//
        Result := True;
//      end;
//        end;
        finally
          if Result then begin
            aXmlED11.SetAttribute('AMOUNT', TRIM( Format('%0.2f', [ xAmount])));
            aXmlED11 := aXmlED11.ownerDocument;
          end;
//            aXmlED11.parentNode.setAttribute('AMOUNT', Format('%0.2f',
//        [StrToCurrDef(aXmlED11.parentNode.getAttribute('AMOUNT'), 0)]));
      end;
//      finally
//      end;
//      aXmlZN := aXmlZN.ownerDocument.documentElement;


      except
        ExceptionLog( 'Сбой Un_ImpIK_2492.CreateDoc11ZN_By2492');
    end;

end;


begin
end.
