{~MakeDocumentIkBD
  Формирование документов
  параметры
    aFinYear - фин.год (год IK.DATE)
    aMode - строка режима.
            exchange #2600 пп.2.9.2 - заполняется как '2600_2.9'
            для старого варианта этот параметр должен быть пустой строкой.}
procedure MakeDocumentIkBD(Doc, DocXml, IK: Variant;
                            aFinYear: string);
var
  xmlOrg, xmlAcc, BudgXml: Variant;
  i: Integer;
  xSearchOrgBy_TaxCode: string;
  xSearchOrgBy_KPP: string;
  xSearchOrgBy_TaxCodeEqu: boolean;
  xFSR_Value: string;     // exchange #2600
  xPay_Org_KPP: string;
  xPay_LS_ID: string;
  xPay_Org_ID: string;
  xPay_LS_Xml: Variant;
  xRec_Org_ID: string;
  xRec_Org_Xml: Variant;
  xPay_BudgetId: string;
  xXmlED_Line: Variant;
begin

    try
      // exchange #3009
      // При загрузке BDPD пропускать все BDPD со значением поля "BS_RCP"
      // начинающимся на "40116"
      if (POS( '40116', GetNodeAttributeEx( DocXml, 'BS_RCP')) = 1) then
        if vCfg3009 then begin
          WriteInfo(
              FORMAT( 'Пропущен раздел BDPD со счетом BS_RCP=%s по настройке конфигурации.',
                      [ GetNodeAttributeEx( DocXml, 'BS_RCP')]));
          EXIT;
        end;

      Doc.setAttribute('F_PARENTCLASS', ''); //Класс документа, среди которых надо искать пару.
      Doc.setAttribute('action', 'insert');
      Doc.setAttribute('class',
        IfThen(DocXml.childNodes.Item[0].getAttribute('DIR_SUM') = '1', '5', '24'));
      Doc.setAttribute('DECLINE', 'False');
      Doc.setAttribute('USEGROUPBUH25', param_UseGroupBuh25);
      // предзаполнение шапки
      FillElementBySchemaLoad(Doc, DocXml);
      //ищем пару по полю GUID, проверку повторной загрузки оставляем по полю GUID_FK
      Doc.setAttribute('GUID', DocXml.getAttribute('GUID'));
      Doc.setAttribute('FOREIGN_KEY', DocXml.getAttribute('GUID_FK'));
      Doc.setAttribute('PAYKIND', PayKindSetAsAzk(DocXml.getAttribute('VID_PL')));
      Doc.setAttribute('CARRY_DATE', DateTimeToXml(StrToDate(IK.getAttribute('DATE'))));
      // разборка с идентификатором
      // exchange #3062 - унификация кода
      FillDepartmentalInfo2( Doc, DocXml);
      (*
      Doc.setAttribute('AUTHOR_ID', Get_Author_Id(DocXml.getAttribute('PAYSTATUS')));
      if (Doc.getAttribute('AUTHOR_ID') = '') and (DocXml.getAttribute('KBK') <> '') then
        Doc.setAttribute('AUTHOR_ID', 0);
      //Exchnge #771, если KBKD не пусто, а AUTHOR_ID пусто, то AUTHOR_ID заполняем нулем.
      if Doc.getAttribute('AUTHOR_ID') <> '' then
      begin
        // exchange #3062 - удален косгу
        // принимается всегда доходная
        Doc.setAttribute('PI_ANAL_KIND', '1');
{        Doc.setAttribute('PI_ANAL_KIND', GetPi_Anal_Kind(
          Copy(DocXml.getAttribute('KBK'), 18, 3)));}
        Doc.setAttribute('GROUND_ID', GetGrnd_Ground_Id(DocXml.getAttribute('OSNPLAT')));
        Doc.setAttribute('PAYTYPE_ID', GetGrnd_PayType_Id(DocXml.getAttribute('TYPE_PL')));
      end
      else begin
        Doc.setAttribute('PI_BUDGET_CODE', '');
        Doc.setAttribute('PAY_OKATO', '');
        Doc.setAttribute('TAXPERIOD', '');
        Doc.setAttribute('GRND_DOC_NUMBER', '');
      end;
      *)
      if DocXml.getAttribute('ORDER_PAY') = '0' then
        Doc.setAttribute('QUEUE_KIND', '');

      { exchange #2886 п.1
        При разборе блока BDPD при загрузке по конфигурации  «Imp_FK_IK»,
        если в  поле BDPD.BS_PAY указано значение банковского счета,
        первые 4 знака которого соответствуют значению «2020»,
        то такой документ пропускать, продолжать обрабатывать блок далее.}
      if (POS( '2020', DocXml.GetAttribute('BS_PAY')) = 1) then begin
        if Doc.getAttribute('class') = '24'
          then WriteInfo( 'АЦК: "Приложение к выписке кредитовое" № ' +
                          Doc.getAttribute('DOC_NUMBER') + ' Дата: ' +
                          Doc.getAttribute('DOC_DATE'))
          else WriteInfo( 'АЦК: "Приложение к выписке дебетовое" № ' +
                          Doc.getAttribute('DOC_NUMBER') + ' Дата: ' +
                          Doc.getAttribute('DOC_DATE'));

        WriteInfo(
            FORMAT( 'ЭД игнорируется - расчетный счет Плательщика %s начинается на 2020.',
                    [ DocXml.GetAttribute('BS_PAY')]));
        EXIT;
      end;

    // exchange #3062 - проверка кбк
    // для старого алгоритма проверяем КЦ
    if NOT CheckKBK_All_BDPDST( DocXml, BudgetId, FALSE)
      then EXIT;

    // =========================== Кредитовое приложение =========================\\
      if Doc.getAttribute('class') = '24' then begin
        Doc.setAttribute('F_CRUSH24', IfThen(param_CrushDoc24, 'True', 'False'));



        if DocXml.getAttribute('BS_RCP') = '' then
        begin
          WriteInfo('АЦК: "Приложение к выписке кредитовое" № ' +
            Doc.getAttribute('DOC_NUMBER') + ' Дата: ' +
            Doc.getAttribute('DOC_DATE'), True);
          WriteInfo('Не создано - не заполнен банковский счет получателя');
          Exit;
        end
        else begin

          // проверяем бюджетные или спецсредства
          BudgXml := GetAccountsByBudget(BudgetId);
          BudgXml := BudgXml.documentElement.childNodes.Item[0];



          if (BudgXml.getAttribute('ACCOUNT_NUMBER') <> DocXml.getAttribute('BS_RCP')) and
            (BudgXml.getAttribute('SPEC_ACCOUNT') <> DocXml.getAttribute('BS_RCP')) then
          begin
            WriteInfo('АЦК: "Приложение к выписке кредитовое" № ' +
              Doc.getAttribute('DOC_NUMBER') + ' Дата: ' +
              Doc.getAttribute('DOC_DATE'), True);
            WriteInfo('Не создано - не найдено соответствие банковского счета получателя' +
              ' счету бюджета');
            Exit;
          end
          else if BudgXml.getAttribute('ACCOUNT_NUMBER') = DocXml.getAttribute('BS_RCP') then
            Doc.setAttribute('F_SS', 'False')
            else if BudgXml.getAttribute('SPEC_ACCOUNT') = DocXml.getAttribute('BS_RCP') then
              Doc.setAttribute('F_SS', 'True') // Flag спец.средств
        end;
        WriteLog('Заполнение данных получателя из выписки', True);
        // exchange #2497
        // При создании ПВК при загрузке ИК, блок получателя их выписки должен
        // тянуться из блока BDPD, а не из блока IK, а организация будет определяться
        // как раньше по реквизитам из IK
        Doc.setAttribute('ORG_ID'       , '');
        Doc.setAttribute('ORG_TAXCODE'  , DocXml.getAttribute('INN_RCP'));
        Doc.setAttribute('ORG_KPP'      , DocXml.getAttribute('KPP_RCP'));
        Doc.setAttribute('ORG_NAME'     , DocXml.getAttribute('CNAME_UBP_RCP'));
    
    {
        Doc.setAttribute('ORG_TAXCODE', IK.getAttribute('INN_UBP'));
        Doc.setAttribute('ORG_KPP', IK.getAttribute('KPP_UBP'));
        Doc.setAttribute('ORG_NAME', IK.getAttribute('NAME_UBP_PUBP'));
        if Doc.getAttribute('ORG_TAXCODE') <> '' then
    }
        // exchange #2497
        // организацию ищем по ИНН и КПП блока IK (блок получатель в ЭД)!
        // если в блоке IK организация не указана - все описание в блоке ЭД
        // "получатель из выписки" будет заполнено из блока файла BDPD.
        { exchange #2505
          если в файле IK.INN_UBP и BDPD.INN_RCP для 24 класса отличаются,
          то поиск для проставления референса осуществлять только по BDPD.INN_RCP
          и BDPD.INN_RCP (искать по ИНН и КПП только среди организаций, которые
          имеют хотя бы одну роль, кроме следующих: Контрагент, Крупный плательщик,
          ЦБФ, Кредитная организация, Генеральный агент, а если КПП 0,
          то только по ИНН только среди тех, которые имеют хотя бы одну роль,
          кроме следующих: Контрагент, Крупный плательщик, ЦБФ,
          Кредитная организация, Генеральный агент), как при загрузке VB.
          В блок "Получатель из выписки" (ИНН, КПП, Наименование) данные
          всегда записывать именно из блока BDPD, а не из найденной в системе
          организации.}
        if ( DocXml.getAttribute('INN_RCP') = IK.getAttribute('INN_UBP'))
          then begin
            // здесь поиск будет выполняться для ИНН и КПП из IK, при этом
            // IK.КПП может быть <> BDPD.КПП.
            // такой случай возможет только для организаций филиалов,
            // когда ИНН у таких организаций одинаковый, но КПП и название разное.
            // при этом на форме delphi КПП и название не собъется (отобразится
            // именно из поле КПП и названия (из раздела BDPD)), а поскольку ИНН
            // должен быть одинаковым, то отображение ИНН будет правильным.
            // но если у филиалов будет другой ИНН - это будет считаться ошибкой БД.
            xSearchOrgBy_TaxCode    := IK.getAttribute('INN_UBP');
            xSearchOrgBy_KPP        := VarToStr( IK.getAttribute('KPP_UBP'));
            xSearchOrgBy_TaxCodeEqu := TRUE;
          end else begin
            xSearchOrgBy_TaxCode    := DocXml.getAttribute('INN_RCP');
            xSearchOrgBy_KPP        := VarToStr( DocXml.getAttribute('KPP_RCP'));
            xSearchOrgBy_TaxCodeEqu := FALSE;
          end;
        // exchange #2497 + #2505
    //    if IK.getAttribute('INN_UBP') <> '' then
        if (xSearchOrgBy_TaxCode <> '') then begin
          // exchange #2497 + #2505
          XmlOrg := GetOrgByTaxKpp( xSearchOrgBy_TaxCode,
                                          //Doc.getAttribute('ORG_TAXCODE'),
                                    xSearchOrgBy_KPP,
                                          //Doc.getAttribute('ORG_KPP'),
                                    '24',
                                    'REC',
                                    False,
                                    Doc);
          if XmlOrg.documentElement.childNodes.length = 1
            then Doc.setAttribute(
                      'ORG_ID',
                      xmlOrg.documentElement.childNodes.item[0].getAttribute('ID'))
            else
              // exchange #2505: если IK.ИНН и BDPD.ИНН отличаются,
              // то по BD ищем только по ИНН, потом по ИНН+КПП.
              // при этом #2093 не используется.
              // если IK.ИНН = BDPD.ИНН, то дополнительно ищем по #2093
              // с учетом кода организации.
              if xSearchOrgBy_TaxCodeEqu then begin
                // exchange #2093 + #2497 + #2505
                XmlOrg := GetOrgByTaxKppBudgIdCode(
                                  xSearchOrgBy_TaxCode,
                                      //Doc.getAttribute('ORG_TAXCODE'),
                                  xSearchOrgBy_KPP,
                                      //Doc.getAttribute('ORG_KPP'),
                                  BudgetId,
                                  IK.getAttribute('KOD_UBP_PUBP'),
                                  '3,6,7,8,17',
                                  True);
                if XmlOrg.documentElement.childNodes.length = 1
                  then Doc.setAttribute(
                            'ORG_ID',
                            XmlOrg.documentElement.childNodes.item[0].getAttribute('ID'));
              end;
        end;
    

        WriteLog('Заполнение данных получателя', True);
        // exchange 2936
        // теперь получатель будет искаться независимо от получателя из выписки.
        // получателя ищем по IK.INN_UBP и IK.KPP_UBP по старому алгоритму
        // поиска получателя из выписки, но заполнять будем поля получателя.
        // если получателя не найдем - тогда заполнять будем по счету бюджета
        // F_SS.
        Doc.setAttribute('REC_ID', '');
        if (IK.getAttribute('INN_UBP') <> '') then begin
          XmlOrg := GetOrgByTaxKpp( IK.getAttribute('INN_UBP'),
                                    IK.getAttribute('KPP_UBP'),
                                    '24',
                                    'REC',
                                    False,
                                    Doc);
          if XmlOrg.documentElement.childNodes.length = 1
            then Doc.setAttribute('REC_ID',
                    xmlOrg.documentElement.childNodes.item[0].getAttribute('ID'))
            else begin
              //Exchange#2093
              XmlOrg := GetOrgByTaxKppBudgIdCode(
                                          IK.getAttribute('INN_UBP'),
                                          IK.getAttribute('KPP_UBP'),
                                          BudgetId,
                                          IK.getAttribute('KOD_UBP_PUBP'),
                                          '3,6,7,8,17',
                                          True);
              if XmlOrg.documentElement.childNodes.length = 1
                then Doc.setAttribute('REC_ID',
                        XmlOrg.documentElement.childNodes.item[0].getAttribute('ID'));
            end;
        end;
        if Doc.getAttribute('REC_ID') <> '' then begin
          Doc.setAttribute('REC_TAXCODE', IK.getAttribute('INN_UBP'));
          Doc.setAttribute('REC_KPP'    , IK.getAttribute('KPP_UBP'));
          Doc.setAttribute('REC_NAME'   , IK.getAttribute('NAME_UBP_PUBP'));
          // exchange #2600 поправлено: DocXml.parentNode эквивалентно IK.
          Doc.setAttribute('REC_ACCOUNT', IK.getAttribute('LS_UBP'));
          //Cчет
          if StrToBool(Doc.getAttribute('F_SS')) then
          begin

            XmlAcc := GetAccAllRekByOrgIdAccNum(Doc.getAttribute('REC_ID'),
              IK.getAttribute('LS_UBP'), '5, 7', '0');
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              Doc.setAttribute('REC_ACC_ID', XmlAcc.getAttribute('ID'));
              Doc.setAttribute('REC_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              Doc.setAttribute('REC_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              Doc.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('SPECUFK_ACC_ID'));
              Doc.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('SPECUFK_ACCOUNT_NUMBER'));
              WriteLog('Найден счет получателя с референсом: ' + XmlAcc.getAttribute('ID'));
            end
            else
              WriteLog('Референс счета получателя не опеределен', True);
          end
          else begin
            Doc.setAttribute('REC_ACC_ID', GetLicAcc(Doc.getAttribute('REC_ID'),
              '5, 7', IK.getAttribute('LS_UBP')));
            if Doc.getAttribute('REC_ACC_ID') <> '' then
            begin
              XmlAcc := GetAccAllRekByAccId(Doc.getAttribute('REC_ACC_ID'), True);
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              Doc.setAttribute('REC_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              Doc.setAttribute('REC_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              if (GetAccType(Doc.getAttribute('REC_ACC_ID')) = '5') or
                ((DocXml.getAttribute('BS_RCP') <> '') and
                (DocXml.getAttribute('BS_RCP') = XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'))) then
              begin
                Doc.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('UFK_ACC_ID'));
                Doc.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'));
              end
              else begin
                Doc.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('INCUFK_ACC_ID'));
                Doc.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('INCUFK_ACCOUNT_NUMBER'));
              end;
              WriteLog('Найден счет получателя с референсом: ' + Doc.getAttribute('REC_ACC_ID'));
            end
            else
              WriteLog('Референс счета получателя не опеределен', True);
          end;
        end
        else begin
          // --- Получатель (владелец счета) ---

          if StrToBool(Doc.getAttribute('F_SS')) then //внебюджет
          begin
            // получатель

            Doc.setAttribute('REC_ID', BudgXml.getAttribute('SPEC_ID'));
            Doc.setAttribute('REC_TAXCODE', BudgXml.getAttribute('SPEC_TAXCODE'));
            Doc.setAttribute('REC_KPP', BudgXml.getAttribute('SPEC_KPP'));
            Doc.setAttribute('REC_NAME', BudgXml.getAttribute('SPEC_DESCRIPTION'));
            // Cчет получателя
            Doc.setAttribute('REC_ACCOUNT', BudgXml.getAttribute('SPEC_ACCOUNT'));
            Doc.setAttribute('REC_ACC_ID', BudgXml.getAttribute('SPEC_ACC_ID'));
          end
          else begin
            // получатель

            Doc.setAttribute('REC_ID', BudgXml.getAttribute('ORG_ID'));
            Doc.setAttribute('REC_TAXCODE', BudgXml.getAttribute('ORG_TAXCODE'));
            Doc.setAttribute('REC_KPP', BudgXml.getAttribute('ORG_KPP'));
            Doc.setAttribute('REC_NAME', BudgXml.getAttribute('ORG_DESCRIPTION'));
            // Cчет получателя
            Doc.setAttribute('REC_ACCOUNT', BudgXml.getAttribute('ACCOUNT_NUMBER'));
            Doc.setAttribute('REC_ACC_ID', BudgXml.getAttribute('ID'));
          end;
        end;
    
        WriteLog('Заполнение данных плательщика', True);
        // --- Плательщик ---
        Doc.setAttribute('PAY_ID', '');
        Doc.setAttribute('PAY_TAXCODE', DocXml.getAttribute('INN_PAY'));
        Doc.setAttribute('PAY_KPP', DocXml.getAttribute('KPP_PAY'));
        Doc.setAttribute('PAY_NAME', DocXml.getAttribute('CNAME_PAY'));
        Doc.setAttribute('PAY_ACCOUNT', DocXml.getAttribute('BS_PAY'));
        //Cчет
        Doc.setAttribute('PAY_ACC_ID', '');
        WriteLog('Поиск референса плательщика по ИНН и КПП', True);
        if Trim(Doc.getAttribute('PAY_TAXCODE')) <> '' then
        begin
          XmlOrg := GetOrgByTaxKpp(Doc.getAttribute('PAY_TAXCODE'),
            Doc.getAttribute('PAY_KPP'), '24', 'PAY', False, Doc);
          if XmlOrg.documentElement.childNodes.Length = 1 then
          begin
            XmlOrg := xmlOrg.documentElement.childNodes.Item[0];
            Doc.setAttribute('PAY_ID', xmlOrg.getAttribute('ID'));
            WriteLog('Найден плательщик с референсом: ' + XmlOrg.getAttribute('ID'));
            WriteLog('Поиск референса счета плательщика', True);
            XmlAcc := GetAccAllRekByOrgIdAccNum(xmlOrg.getAttribute('ID'),
              Doc.getAttribute('PAY_ACCOUNT'));
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              Doc.setAttribute('PAY_ACC_ID', XmlAcc.getAttribute('ID'));
              Doc.setAttribute('PAY_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              Doc.setAttribute('PAY_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              Doc.setAttribute('PAY_UFK_ACCOUNT', XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'));
              Doc.setAttribute('PAY_UFK_ACC_ID', XmlAcc.getAttribute('UFK_ACC_ID'));
              WriteLog('Найден счет плательщика с референсом: ' + XmlAcc.getAttribute('ID'));
            end
            else
              WriteLog('Референс счета плательщика не опеределен', True);
          end
          else
            WriteLog('Референс плательщика не опеределен', True);
        end;
      end else begin
    // =========================== Дебетовое приложение ==========================\\
        if DocXml.getAttribute('BS_PAY') = '' then
        begin
          WriteInfo('АЦК: "Приложение к выписке дебетовое" № ' +
            Doc.getAttribute('DOC_NUMBER') + ' Дата: ' +
            Doc.getAttribute('DOC_DATE'), True);
          WriteInfo('Не создано - не заполнен банковский счет плательщика');
          Exit;
        end
        else begin
          // проверяем бюджетные или спецсредства
          BudgXml := GetAccountsByBudget(BudgetId);
          BudgXml := BudgXml.documentElement.childNodes.Item[0];
          if (BudgXml.getAttribute('ACCOUNT_NUMBER') <> DocXml.getAttribute('BS_PAY')) and
            (BudgXml.getAttribute('SPEC_ACCOUNT') <> DocXml.getAttribute('BS_PAY')) then
          begin
            WriteInfo('АЦК: "Приложение к выписке дебетовое" № ' +
              Doc.getAttribute('DOC_NUMBER') + ' Дата: ' +
              Doc.getAttribute('DOC_DATE'), True);
            WriteInfo('Не создано - не найдено соответствие банковского счета плательщика' +
              ' счету бюджета');
            Exit;
          end
          else if BudgXml.getAttribute('ACCOUNT_NUMBER') = DocXml.getAttribute('BS_PAY') then
            Doc.setAttribute('F_SS', 'False')
            else if BudgXml.getAttribute('SPEC_ACCOUNT') = DocXml.getAttribute('BS_PAY') then
              Doc.setAttribute('F_SS', 'True') // Flag спец.средств
        end;
        WriteLog('Заполнение данных плательщика', True);
        Doc.setAttribute('PAY_ID', '');
        Doc.setAttribute('PAY_TAXCODE', IK.getAttribute('INN_UBP'));
        Doc.setAttribute('PAY_KPP', IK.getAttribute('KPP_UBP'));
        Doc.setAttribute('PAY_NAME', IK.getAttribute('NAME_UBP_PUBP'));
        if Doc.getAttribute('PAY_TAXCODE') <> '' then
        begin
          XmlOrg := GetOrgByTaxKpp(Doc.getAttribute('PAY_TAXCODE'),
            Doc.getAttribute('PAY_KPP'), '', '', False, Doc);
          if XmlOrg.documentElement.childNodes.length = 1 then
            Doc.setAttribute('PAY_ID',
              XmlOrg.documentElement.childNodes.item[0].getAttribute('ID'))
          else begin
            //Exchange#2093
            XmlOrg := GetOrgByTaxKppBudgIdCode(Doc.getAttribute('PAY_TAXCODE'),
              Doc.getAttribute('PAY_KPP'), BudgetId, IK.getAttribute('KOD_UBP_PUBP'));
            if XmlOrg.documentElement.childNodes.length = 1 then
              Doc.setAttribute('PAY_ID',
                XmlOrg.documentElement.childNodes.item[0].getAttribute('ID'));
          end;
        end;
        if Doc.getAttribute('PAY_ID') <> '' then
        begin
          Doc.setAttribute('PAY_ACCOUNT', IK.getAttribute('LS_UBP'));
          //Cчет
          if StrToBool(Doc.getAttribute('F_SS')) then
          begin
            xmlAcc := GetAccAllRekByOrgIdAccNum(Doc.getAttribute('PAY_ID'),
              IK.getAttribute('LS_UBP'), '5, 7', '0');
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              Doc.setAttribute('PAY_ACC_ID', XmlAcc.getAttribute('ID'));
              Doc.setAttribute('PAY_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              Doc.setAttribute('PAY_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              Doc.setAttribute('PAY_UFK_ACC_ID', XmlAcc.getAttribute('SPECUFK_ACC_ID'));
              Doc.setAttribute('PAY_UFK_ACCOUNT', XmlAcc.getAttribute('SPECUFK_ACCOUNT_NUMBER'));
              WriteLog('Найден счет плательщика с референсом: ' + XmlAcc.getAttribute('ID'));
            end
            else
              WriteLog('Референс счета плательщика не опеределен', True);
          end
          else begin
            Doc.setAttribute('PAY_ACC_ID', GetLicAcc(Doc.getAttribute('PAY_ID'),
              '5, 7', IK.getAttribute('LS_UBP')));
            if Doc.getAttribute('PAY_ACC_ID') <> '' then
            begin
              XmlAcc := GetAccAllRekByAccId(Doc.getAttribute('PAY_ACC_ID'), True);
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              Doc.setAttribute('PAY_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              Doc.setAttribute('PAY_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              if (GetAccType(Doc.getAttribute('PAY_ACC_ID')) = '5') or
                ((DocXml.getAttribute('BS_PAY') <> '') and
                (DocXml.getAttribute('BS_PAY') = XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'))) then
              begin
                Doc.setAttribute('PAY_UFK_ACC_ID', XmlAcc.getAttribute('UFK_ACC_ID'));
                Doc.setAttribute('PAY_UFK_ACCOUNT', XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'));
              end
              else begin
                Doc.setAttribute('PAY_UFK_ACC_ID', XmlAcc.getAttribute('INCUFK_ACC_ID'));
                Doc.setAttribute('PAY_UFK_ACCOUNT', XmlAcc.getAttribute('INCUFK_ACCOUNT_NUMBER'));
              end;
              WriteLog('Найден счет плательщика с референсом: ' + Doc.getAttribute('PAY_ACC_ID'));
            end
            else
              WriteLog('Референс счета плательщика не опеределен', True);
          end;
        end
        else begin
          // --- Плательщик (владелец счета) ---
          if StrToBool(Doc.getAttribute('F_SS')) then //внебюджет
          begin
            // Плательщик
            Doc.setAttribute('PAY_ID', BudgXml.getAttribute('SPEC_ID'));
            Doc.setAttribute('PAY_TAXCODE', BudgXml.getAttribute('SPEC_TAXCODE'));
            Doc.setAttribute('PAY_KPP', BudgXml.getAttribute('SPEC_KPP'));
            Doc.setAttribute('PAY_NAME', BudgXml.getAttribute('SPEC_DESCRIPTION'));
            // Cчет плательщика
            Doc.setAttribute('PAY_ACCOUNT', BudgXml.getAttribute('SPEC_ACCOUNT'));
            Doc.setAttribute('PAY_ACC_ID', BudgXml.getAttribute('SPEC_ACC_ID'));
          end
          else begin
            // плательщик
            Doc.setAttribute('PAY_ID', BudgXml.getAttribute('ORG_ID'));
            Doc.setAttribute('PAY_TAXCODE', BudgXml.getAttribute('ORG_TAXCODE'));
            Doc.setAttribute('PAY_KPP', BudgXml.getAttribute('ORG_KPP'));
            Doc.setAttribute('PAY_NAME', BudgXml.getAttribute('ORG_DESCRIPTION'));
            // Cчет плательщика
            Doc.setAttribute('PAY_ACCOUNT', BudgXml.getAttribute('ACCOUNT_NUMBER'));
            Doc.setAttribute('PAY_ACC_ID', BudgXml.getAttribute('ID'));
          end;
        end;
        // --- Получатель ---
        WriteLog('Заполнение данных получателя', True);
        Doc.setAttribute('REC_ID', '');
        Doc.setAttribute('REC_TAXCODE', DocXml.getAttribute('INN_RCP'));
        Doc.setAttribute('REC_KPP', DocXml.getAttribute('KPP_RCP'));
        Doc.setAttribute('REC_NAME', DocXml.getAttribute('CNAME_UBP_RCP'));
        //Cчет
        Doc.setAttribute('REC_ACC_ID', '');
        Doc.setAttribute('REC_ACCOUNT', DocXml.getAttribute('BS_RCP'));
        if Trim(Doc.getAttribute('REC_TAXCODE')) <> '' then
        begin
          WriteLog('Поиск референса получателя по ИНН и КПП', True);
          XmlOrg := GetOrgByTaxKpp(Doc.getAttribute('REC_TAXCODE'),
            Doc.getAttribute('REC_KPP'), '5', 'REC', False, Doc);
          if xmlOrg.documentElement.childNodes.Length = 1 then
          begin
            XmlOrg := XmlOrg.documentElement.childNodes.item[0];
            Doc.setAttribute('REC_ID', XmlOrg.getAttribute('ID'));
            WriteLog('Найден получатель с референсом: ' + XmlOrg.getAttribute('ID'));
            WriteLog('Поиск референса счета получателя', True);
            XmlAcc := GetAccAllRekByOrgIdAccNum(xmlOrg.getAttribute('ID'),
              Doc.getAttribute('REC_ACCOUNT'));
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.item[0];
              Doc.setAttribute('REC_ACC_ID', XmlAcc.getAttribute('ID'));
              Doc.setAttribute('REC_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              Doc.setAttribute('REC_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              Doc.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'));
              Doc.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('UFK_ACC_ID'));
            end
            else
              WriteLog('Референс счета получателя не опеределен', True);
          end
          else
            WriteLog('Референс получателя не опеределен', True);
        end;
      end;

      // exchange #2702
      Exch2702_ImpUIN( Doc, DocXml);

      //получатель доходов, т.к доходы по идее не должны приходить
      Doc.setAttribute('F_INCRECORGID', '');
      Doc.setAttribute('F_INCRECACCID', '');


      // exchange #3081
      // проверка кбк для старого кода
      for i := 0 to DocXml.childNodes.Length - 1 do begin
        xXmlED_Line := DocXml.childNodes.Item[i];
        // exchange #3062 - отмена косгу
        if NOT DoCheckKBK(  xXmlED_Line,
                            BudgetId,
                            FALSE, // пров.КЦ
                            FALSE,   // без косгу
                            param_ShemaLoadDopKbk)
          then begin
            WriteInfo('Найдены КБК в файле, которые отсутствуют в базе АЦК.');
            EXIT;
          end;
      end;//for//


      //инициализим сумму шапки
    
      Doc.setAttribute('AMOUNT', 0.00);
      if (DocXml.childNodes.Length = 1) and
        (StrToBool(DocXml.childNodes.Item[0].getAttribute('F_EMPTYKBK'))) then
      begin
        // записываем сумму документа из строки в шапку
        // поправлена ошибка: сумма должна браться из строки, а не из шапки.
        Doc.setAttribute('AMOUNT',
          Format('%.2f', [StrToCurr(DocXml.childNodes.Item[0].getAttribute('SUM'))]));
        //атрибут говорит о том что строк нет.
        Doc.setAttribute('NOROW', 'True');
      end
      else begin
        // строки документов.
        Doc := Doc.appendChild(Doc.ownerDocument.createElement('PAYORDERLINE'));
        for i := 0 to DocXml.childNodes.Length - 1 do
        begin
          DocXml := DocXml.childNodes.Item[i];
          Doc := Doc.appendChild(Doc.ownerDocument.createElement('PAYORDERLINE'));
          //Если строка с неопределенны кбк, то выходим, сообщив пользователю
          if StrToBool(DocXml.getAttribute('F_EMPTYKBK')) then
          begin
            if Doc.parentNode.parentNode.getAttribute('class') = '5' then
              WriteInfo('АЦК: "Приложение к выписке дебетовое" № ' +
                Doc.parentNode.parentNode.getAttribute('DOC_NUMBER') + ' Дата: ' +
                  Doc.parentNode.parentNode.getAttribute('DOC_DATE') + ' - не создан. ' +
                  'Не определен тип КБК или КБК не заполнен.', True)
            else
              WriteInfo('АЦК: "Приложение к выписке кредитовое" № ' +
                Doc.parentNode.parentNode.getAttribute('DOC_NUMBER') + ' Дата: ' +
                  Doc.parentNode.parentNode.getAttribute('DOC_DATE') + ' - не создан. ' +
                  'Не определен тип КБК или КБК не заполнен.', True);
            Exit;
          end;
          // предзаполнение
          FillElementBySchemaLoad(Doc, DocXml);
          Doc.parentNode.parentNode.setAttribute('AMOUNT',
            Doc.parentNode.parentNode.getAttribute('AMOUNT') +
              StrToCurr(Doc.getAttribute('AMOUNT')));
          AddReplaceAttrVal(DocXml, Doc);
          // Exchange#2101 проставляем в шапку документа тип классификации
          // Anal_kind по последней строке, иначе АЦК некорректно отображает
          if Doc.parentNode.parentNode.getAttribute('class') = '5' then
            Doc.parentNode.parentNode.setAttribute('ANAL_KIND', Doc.getAttribute('ANAL_KIND'));
          if StrToBool(Doc.parentNode.parentNode.getAttribute('F_SS')) and (Doc.getAttribute('ANAL_KIND') = '0') then
            Doc.setAttribute('FSR_ID', 2);
          // Exchange#2079 для доходной классификации в строки 24 класса проставляем плательщика и получателя
          if (Doc.parentNode.parentNode.getAttribute('class') = '24') and (Doc.getAttribute('ANAL_KIND') = '1') then
          begin
            if Doc.parentNode.parentNode.getAttribute('F_INCRECORGID') <> '' then
              Doc.setAttribute('RECEIVER_ID', Doc.parentNode.parentNode.getAttribute('F_INCRECORGID'));
            if Doc.parentNode.parentNode.getAttribute('PAY_ID') <> '' then
              Doc.setAttribute('PAYER_ID', Doc.parentNode.parentNode.getAttribute('PAY_ID'));
          end;

          Doc := Doc.parentNode;
          DocXml := DocXml.parentNode;
        end;
        Doc.parentNode.setAttribute('AMOUNT',
          Format('%.2f', [StrToCurr(Doc.parentNode.getAttribute('AMOUNT'))]));
      end;
      Doc := Doc.ownerDocument;
      Doc := Doc.documentElement;
      if Doc.getAttribute('class') = '5' then
        WriteInfo('АЦК: "Приложение к выписке дебетовое" № ' +
          Doc.getAttribute('DOC_NUMBER') + ' Дата: ' +
            Doc.getAttribute('DOC_DATE') + ' Сумма: ' +
            Doc.getAttribute('AMOUNT'), True)
      else begin
        WriteInfo('АЦК: "Приложение к выписке кредитовое" № ' +
          Doc.getAttribute('DOC_NUMBER') + ' Дата: ' +
            Doc.getAttribute('DOC_DATE') + ' Сумма: ' +
            Doc.getAttribute('AMOUNT'), True);
      end;
      // Вставка документа, проверки и прочее.
      if not VarIsNull(Doc.getAttribute('NOROW')) then
        InsertDebCred(Doc) //вставляем документ 5 или 24 класса без строк.
      else
        Documents_DebCred(Doc);
      DocXml := null;
      except
        ExceptionLog( 'Сбой MakeDocumentIkBD');
    end;

end;

begin
end.
