{~CreateDoc11
  создает документ 11 класса на основе данных файла IK.ZR

  aXmlED11 - описание создаваемого эд 11го
  aXmlZR - узел из входного файла

  результат:
    =true - эд aXmlED11 создан
    =false - эд aXmlED11 не создан.

  exchange #3062
    перенос функционала проверки кбк в строках сюда.}
function CreateDoc11(aXmlED11, aXmlZR, aXmlIK: Variant): Boolean;
var
  i: Integer;
  Fio, Dolzhnost, Est_Kind, Contract_Name, Contract_Number,
  Contract_Date, Payment_Name, Payment_Number, Payment_Date: String;
  XmlOrg, XmlAcc, Permission, Kbk, Line, Contract, BO, Condebts: Variant;
  xFound_REC_ACCOUNT: boolean;
  xFoundBP: string;
  xBudgetID: string;
begin

    try
      Result := False;

      xBudgetID := aXmlED11.getAttribute('F_BUDGET_ID');

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

      aXmlED11.setAttribute('action', 'insert');
      aXmlED11.setAttribute('BUDGET_ID', xBudgetID);
      aXmlED11.setAttribute('GUID_FK', aXmlED11.getAttribute('FOREIGN_KEY'));
      aXmlED11.setAttribute('DOC_DATE', DateTimeToXml(StrToDate(aXmlED11.getAttribute('DOC_DATE'))));
      aXmlED11.setAttribute('SIGN_VOLUME', aXmlZR.getAttribute('TYPE'));
      // заполняем блок "для ПП"
      aXmlED11.setAttribute('TAXCODE_PP', aXmlZR.getAttribute('INN_UBP'));
      aXmlED11.setAttribute('KPP_PP', aXmlZR.getAttribute('KPP_UBP'));
      if aXmlZR.getAttribute('ORDER_PL') <> '0' then
        aXmlED11.setAttribute('QUEUE_KIND', aXmlZR.getAttribute('ORDER_PL'))
      else
        aXmlED11.setAttribute('QUEUE_KIND', GetQueueKind);

      // заполнение вида операции
      // во входном файле этого нет, но это поле обязательное.
      // по согласованию с АО (04/01/2013) допускается заполнять значением =1.
      // в АЦК-финансы контроль этого поля отключается в "системные параметры/
      // платежное поручение/вид платежа и операции" в параметре "вид операции"
      // пункт "заявка на оплату расходов". если контроль включен, то при создании
      // ЭД трубется заполнение поля "вид операции".
      aXmlED11.SetAttribute('BANKOPER_ID', '1');

      // Exchange #2239
      // exchange #2703 цифра 6 заменена на 5
      if aXmlED11.getAttribute('QUEUE_KIND') = '='
        then aXmlED11.setAttribute('QUEUE_KIND', '5');

      aXmlED11.setAttribute('LIMITING_DATE', aXmlZR.getAttribute('DATE_ISP'));
      if aXmlED11.getAttribute('LIMITING_DATE') <> '' then
        aXmlED11.setAttribute('LIMITING_DATE',
          DateTimeToXml(StrToDate(aXmlED11.getAttribute('LIMITING_DATE'))));
      aXmlED11.setAttribute('EXTSTATUS_ID', 0);
      aXmlED11.setAttribute('FK_FLAG', 1);
      aXmlED11.setAttribute('AMOUNT', 0);
      aXmlED11.setAttribute('PAYKIND', PayKindSetAsAzk(aXmlZR.getAttribute('VID_PL')));
      aXmlED11.setAttribute('ADVANCE_PAYMENT', aXmlZR.getAttribute('TYPE_AP'));

      // заполнение блока "Расходование"
      // exchange #2824
      // поиск получателя перенесен до поиска бюджеторолучателя, чтобы при поиске
      // бланка расходов использовать организацию из блока расходование.
      // поиск счета для блока "расходование" остался на прежнем месте - см.ниже.
      WriteLog('Заполнение данных получателя', True);
      aXmlED11.setAttribute('REC_TAXCODE', aXmlZR.getAttribute('INN_RCP'));
      aXmlED11.setAttribute('REC_KPP', aXmlZR.getAttribute('KPP_RCP'));
      aXmlED11.setAttribute('REC_NAME', aXmlZR.getAttribute('NAME_RCP'));
      aXmlED11.setAttribute('REC_ID', '');
      if ((IsSysparamOn('org.require_taxcode') and (aXmlED11.getAttribute('REC_TAXCODE') = ''))
        or (IsSysparamOn('org.require_kpp') and (aXmlED11.getAttribute('REC_KPP') = ''))) then
      begin
        WriteInfo('Не создан - не заполнены ИНН или КПП контрагента');
        Result := False;
        Exit;
      end
      else begin
        //поиск референса получателя
        WriteLog('Поиск референса получателя по ИНН и КПП', True);
        if aXmlED11.getAttribute('REC_TAXCODE') <> '' then
        begin
          XmlOrg := GetOrgByTaxKpp(aXmlED11.getAttribute('REC_TAXCODE'),
            aXmlED11.getAttribute('REC_KPP'), '', '', False, aXmlED11);
          if (XmlOrg.documentElement.childNodes.Length = 1) and
            IsActual(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'),
              aXmlED11.getAttribute('BUDGET_ID')) then
          begin
            XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
            aXmlED11.setAttribute('REC_ID', XmlOrg.getAttribute('ID'));
            WriteLog('Найден получатель с референсом: ' + XmlOrg.getAttribute('ID'));
          end
          else
            WriteLog('Референс получателя не определен', True);
        end
        else begin
          WriteLog('Референс получателя не определен', True);
          if (not IsSysparamOn('org.permit_empty_taxcode')) then
          begin
            WriteInfo('Не создан - не заполнен ИНН контрагента и настройка "Позволять ' +
              'указывать в ЭД организацию-контрагент не из справочника без ИНН" выключена');
//              Result := False;
            Exit;
          end;
        end;
      end;

  



      // определяем бюджетополучателя
      WriteLog('Заполнение данных бюджетополучателя', True);
      WriteLog('Поиск референса бюджетополучателя по ИНН и КПП', True);
      aXmlED11.setAttribute('RECIPIENT_ID', '');
      if Trim(aXmlIK.getAttribute('INN_UBP')) <> '' then
      begin
        XmlOrg := GetOrgByTaxKpp(aXmlIK.getAttribute('INN_UBP'),
          aXmlIK.getAttribute('KPP_UBP'), '', '', False, aXmlED11);
        if not ((XmlOrg.documentElement.childNodes.Length = 1)
          and HasOrgRole(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'), '0')
          and IsActual(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'),
            aXmlED11.getAttribute('BUDGET_ID'))) then
        begin
          WriteLog('Не удалось найти референс бюджетополучателя по ИНН и КПП. Поиск' +
            ' референса бюджетополучателя по ИНН, КПП и коду организации');
          //Exchange#2093
          XmlOrg := GetOrgByTaxKppBudgIdCode(aXmlIK.getAttribute('INN_UBP'),
            aXmlIK.getAttribute('KPP_UBP'), aXmlED11.getAttribute('BUDGET_ID'),
            aXmlIK.getAttribute('KOD_UBP_PUBP'), '0');
        end;
        if XmlOrg.documentElement.childNodes.Length = 1 then
        begin
          XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
          aXmlED11.setAttribute('RECIPIENT_ID', XmlOrg.getAttribute('ID'));
          //чтобы не ломать общий поиск разрешения, записываем референс в шапку
          aXmlED11.setAttribute('ORG_ID', aXmlED11.getAttribute('RECIPIENT_ID'));
          WriteLog('Найден бюджетополучатель с референсом: ' + XmlOrg.getAttribute('ID'));
          // определяем счет для финансирования
          if aXmlIK.getAttribute('LS_UBP') = '' then
          begin
            WriteInfo('Не создан - не определен счет для финансирования');
//            Result := False;
            Exit;
          end
          else begin
            if aXmlZR.selectSingleNode('ZRST').getAttribute('KOD_IST_KBK') = 1 then
            begin
              aXmlED11.setAttribute('ORGACCOUNT_ID',GetLicAcc(aXmlED11.getAttribute('RECIPIENT_ID'),
                '5', aXmlIK.getAttribute('LS_UBP')));
              if aXmlED11.getAttribute('ORGACCOUNT_ID') = '' then begin
                WriteInfo('Не создан - не определен референс счета для финансирования');
  //              Result := False;
                Exit;
              end
              else begin
                // определяем бланк расходов
  {
                aXmlED11.setAttribute('ESTIMATE_ID', GetEstimateId(aXmlED11.getAttribute('BUDGET_ID'),
                  aXmlED11.getAttribute('RECIPIENT_ID'), aXmlED11.getAttribute('ORGACCOUNT_ID'),
                  aXmlZR.selectSingleNode('ZRST')));
  }
                // exchange #2824
                // при поиске бланка расходов добавлена организация
                // из блока "расходование".
                // применять только для типа KOD_IST_KBK=1.
                // exchange #2847
                // поиск бланка расходов выполняется в несколько этапов.
                // если бланк расходов находится по условию #2824,
                // то бюджетополучатель в ЗОР нужно подставить из РЧБ.
                // чтобы это сделать не меняя функцию поиска бланка расходов,
                // добавим переменную xFoundBP которая будет заполняться только
                // когда бланк расходов в GetEstimateId_2824 будет найден
                // по условию #2824, а в остальных случаях значение переменной
                // xFoundBP будет пустым.
                // exchange #2957
                // переделан механизм поиска БР
//                  xFoundBP := '';
//                  GetEstimateId_2957( aXmlED11, aXmlZR, aXmlIK);
{
                aXmlED11.setAttribute( 'ESTIMATE_ID',
                      GetEstimateId_2824(
                            xFoundBP,
                            aXmlED11.getAttribute('BUDGET_ID'),
                            aXmlED11.getAttribute('RECIPIENT_ID'),
                            aXmlED11.getAttribute('ORGACCOUNT_ID'),
                            aXmlZR.selectSingleNode('ZRST'),
                            FALSE,
                            aXmlED11.GetAttribute('REC_ID')));
                            }
                            {
                if aXmlED11.getAttribute('ESTIMATE_ID') = '' then begin
                  WriteInfo('Не создан - не определен бланк расходов плательщика.');
                  Result := False;
                  Exit;
                end;
                }
                // exchange #3024 - изменен алгоритм поиска БР
                if NOT GetEstimateId_3024_ED( aXmlED11, aXmlZR, aXmlIK) then begin
                  WriteInfo('Не создан - не определен бланк расходов плательщика.');
                  Result := False;
                  Exit;
                end;
{
                // exchange 2847
                // если бланк расходов найден по #2824 (в РЧБ с признаком МБТ),
                // тогда заменяем бюджетополучателя в ЗОР
                if (LENGTH( xFoundBP) > 0) then begin
                  WriteLog( 'Бюджетополучатель строки РЧБ переносится в поле бюджетополучатель ЭД.');
                  aXmlED11.setAttribute('RECIPIENT_ID', xFoundBP);
                end;
}
              end;
            end
            else begin
              aXmlED11.setAttribute('ORGACCOUNT_ID',GetLicAccSs(aXmlED11.getAttribute('RECIPIENT_ID'),
                '5', aXmlIK.getAttribute('LS_UBP')));
              if aXmlED11.getAttribute('ORGACCOUNT_ID') = '' then begin
                WriteInfo('Не создан - не определен референс счета для финансирования');
      //          Result := False;
                Exit;
              end
              else begin
                // определяем бланк расходов
                aXmlED11.setAttribute('ESTIMATE_ID', GetEstimateIdSs(aXmlED11.getAttribute('BUDGET_ID'),
                  aXmlED11.getAttribute('RECIPIENT_ID'), aXmlED11.getAttribute('ORGACCOUNT_ID')));
                if aXmlED11.getAttribute('ESTIMATE_ID') = '' then begin
                  WriteInfo('Не создан - не определен бланк расходов плательщика');
    //              Result := False;
                  Exit;
                end;
              end;
            end;
          end;
        end
        else
        begin
          WriteInfo('Не создан - не определен референс бюджетополучателя');
        //  Result := False;
          Exit;
        end;
      end
      else begin
        WriteInfo('Не создан - не определен референс бюджетополучателя');
//          Result := False;
        Exit;
      end;

  // exchange #2932 - описание счета для финансирования на закладке ГРБС
  FillOrgAccountED11( VarToStr( aXmlED11.GetAttribute( 'ORGACCOUNT_ID')), aXmlED11);

  
      //заполняем идентификатор
      // exchange #3062 - унификация кода
      if NOT FillDepartamentalinfo_ImpIK_ZR(aXmlED11, aXmlZR)
        then EXIT;
        (*
      aXmlED11.setAttribute('AUTHOR_ID', Get_Author_Id(aXmlZR.getAttribute('PAYSTATUS')));
      //Exchange #771, если KDOH не пусто, а AUTHOR_ID пусто, то AUTHOR_ID заполняем нулем.
      if (aXmlED11.getAttribute('AUTHOR_ID') = '') and (aXmlZR.getAttribute('KDOH') <> '') then
        aXmlED11.setAttribute('AUTHOR_ID', 0);
      if aXmlED11.getAttribute('AUTHOR_ID') <> '' then
      begin
        // exchange #2791 - проверка КБК в ид.платежа
        // если проверка =false - не создаем эд.
        // при этом ошибку указываем в журнале info
        if NOT DoCheck_2791_LoadKBK0_PI_BUDGET_CODE( aXmlZR.getAttribute('KDOH'))
          then EXIT;
//            Result := False;
//              EXIT;
//          end;

        // exchange #3062 - удален косгу
        // принимается всегда доходная
        aXmlED11.setAttribute('PI_ANAL_KIND', '1');
{          aXmlED11.setAttribute('PI_ANAL_KIND', GetPi_Anal_Kind(
          Copy(aXmlZR.getAttribute('KDOH'), 18, 3)));}
        aXmlED11.setAttribute('PI_BUDGET_CODE', aXmlZR.getAttribute('KDOH'));
        aXmlED11.setAttribute('PAY_OKATO', aXmlZR.getAttribute('OKATO'));
        aXmlED11.setAttribute('GROUND_ID', GetGrnd_Ground_Id(aXmlZR.getAttribute('OSN_PL')));
        aXmlED11.setAttribute('TAXPERIOD', aXmlZR.getAttribute('NAL_PER'));
        aXmlED11.setAttribute('GRND_DOC_NUMBER', aXmlZR.getAttribute('NOM_DOK'));
        aXmlED11.setAttribute('GRND_DOC_DATE', aXmlZR.getAttribute('DATE_DOK'));
        aXmlED11.setAttribute('PAYTYPE_ID', GetGrnd_PayType_Id(aXmlZR.getAttribute('TYPE_PL')));
      end
      else begin
        aXmlED11.setAttribute('PI_BUDGET_CODE', '');
        aXmlED11.setAttribute('PAY_OKATO', '');
        aXmlED11.setAttribute('TAXPERIOD', '');
        aXmlED11.setAttribute('GRND_DOC_NUMBER', '');
        aXmlED11.setAttribute('GRND_DOC_DATE', '');
      end;
      *)
      // exchange #2549
      // выборка руководителя с флагом актуальности
      GetRespersonEx(aXmlED11.getAttribute('RECIPIENT_ID'),'-2' , Fio, Dolzhnost);
      aXmlED11.setAttribute('CHEQUE_FIO_BOSS_STR', Fio);
      aXmlED11.setAttribute('CHEQUE_BOSS_POST', Dolzhnost);
      // exchange #2549
      // выборка бух. с флагом актуальности
      GetRespersonEx(aXmlED11.getAttribute('RECIPIENT_ID'),'-3' , Fio, Dolzhnost);
      aXmlED11.setAttribute('CHEQUE_FIO_BUHGALT_STR', Fio);
      aXmlED11.setAttribute('CHEQUE_BUHGALT_POST', Dolzhnost);
      aXmlED11.setAttribute('RESPPERSON_SIG_DATE', aXmlED11.getAttribute('DOC_DATE'));
      //Exchange#2005 изменение формирования вкладки  документа-основания
      aXmlED11 := aXmlED11.appendChild(aXmlED11.ownerDocument.createElement('GROUND_DOC'));
      for i := 0 to aXmlZR.ChildNodes.Length - 1 do
      begin
        aXmlZR := aXmlZR.ChildNodes.Item[i];
        if aXmlZR.NodeName = 'ZROSN' then
        begin
          aXmlED11 := aXmlED11.appendChild(aXmlED11.ownerDocument.createElement('GROUND_DOC'));
          aXmlED11.setAttribute('KIND', aXmlZR.getAttribute('VID_OSN'));
          aXmlED11.setAttribute('DOC_NUMBER', aXmlZR.getAttribute('NOM_OSN'));
          aXmlED11.setAttribute('DOC_DATE', aXmlZR.getAttribute('DATE_OSN'));
          if aXmlED11.getAttribute('DOC_DATE') <> '' then
            aXmlED11.setAttribute('DOC_DATE',
              DateTimeToXml(StrToDate(aXmlED11.getAttribute('DOC_DATE'))));
          aXmlED11.setAttribute('DESCRIPTION', aXmlZR.getAttribute('OSN'));
          // Exchange #2337 Признак основания платежа
          aXmlED11.setAttribute( 'BASE_PAYMENT_FLAG', aXmlZR.getAttribute('OSN_PLAT'));
          aXmlED11 := aXmlED11.parentNode;
        end;
        aXmlZR := aXmlZR.parentNode;
      end;
      aXmlED11 := aXmlED11.ownerDocument.documentElement;



      // заполняем поля по счету блока расходования
      // exchange #2745
      // в начале проверяется счет из LS_UBP_RCP.
      // если счет однозначно найден, то все остается как есть.
      // если орг. не заполнена или счет по LS_UBP_RCP не найден,
      // то заполнять счет REC_ACCOUNT из BS_RCP и повторить поиск счета.
      // так же переделано отображение сообщений в журнале.
      // чтобы сообщение "Поиск референса счета..." не дублировалось, вывод
      // в лог осуществляется в начале один раз.
      xFound_REC_ACCOUNT := FALSE;
      if (aXmlED11.getAttribute('REC_ID') <> '')
        then WriteLog('Поиск референса счета получателя', True);

      if aXmlZR.getAttribute('LS_UBP_RCP') <> '' then begin
        aXmlED11.setAttribute('REC_ACCOUNT', aXmlZR.getAttribute('LS_UBP_RCP'));
        if aXmlED11.getAttribute('REC_ID') <> '' then begin
          XmlAcc := GetAccAllRekByOrgIdAccNum( aXmlED11.getAttribute('REC_ID'),
                                               aXmlED11.getAttribute('REC_ACCOUNT'),
                                               '5, 7, 8, 9',
                                               '',
                                               True);
          if XmlAcc.documentElement.childNodes.Length = 1 then begin
            xFound_REC_ACCOUNT := TRUE;
            XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
            aXmlED11.setAttribute('REC_ACC_ID', XmlAcc.getAttribute('ID'));
            aXmlED11.setAttribute('REC_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
            aXmlED11.setAttribute('REC_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
            // Exchange #2040
            if (GetAccType(XmlAcc.getAttribute('ID')) in ['5, 9'])
               or ((aXmlZR.getAttribute('BS_RCP') <> '')
                   and
                   (aXmlZR.getAttribute('BS_RCP') = XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER')))
              then begin
                aXmlED11.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'));
                aXmlED11.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('UFK_ACC_ID'));
              end else begin
                aXmlED11.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('INCUFK_ACCOUNT_NUMBER'));
                aXmlED11.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('INCUFK_ACC_ID'));
              end;
            WriteLog('Найден счет получателя с референсом: ' + XmlAcc.getAttribute('ID'));
          end;
        end;
      end;
      // изем счет по BS_RCP, если по LS_UBP_RCP не найден или поле LS_UBP_RCP
      // не заполнено.
      if NOT xFound_REC_ACCOUNT then begin
        aXmlED11.setAttribute('REC_ACCOUNT', VarToStr( aXmlZR.getAttribute('BS_RCP')));
        // здесь нужно учесть что поле BS_RCP необязательное
        if (LENGTH( aXmlED11.GetAttribute('REC_ACCOUNT')) > 0) then
          if aXmlED11.getAttribute('REC_ID') <> '' then begin
            XmlAcc := QueryXml( sqlAccByOrgId
                               +' and Account_Number = ? and OrgAccType_Id in (2, 3)',
                                [ aXmlED11.getAttribute('REC_ID'),
                                  aXmlED11.getAttribute('REC_ACCOUNT')]);
            if XmlAcc.documentElement.childNodes.Length = 1 then begin
              xFound_REC_ACCOUNT := TRUE;
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              aXmlED11.setAttribute('REC_ACC_ID', XmlAcc.getAttribute('ID'));
              WriteLog('Найден счет получателя с референсом: ' + XmlAcc.getAttribute('ID'));
            end;
          end;
      end;
      // если счет так и не будет найден - выдаем сообщение один раз
      if NOT xFound_REC_ACCOUNT then
        if (aXmlED11.getAttribute('REC_ID') <> '')
          then WriteLog('Референс счета получателя не опеределен', True);



      aXmlED11.setAttribute('REC_BIC', aXmlZR.getAttribute('BIC_RCP'));
      aXmlED11.setAttribute('REC_B_NAME', aXmlZR.getAttribute('NAME_BIC_RCP'));
      aXmlED11.setAttribute('REC_CORACCOUNT', aXmlZR.getAttribute('KS_BIC_RCP'));
      aXmlED11.setAttribute('DESCRIPTION', aXmlZR.getAttribute('PURPOSE'));
      //Exchange#2218 - поиск договора при авторазборе назначения платежа
      if param_Search_Bo then
      begin
        WriteLog('Поиск бюджетного обязательства в назначении платежа');
        ParceDescription(aXmlZR.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
            WriteInfo('Найден ЭД "Договор" №' + Contract_Number + ' от ' + Contract_Date, True);
        end;
      end
      else
        WriteLog('Автоподстановка бюджетного обязательства не производится (выключен'+
          ' параметр "Автоподстановка бюджетного обязательства")');

      // exchange #2616 - ТФФ12
      // поле aXmlIK.ZR.SUM_V_NDS удалено, поэтому тут проверяем поле с проверкой
      // его отсутствия
      if VarToStr( aXmlZR.getAttribute('SUM_V_NDS')) = ''
        then aXmlED11.setAttribute('VAT', '0.00')
        else aXmlED11.setAttribute('VAT', aXmlZR.getAttribute('SUM_V_NDS'));

      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', aXmlZR.selectSingleNode('ZRST').getAttribute('KADMR_CODE'));
      aXmlED11.setAttribute('ORG_GRBS', '');
      Kbk := 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', [aXmlED11.getAttribute('BUDGET_ID'),
        aXmlZR.selectSingleNode('ZRST').getAttribute('KADMR_CODE')]);
      Kbk := Kbk.ChildNodes.Item[0];
      if Kbk.ChildNodes.Length = 1 then
        aXmlED11.setAttribute('ORG_GRBS', Kbk.ChildNodes.item[0].getAttribute('DESCRIPTION'))
      else begin
        for i := 0 to Kbk.ChildNodes.Length -1 do
        begin
          Kbk := Kbk.ChildNodes.item[i];
          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;
      //ищем разрешение и его строку по расходной классифкации(по первой строке)
      //если нашли, при создании будем проверять каждую строку
      Permission := GetPermissionRash(aXmlED11, aXmlZR.selectSingleNode('ZRST'), True);
      //Exchange #1997
      if VarIsNull(Permission) and param_UseGroupBuh25 then
        //Ищем разрешение с учетом групп по бухгалтерии
        Permission := GetPermissionRashUseGroupBuh(aXmlED11, aXmlZR.selectSingleNode('ZRST'), True);
      if not VarIsNull(Permission) then
      begin
        // создаем по разрешению
  
        aXmlED11 := aXmlED11.appendChild(aXmlED11.ownerDocument.createElement('LINES'));
        for i := 0 to aXmlZR.ChildNodes.Length - 1 do
        begin
          aXmlZR := aXmlZR.ChildNodes.Item[i];
          //ищем разрешение для данной строки
          if aXmlZR.NodeName = 'ZRST' then
          begin
  
  {
            // exchange #3062 - перенос проверки строки сюда
            if NOT CheckKBK_ZRST( aXmlZR, xBudgetID)
              then EXIT;
   }
            Permission := GetPermissionRash(aXmlED11.parentNode, aXmlZR, True);
            if VarIsNull(Permission) then
            begin
              if param_UseGroupBuh25 then
              begin
                Permission := GetPermissionRashUseGroupBuh(aXmlED11.parentNode, aXmlZR, True);
                if VarIsNull(Permission) then
                begin
                  WriteInfo('Не создан - не определено разрешение на открытие лс');
                  aXmlZR := aXmlZR.parentNode.parentNode;
                  Exit;
                end;
              end
              else begin
                WriteInfo('Не создан - не определено разрешение на открытие лс');
                aXmlZR := aXmlZR.parentNode.parentNode;
                Exit;
              end;
            end;
            aXmlED11 := aXmlED11.appendChild(aXmlED11.ownerDocument.createElement('LINE'));
            aXmlED11.setAttribute('DOCUMENTCLASS_ID', aXmlED11.parentNode.parentNode.getAttribute('class'));
            aXmlED11.setAttribute('RECIPIENT_ID', Permission.getAttribute('RECIPIENT_ID'));
            aXmlED11.setAttribute('ESTIMATE_ID', aXmlED11.parentNode.parentNode.getAttribute('ESTIMATE_ID'));
            aXmlED11.setAttribute('ORGACCOUNT_ID', aXmlED11.parentNode.parentNode.getAttribute('ORGACCOUNT_ID'));
            aXmlED11.setAttribute('QUEUE_KIND',aXmlED11.parentNode.parentNode.getAttribute('QUEUE_KIND'));
            aXmlED11.setAttribute('PAYKIND',aXmlED11.parentNode.parentNode.getAttribute('PAYKIND'));
            aXmlED11.setAttribute('FK_FLAG',aXmlED11.parentNode.parentNode.getAttribute('FK_FLAG'));
            aXmlED11.setAttribute('SIGN_VOLUME', aXmlED11.parentNode.parentNode.getAttribute('SIGN_VOLUME'));
            aXmlED11.setAttribute('TAXCODE_PP', aXmlED11.parentNode.parentNode.getAttribute('TAXCODE_PP'));
            aXmlED11.setAttribute('KPP_PP', aXmlED11.parentNode.parentNode.getAttribute('KPP_PP'));
            aXmlED11.setAttribute('CHEQUE_FIO_BOSS_STR', aXmlED11.parentNode.parentNode.getAttribute('CHEQUE_FIO_BOSS_STR'));
            aXmlED11.setAttribute('CHEQUE_BOSS_POST', aXmlED11.parentNode.parentNode.getAttribute('CHEQUE_BOSS_POST'));
            aXmlED11.setAttribute('CHEQUE_FIO_BUHGALT_STR', aXmlED11.parentNode.parentNode.getAttribute('CHEQUE_FIO_BUHGALT_STR'));
            aXmlED11.setAttribute('CHEQUE_BUHGALT_POST', aXmlED11.parentNode.parentNode.getAttribute('CHEQUE_BUHGALT_POST'));
            if aXmlZR.parentNode.getAttribute('TYPE') = 2 then
              aXmlED11.setAttribute('AMOUNT', Format('%0.2f', [StrToCurrDef(aXmlZR.parentNode.getAttribute('SUM_V'), 0)]))
            else
              aXmlED11.setAttribute('AMOUNT', Format('%0.2f', [StrToCurrDef(aXmlZR.getAttribute('SUM_V_KBK'), 0)]));
            aXmlED11.parentNode.parentNode.setAttribute('AMOUNT',
              StrToCurrDef(aXmlED11.parentNode.parentNode.getAttribute('AMOUNT'), 0) +
              StrToCurrDef(aXmlED11.getAttribute('AMOUNT'), 0));
            aXmlED11.setAttribute('DESCRIPTION_LINES', aXmlZR.getAttribute('PURPOSE_KBK'));
            aXmlED11.setAttribute('NOTE', aXmlZR.getAttribute('NOTE_KBK'));
            aXmlED11.setAttribute('KFSR_CODE', aXmlZR.getAttribute('KFSR_CODE'));
            aXmlED11.setAttribute('KCSR_CODE', aXmlZR.getAttribute('KCSR_CODE'));
            aXmlED11.setAttribute('KVR_CODE', aXmlZR.getAttribute('KVR_CODE'));
            // exchange #3062 - удален косгу
            // поле копируется при наличии
            CopyNodeAttributeEx( aXmlED11, 'KESR_CODE', aXmlZR, 'KESR_CODE');
//              aXmlED11.setAttribute('KESR_CODE', aXmlZR.getAttribute('KESR_CODE'));
            aXmlED11.setAttribute('KADMR_CODE', aXmlZR.getAttribute('KADMR_CODE'));
            aXmlED11.setAttribute('FSR_ID', Permission.getAttribute('FSR_ID'));
            aXmlED11.setAttribute('KDF_CODE', Permission.getAttribute('KDF_CODE'));
            aXmlED11.setAttribute('KDE_CODE', Permission.getAttribute('KDE_CODE'));
            aXmlED11.setAttribute('KDR_CODE', Permission.getAttribute('KDR_CODE'));
            aXmlED11.setAttribute('ANAL_KIND', aXmlZR.getAttribute('ANAL_KIND'));
            aXmlED11.setAttribute('PURPOSEFULGRANT_ID', aXmlZR.getAttribute('PURPOSEFULGRANT_ID'));
            if (aXmlED11.getAttribute('PURPOSEFULGRANT_ID') = '') and
              (isPurposeFulgrantAutoFill('11', Est_Kind)) then
                aXmlED11.setAttribute('PURPOSEFULGRANT_ID', PurposeFulgrantAutoFill(aXmlZR,
                  aXmlED11.parentNode.parentNode.getAttribute('BUDGET_ID')));
            aXmlED11.setAttribute('DIRECTION_ID', '');
            //1-Контролировать, 0-нет, 2-запрещать
            if isDirectionAutoFill and (isDirectionControl(aXmlED11.getAttribute('DOCUMENTCLASS_ID'),
              aXmlED11.parentNode.parentNode.getAttribute('EST_KIND')) <> '2') then
              aXmlED11.setAttribute('DIRECTION_ID', DirectionAutoFill(aXmlED11,
                aXmlED11.parentNode.parentNode.getAttribute('BUDGET_ID')));
            aXmlED11.setAttribute('PERMISSIONLINE_ID', Permission.getAttribute('PERMISSIONLINE_ID'));
            aXmlED11.setAttribute('FUNDSOURCE_ID', Permission.getAttribute('FUNDSOURCE_ID'));
            // Exchange#2218 - поиск БО
            if Contract.documentElement.childNodes.Length = 1 then
            begin
            // проводим поиск БО на основании строки кбк и ранее найденного договора
              BO := GetBoByContractAndKBK(Contract.documentElement.childNodes.Item[0], aXmlED11);
              if BO.documentElement.childNodes.Length = 1 then
              begin
                aXmlED11.setAttribute('BO_ID', BO.documentElement.childNodes.Item[0].getAttribute('ID'));
                // проставляем ссылку на БО только в однострочных ЭД
                if aXmlZR.parentNode.selectNodes('ZRST').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
                if (Payment_Name <> '') and (Payment_Number <> '') and (Payment_Date <> '') 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('ADVPAYMENT', 1)
                    else
                      aXmlED11.parentNode.parentNode.setAttribute('ADVPAYMENT', 0);
                  end
                  else
                    WriteLog('Не найден выставленный счет');
                end else
                  WriteLog('В назначении платежа невозможно определить выставленный счет');
              end;
            end;
            aXmlED11 := aXmlED11.parentNode;
          end;
          aXmlZR := aXmlZR.parentNode;
        end;
      end
      else begin
        if aXmlZR.selectSingleNode('ZRST').getAttribute('KOD_IST_KBK') = 2 then
        begin
          WriteInfo('Не создан - не определено разрешение на открытие лс');
//            Result := False;
          Exit;
        end
        else
        begin
          // создаем ЗОР без разрешения для КИФ=1
  
          aXmlED11 := aXmlED11.appendChild(aXmlED11.ownerDocument.createElement('LINES'));
          for i := 0 to aXmlZR.ChildNodes.Length - 1 do
          begin
            aXmlZR := aXmlZR.ChildNodes.Item[i];
            if aXmlZR.NodeName = 'ZRST' then
            begin
  
  {
              // exchange #3062 - перенос проверки строки сюда
              if NOT CheckKBK_ZRST( aXmlZR, xBudgetID)
                then EXIT;
                }
              aXmlED11 := aXmlED11.appendChild(aXmlED11.ownerDocument.createElement('LINE'));
              aXmlED11.setAttribute('DOCUMENTCLASS_ID', aXmlED11.parentNode.parentNode.getAttribute('class'));
              aXmlED11.setAttribute('ESTIMATE_ID', aXmlED11.parentNode.parentNode.getAttribute('ESTIMATE_ID'));
              aXmlED11.setAttribute('ORGACCOUNT_ID', aXmlED11.parentNode.parentNode.getAttribute('ORGACCOUNT_ID'));
              aXmlED11.setAttribute('RECIPIENT_ID', aXmlED11.parentNode.parentNode.getAttribute('RECIPIENT_ID'));
              aXmlED11.setAttribute('QUEUE_KIND',aXmlED11.parentNode.parentNode.getAttribute('QUEUE_KIND'));
              aXmlED11.setAttribute('PAYKIND', aXmlED11.parentNode.parentNode.getAttribute('PAYKIND'));
              aXmlED11.setAttribute('FK_FLAG',aXmlED11.parentNode.parentNode.getAttribute('FK_FLAG'));
              aXmlED11.setAttribute('SIGN_VOLUME', aXmlED11.parentNode.parentNode.getAttribute('SIGN_VOLUME'));
              aXmlED11.setAttribute('TAXCODE_PP', aXmlED11.parentNode.parentNode.getAttribute('TAXCODE_PP'));
              aXmlED11.setAttribute('KPP_PP', aXmlED11.parentNode.parentNode.getAttribute('KPP_PP'));
              aXmlED11.setAttribute('CHEQUE_FIO_BOSS_STR', aXmlED11.parentNode.parentNode.getAttribute('CHEQUE_FIO_BOSS_STR'));
              aXmlED11.setAttribute('CHEQUE_BOSS_POST', aXmlED11.parentNode.parentNode.getAttribute('CHEQUE_BOSS_POST'));
              aXmlED11.setAttribute('CHEQUE_FIO_BUHGALT_STR', aXmlED11.parentNode.parentNode.getAttribute('CHEQUE_FIO_BUHGALT_STR'));
              aXmlED11.setAttribute('CHEQUE_BUHGALT_POST', aXmlED11.parentNode.parentNode.getAttribute('CHEQUE_BUHGALT_POST'));
              if aXmlZR.parentNode.getAttribute('TYPE') = 2 then
                aXmlED11.setAttribute('AMOUNT', Format('%0.2f', [StrToCurrDef(aXmlZR.parentNode.getAttribute('SUM_V'), 0)]))
              else
                aXmlED11.setAttribute('AMOUNT', Format('%0.2f', [StrToCurrDef(aXmlZR.getAttribute('SUM_V_KBK'), 0)]));
              aXmlED11.parentNode.parentNode.setAttribute('AMOUNT',
                StrToCurrDef(aXmlED11.parentNode.parentNode.getAttribute('AMOUNT'), 0) +
                StrToCurrDef(aXmlED11.getAttribute('AMOUNT'), 0));
              aXmlED11.setAttribute('DESCRIPTION_LINES', aXmlZR.getAttribute('PURPOSE_KBK'));
              aXmlED11.setAttribute('NOTE', aXmlZR.getAttribute('NOTE_KBK'));
              aXmlED11.setAttribute('KFSR_CODE', aXmlZR.getAttribute('KFSR_CODE'));
              aXmlED11.setAttribute('KCSR_CODE', aXmlZR.getAttribute('KCSR_CODE'));
              aXmlED11.setAttribute('KVR_CODE', aXmlZR.getAttribute('KVR_CODE'));
              // exchange #3062 - удален косгу
              // поле копируется при наличии
              CopyNodeAttributeEx( aXmlED11, 'KESR_CODE', aXmlZR, 'KESR_CODE');
//                aXmlED11.setAttribute('KESR_CODE', aXmlZR.getAttribute('KESR_CODE'));
              aXmlED11.setAttribute('KADMR_CODE', aXmlZR.getAttribute('KADMR_CODE'));
              aXmlED11.setAttribute('ANAL_KIND', aXmlZR.getAttribute('ANAL_KIND'));

              // exchange #2449
              // для решения задачи проверки строки с кодом цели, ножно в начале
              // заполнить код цели в строке - перенос кода сюда.
              aXmlED11.setAttribute('PURPOSEFULGRANT_ID', aXmlZR.getAttribute('PURPOSEFULGRANT_ID'));
              if (aXmlZR.getAttribute('PURPOSEFULGRANT_ID') = '') and
                (isPurposeFulgrantAutoFill('11', Est_Kind)) then
                aXmlED11.setAttribute('PURPOSEFULGRANT_ID', PurposeFulgrantAutoFill(aXmlZR,
                  aXmlED11.parentNode.parentNode.getAttribute('BUDGET_ID')));

              // exchange #2944
              // если код цели не будет заполнен (и не указан в файле),
              // то проставляем системный код 0.
              // в данном случае не важно, будет найдена такая строка в РЧБ
              // одна или несколько или вообще не будет такой строки.
              // если будет одна - то доп.коды будут взяты из РЧБ,
              // иначе будут заполнены по автозаполнению доп.кодов.
              if ( LENGTH( VarToStr( aXmlED11.GetAttribute( 'PURPOSEFULGRANT_ID'))) <= 0)
                then begin
                  aXmlED11.SetAttribute( 'PURPOSEFULGRANT_ID',
                                    GetPurposeFulgrantId( BudgetId, '0'));
  
                end;

{
              // Exchange#2143
              Line := GetLineExpbudget(aXmlED11, aXmlED11.parentNode.parentNode.getAttribute('BUDGET_ID'));
              if Line.documentElement.childNodes.Length = 1 then
              begin
                Line := Line.documentElement.childNodes.item[0];
                aXmlED11.setAttribute('KDF_CODE', Line.getAttribute('KDF_CODE'));
                aXmlED11.setAttribute('KDE_CODE', Line.getAttribute('KDE_CODE'));
                aXmlED11.setAttribute('KDR_CODE', Line.getAttribute('KDR_CODE'));
                aXmlED11.setAttribute('FSR_ID', Line.getAttribute('FSR_ID'));
              end
              else begin
                aXmlED11.setAttribute('KDF_CODE', aXmlZR.getAttribute('KDF_CODE'));
                aXmlED11.setAttribute('KDE_CODE', aXmlZR.getAttribute('KDE_CODE'));
                aXmlED11.setAttribute('KDR_CODE', aXmlZR.getAttribute('KDR_CODE'));
                aXmlED11.setAttribute('FSR_ID', aXmlZR.getAttribute('FSR_ID'));
              end;
              }
              // exchange #2957
              // в каждой строке ищем бюджетополучателя индивидуально
{                DoFillLineED11_2957( aXmlED11.parentNode.parentNode, aXmlED11,
                                   aXmlZR.parentNode, aXmlZR);}
              // exchange #3024
              // изменение алгоритма
              DoFillLineED11_3024( aXmlED11.parentNode.parentNode,  // эд 11
                                   aXmlED11,                  // строка эд 11
                                   aXmlZR.parentNode,    // ZR
                                   aXmlZR);            // ZRST
  {
              aXmlED11.setAttribute('PURPOSEFULGRANT_ID', aXmlZR.getAttribute('PURPOSEFULGRANT_ID'));
              if (aXmlZR.getAttribute('PURPOSEFULGRANT_ID') = '') and
                (isPurposeFulgrantAutoFill('11', Est_Kind)) then
                aXmlED11.setAttribute('PURPOSEFULGRANT_ID', PurposeFulgrantAutoFill(aXmlZR,
                  aXmlED11.parentNode.parentNode.getAttribute('BUDGET_ID')));
  }
              aXmlED11.setAttribute('DIRECTION_ID', '');
              //1-Контролировать, 0-нет, 2-запрещать
              if isDirectionAutoFill and (isDirectionControl(aXmlED11.getAttribute('DOCUMENTCLASS_ID'),
                aXmlED11.parentNode.parentNode.getAttribute('EST_KIND')) <> '2') then
                aXmlED11.setAttribute('DIRECTION_ID', DirectionAutoFill(aXmlED11,
                  aXmlED11.parentNode.parentNode.getAttribute('BUDGET_ID')));
              // Exchange#2218 - поиск БО
              if Contract.documentElement.childNodes.Length = 1 then
              begin
              // проводим поиск БО на основании строки кбк и ранее найденного договора
                BO := GetBoByContractandKBK(Contract.documentElement.childNodes.Item[0], aXmlED11);
                if BO.documentElement.childNodes.Length = 1 then
                begin
                  aXmlED11.setAttribute('BO_ID', BO.documentElement.childNodes.Item[0].getAttribute('ID'));
                  // проставляем ссылку на БО только в однострочных ЭД
                  if aXmlZR.parentNode.selectNodes('ZRST').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
                  if (Payment_Name <> '') and (Payment_Number <> '') and (Payment_Date <> '') 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('ADVPAYMENT', 1)
                      else
                        aXmlED11.parentNode.parentNode.setAttribute('ADVPAYMENT', 0);
                    end else
                      WriteLog('Не найден выставленный счет');
                  end else
                    WriteLog('В назначении платежа невозможно определить выставленный счет');
                end;
              end;

              aXmlED11 := aXmlED11.parentNode;
            end;
            aXmlZR := aXmlZR.parentNode;
          end;
        end;
      end;
      aXmlED11.parentNode.setAttribute('AMOUNT', Format('%0.2f',
        [StrToCurrDef(aXmlED11.parentNode.getAttribute('AMOUNT'), 0)]));

      aXmlZR := aXmlZR.ownerDocument.documentElement;
      aXmlED11 := aXmlED11.ownerDocument;
      Result := True;
      except
        ExceptionProc( 'CreateDoc11');
    end;

end;

begin
end.
