//Постановка: Exchange #1901
//Доработка: Exchange #2389
uses

  'Un_ImpIK_Doc118',
  'Un_ImpIK_Doc11_ZR',
  'Un_ImpIK_Doc11_ZS',
  'Un_ImportSPD',       // exchange #3062
  'Un_ImpIK_Doc24',
  'Un_ImpIK_Doc35',
  'Un_ImpIK_Doc39',
  'Un_ImpIK_Doc40',
  'Un_ImpIK_Doc5_ZR',
  'Un_ImpIK_Doc75_ZR',
  'Un_ImpIK_Doc75_ZS',
  'Un_ImpIK_Doc75_ZV',
  'Un_ImpIK_Doc80',
  'Un_ImpIK_BDPD_New',
  'Un_ImpIK_BDPD_Old',
  'Un_ImportTools_VI_VJ_VK',
//  'Un_ImpIK_3024',      // exchange #3024
  'Un_ImpIK_Doc215_ZR',   // exchange #2960
  'Un_ImpIK_2965_BDPD',  // exchange #2965
//  'Imp_FK_BH_UF',   // exchange #2846
  'Un_ImpIK_2953_UF',   // exchange #2953
  'Un_ImpIK_2953_UF_Tools',
//  'Imp_FK_BH_Tools',   // exchange #2846
  'Un_Exch2702',      // exchange #2702 ТФФ 12.2
  'Un_ImpIK_2832_UK',   // exchange #2832
  'Un_ImpIK_Doc199_UK_3081', // exchange #3081
//  'Un_ImpIK_2600_BDPD',   // exchange #2600
  'Un_ImpIK_2600_SPD',   // exchange #2600
  'Un_ImpSP_2600',  // exchange #2600
  'Un_ImpIK_2600_ZV',   // exchange #2600
  'Un_ImpIK_2600_ZN',   // exchange #2600
  'Un_ImpIK_2600_ZS',   // exchange #2600
  'Un_ImpIK_2600_ZR',   // exchange #2600
  'Un_ImpIK_2616',          // exchange #2616
//{отладка exchange #2492}      'Un_ImpIK_2492_',
{рабочий модуль exchange #2492} 'Un_ImpIK_2492',
  'Un_ImpIK_Tools',
  'Un_ImpIK_3024',      // exchange #3024
  'Un_Import_IK_SP',       // exchange #3062
  'Un_ImportTools',       // exchange #3062
  'Un_Exch2791',      // exchange #2791
  'Un_Exch2857',      // exchange #2857
  'Un_ImpIK_2855',    // exchange #2855
  'Un_ExchFAIP',        // exchange #2805
  'Un_Import',
  'Un_Imp_Doc195_from_Doc5', // exchange #2831: обязательно перед модулем Un_Import!
  'Un_Import_AuBu',       // exchange #3081
  'Un_DepartmentalInfo',     // для exchange #2600
  'Un_ImportKBK',
  'Un_Exch2405',   // обязательно перед модулем Un_Import!
  'Un_Exch2389',   // обязательно перед модулем Un_Import!
  'Un_ExportKBK',     // exchange #3062
  'Un_Exch2410',   // обязательно перед модулем Un_Import!
  'Un_Default',
  'Un_Class215',
  'Un_OrgAccountGetter',
  'Un_Org',         // перенос кода в этот модуль при доработке exchange #2600
  'QueryWork',
  'QueryKbk',
  'Un_SysParams',     // exchange #2412
  'QueryTools',
  'Un_MessageValidForm',
  'Un_VersionSupport',
  'Un_Schems',
  'Un_ToolsXml',
  'Un_Tools',
  'Un_ConstRef',
  'Un_Progress',
  'Un_System',
  'Un_Log',
  'Un_Debug';

const
  TestFileName = 'Imp_Fk_IK.Xml';

function Main(Xml: Variant): Boolean;
var
  Sr: TFileSearch;
begin

  Result := False;
  xml := InitializeMain( xml, TestFileName);
  if VarIsNull( xml) then exit;

  Sr := TFileSearch.Create;
  try
    try
      Initialize(Xml);
      // exchange #2389
      Initialize_Exch2389( DirIni, param_ShemaLoadDopKbk);

      // exchange #2866
      // если на этапе инициализации будут проблемы, то загрузка невозможна
      // и сразу завершаем выполнение скрипта.
      // такое может быть при конфликте настроек (см.подпрограмму Initialize).

      if FileExists(FileInfo) then EXIT;

      // инициализация модуля описания счета.
      GetOrgAccountGetter_Initialize;



      if Sr.FindFirst(DirIn, faAnyFile) = 0 then
      begin
        repeat
          if (Sr.Name <> '.') and (Sr.Name <> '..') and (Sr.Attr <> faDirectory) then
          begin
            FirstInfo := True;
            FileIn := ExtractFilePath(DirIn) + Sr.Name;
            // exchange #2600 - изменено сообщение
            if MessageDlg('Данные отчета дублируют данные Сводной ведомости ' +
              'по кассовым поступлениям, Сводной ведомости по кассовым выплатам, ' +
              'Выписки из лицевого счета получателя бюджетных средств, Выписки из ' +
              'лицевого счета администратора источников финансирования, '
             +'Выписки из л/с БУ/АУ.'
             +cr
             +'Вы уверены, что хотите загрузить отчет?', mtConfirmation, mbYes + mbNo, 0) = mrNo then
              WriteLog('Загрузка прервана пользователем')
            else begin
              Data := CreateOleObject('Microsoft.XmlDom');
              Data.appendChild(Data.createElement('FORMAT'));
              if NOT TextFileToXml(FileIn) then begin
                WriteInfo( FORMAT( 'Файл %s не будет обрабатываться, поскольку он загружен с ошибками.',
                                    [ FileIn]));
                CONTINUE;
              end;
              if param_CtlValidOn then
                if not ValidateFormat then
                begin
                  ShellExecute('NotePad', FileValidate, False);
                  WriteLog('Не пройден контроль валидности отдельными документами');
                  CONTINUE;//Exit;
                end;
              if LoadFile then
              begin
                CopyFile(FileIn, DirArh + Sr.Name, True);

                DeleteFile(FileIn);
                WriteInfo('Файл обработан.');
              end
              else
                WriteInfo('Файл оставлен в каталоге поиска: ' + FileIn);
            end;
          end;
        until Sr.FindNext <> 0;
        Sr.FindClose;
      end;
    except
      WriteInfo(LastException.Message);
      raise(LastException.Message);
    end;
    Result := True;
  finally
    Sr.Free;
    Finalize_Exch2389;

    Finalize(Xml);
//    ProgressBar.Position := 0;
//    StatusBar.SimpleText := '';
    ShowJournalEnd;
  end;

end; {end Main}




function LoadFile: Boolean;
var
  Xml, Doc, Node, XmlAcc: Variant;
  FinYear, Agreement: String;
  i: Integer;
  List: TStringList;
//  xCheckKBK_Purposefullgrant: boolean;    // exchange #2600
//  xCheckKBK_Result: boolean;
  xIK_LS_UBP: string;
//  xIK_LS_UBP_XX: string;
//  xIK_ZN_NAME_V_SR: string;
//  xIK_UF_FUND_SOURCE: string;
//  xSPRR_DEBET: string;
//  xCheckKBKbyZRST: boolean;
//  xCheckKBK: boolean;
//  xKBK_RCP: string;
//  xKBK_KES: string;
//  xUFPPx_AddClass: string;
  xZR_GUID_FK: TStringList;
  xZR_GUID_FK2: TStringList;
  xZR_GUID_FK_str: string;
  xIK_INN_UBP: string;
  xIK_KPP_UBP: string;
  xList_ACC_I: TStringList;
  xList_ACC_V: TStringList;
  s: string;
begin

    try
      xZR_GUID_FK := NIL;
      xZR_GUID_FK2:= NIL;
      xList_ACC_I := NIL;
      xList_ACC_V := NIL;
      try
        Result := False;
        Data := Data.documentElement;
        WriteInfo('Обработка файла: ' + FileIn);

        WriteLog('Проверка версии формата', True);
        // проверка версии данных по схеме
  
        if NOT CheckVersionSupportData( Data) then Exit;

        // Exchange #2335  л/с нужен для документов 215
        if NOT SearchLS( Data) then EXIT;

        // exchange #2600
        // сохраняем параметр TO.KOD_UBP
        vTO_KOD_UBP := Data.ChildNodes.Item[2].getAttribute('KOD_UBP');

        WriteLog('Определение финансового года по данным отчета', True);
        Vp_Date := Data.childNodes.Item[3].getAttribute('DATE');
        FinYear := Copy(Vp_Date, 7, 4);

        // предварительные проверки, определение бюджета и т.п.
        WriteInfo('Определение бюджета загрузки...', True);

        BudgetId := '';
        if (vTO_KOD_UBP <> '') then begin
          BudgetId := GetBudgetByCodeOrg(vTO_KOD_UBP, FinYear);
          if BudgetId = '' then begin
            WriteInfo(
                  FORMAT(  'Не удалось определить бюджет загрузки по коду организации: %s. '
                          +'Организация должна быть указана в поле "Финансовый орган" '
                          +'или в поле "Организация, осуществляющая исполнение" в карточке бюджета',
                            [ vTO_KOD_UBP]));
            Exit;
          end;
          WriteInfo('Бюджет загрузки определен по коду УБП');
        end else begin
          WriteInfo('Не удалось определить бюджет загрузки по коду организации.' +
            'Поле кода организации TO.KOD_UBP обязательно для заполнения.');
          Exit;
        end;


        WriteLog('Получение данных ФО', True);
        FO := QueryXml(sqlOrgByBudget, [BudgetId]);
        FO := FO.documentElement.childNodes.item[0];
                      {
        //Проверка КБК
        WriteInfo('Проверка КБК в строках документов:', True);
        ChangeKbk := False;
        }
        if param_ShemaLoadDopKbk <> '' then
          WriteInfo('Параметр "Схема загрузки доп кодов из поля ADD_KLASS" = ' +
            param_ShemaLoadDopKbk);
  {
        // exchange #2855
        xIK_ZN_NAME_V_SR := '';
        xIK_UF_FUND_SOURCE := '';
   }
        // exchange #2952
        // в этом списке будем хранить гуиды, которые встретились в каждом
        // поле ZR.GUID_FK.
        xZR_GUID_FK:= TStringList.Create;
        // в этом списке будем хранить гуиды, которые встретились в списке
        // xZR_GUID_FK, т.е. такие гуиды, которые встретились больше одного раза.
        xZR_GUID_FK2:= TStringList.Create;

        // exchange 2993 - список счетов и индексов
        xList_ACC_I := TStringList.Create;
        xList_ACC_V := TStringList.Create;

        for i := 3 to Data.childNodes.Length - 1 do begin
          ProgressBar.Position := ProgressBar.Position + 1;
          Data := Data.childNodes.item[i];


                        {
          // exchange #2600
          // проверка кода цели при проверке КБК.
          // для загрузки ЭД по новому алгоритму, в поле ADD_CLASS находится
          // не код цели, а код субсидии, поэтому, при проверке КБК, код цели
          // проверять не нужно.
          // по умолчанию код цели проверять будем (=FALSE).
          xCheckKBK_Purposefullgrant := FALSE;
          }
          case Data.NodeName of
            // это нужно для разбор раздела BDPD
            'IK': begin
                    xIK_LS_UBP := GetNodeAttributeEx( Data, 'LS_UBP');
                    // exchange #2993 - сохраняем разделы из блока IK
                    xIK_INN_UBP:= GetNodeAttributeEx( Data, 'INN_UBP');
                    xIK_KPP_UBP:= GetNodeAttributeEx( Data, 'KPP_UBP');
                  end;

            // exchange #2952
            // нужно накапливать все ZR.GUID_FK по файлу
            // особенность: формируем список только разных ZR.GUID_FK
            // и только тех, которые повторяются больше чем 1 раз.
            // т.е. если ZR.GUID_FK встречается один раз, то такой гуид
            // не должен попасть в конечный список xZR_GUID_FK2.
            'ZR': begin
                    xZR_GUID_FK_str := VarToStr( Data.getAttribute('GUID_FK'));
                    if (LENGTH( xZR_GUID_FK_str) > 0) then
                      // если такой гуид раньше не попадался - заносим его
                      // в список xZR_GUID_FK
                      if (xZR_GUID_FK.IndexOf( xZR_GUID_FK_str) = -1)
                        then xZR_GUID_FK.Add( xZR_GUID_FK_str)
                        else
                          // если уже встречался - заносим гуид в список
                          // xZR_GUID_FK2 но только один раз.
                          if (xZR_GUID_FK2.IndexOf( xZR_GUID_FK_str) = -1)
                            then xZR_GUID_FK2.Add( xZR_GUID_FK_str);
                  end;

            // exchange #2993
            // сохраняем в списке индекс и счет для этого индекса.
            // индекс = BDPD.GUID_FK+|+IK.INN_UBP+|+IK.KPP_UBPP
            'BDPD': begin
                    s := GetNodeAttributeEx( Data, 'GUID_FK')
                         +'|' + xIK_INN_UBP
                         +'|' + xIK_KPP_UBP;
                    if (xList_ACC_I.IndexOf( s) = -1) then begin

                      xList_ACC_I.Add( s);
                      xList_ACC_V.Add( xIK_LS_UBP);
                    end;
                  end;

            // exchange #2855
//            'ZN': xIK_ZN_NAME_V_SR := VarToStr( Data.getAttribute( 'NAME_V_SR'));

            // exchange #2855
//            'UF': xIK_UF_FUND_SOURCE := VarToStr( Data.getAttribute( 'FUND_SOURCE'));
                   {
            'ZRST':
                if (Data.getAttribute('KOD_IST_KBK') = '6')
                  then xCheckKBK_Purposefullgrant := TRUE;
                    }
                    {
            'ZNKBK':
                if (Data.getAttribute( 'NAME_V_SR') = '6')
                  then xCheckKBK_Purposefullgrant := TRUE;
                     }
                     {
            'ZSCH2':
                if (Data.getAttribute('KOD_IST') = '6')
                  then xCheckKBK_Purposefullgrant := TRUE;
                  }
{
            'ZVDOC':
                if (Data.getAttribute('VID_S') = '6')
                  then xCheckKBK_Purposefullgrant := TRUE;}
         (*
            'SPRR':
                // exchange #2600
                // проверка загрузки SPD по новому алгоритму (со строками SPRR)
                // осуществляется, если в первой строке SPRR.DEBET в 18-м разряде указано
                // значение равно 1.
                // АО утверждает, что во всех строках SPRR одного раздела SPD значения
                // в поле DEBET одинаковые, поэтому мудрить с первой строкой SPRR
                // в разделе SPD нет необходимости.
                // если бы было отличие первой строки и последующих, тогда алгоритм
                // был бы сложнее.
                begin
                  xSPRR_DEBET := VarToStr( Data.getAttribute('DEBET'));
      
                  if (LENGTH( xSPRR_DEBET) >= 18) then
                    if (xSPRR_DEBET[18] <> '1')
                      then xCheckKBK_Purposefullgrant := TRUE;
                end;
                *)
(*
            'BDPDST': begin
                  // exchange #2600
                  // проверяем первые 2 символа л/с IK.LS_UBP
      
                  if (LENGTH( xIK_LS_UBP) < 2)
                    then xIK_LS_UBP_XX := ''
                    else xIK_LS_UBP_XX := COPY( xIK_LS_UBP, 1, 2);
                  // exchange #2600
                  // 2.9.2.	Если в IK.LS_UBP значение начинается с:
                  // 20, 21, 22, 30, 31, 32, обрабатывать блок не по
                  // существующему алгоритму, а по новому
                  // exchange #2926
                  // при загрузке по BDPD для нового алгоритма загружать требуется
                  // код цели как при загрузке VK:
                  // (п.2.10.2.1. Создавать по механизму, аналогичному выписке VK...
                  // в результате нужно анализировать значение BDPDST.ADD_KLASS.
                  if (xIK_LS_UBP_XX in ['20', '21', '22', '30', '31', '32'])
                    then xCheckKBK_Purposefullgrant := TRUE;
                end;
                *)
          end;//case//
          (*
      
            *)
      (*
    // exchange #2600
    // вместа множества IF сделан один CASE
    case Data.NodeName of
    (*
      'ZRST':
            begin
              Default_F_Line(Data);
              Data.setAttribute('KBK', Data.getAttribute('KBK_PAY'));
              Data.setAttribute('TYPE_KBK', Data.getAttribute('TYPE_KBK_PAY'));
              // exchange #2855 - тфф 16
              // 5.1.1.	В поле ZRST.KOD_IST_KBK добавлено возможное значение 5
              //  если ZRST.KOD_IST_KBK=5 эд не создавать.
              // 5.1.2.	Изменена обязательность поля ZRST.TYPE_KBK_PAY на Нет.
              // если ZRST.TYPE_KBK_PAY не заполнен, эд не создавать.
              // 5.1.3.	Изменена обязательность поля ZRST.KBK_PAY на Нет.
              // если ZRST.KBK_PAY не заполнен, эд не создавать.
              // поля ZRST.TYPE_KBK_PAY и ZRST.KBK_PAY не заполняются, если
              // ZRST.KOD_IST_KBK=5. поэтому проверяем: если ZRST.KOD_IST_KBK=5
              // то кбк не проверяем и в дальнейшем эд не создаем.
              xCheckKBKbyZRST := TRUE;
              // exchange #2934
              // добавилась ТФФ 17, поэтому все доработки по ТФФ 16 есть и в ТФФ 17
              // exchange #2996
              // добавилась ТФФ 18 - добавлена обработка как в тфф 17
              // exchange #3040 - к тфф18 и выше
              // поскольку тфф15 уже нет, то здесь тфф уже не проверяется
              {if (IsVersionSupport( cnVersionTFF_16)
                  OR IsVersionSupport( cnVersionTFF_17)
                  OR IsVersionSupport( cnVersionTFF_18)) then}
                if (VarToStr( Data.GetAttribute( 'KOD_IST_KBK')) = '5')
                  then xCheckKBKbyZRST := FALSE;
              if xCheckKBKbyZRST then begin
                // если код цели проверять не нужно (без кода цели),
                // то атрибут ADD_CLASS не заполняем
                if NOT xCheckKBK_Purposefullgrant
                  then Data.setAttribute('ADD_KLASS', Data.getAttribute('ADD_KLASS_PAY'));
                if CheckKBK(  Data,
                              'KBK',
                              BudgetId,
                              param_ShemaLoadDopKbk,
                              xCheckKBK_Purposefullgrant)
                  then ChangeKbk := True;

                      // exchange #2869
                      // дополнительно проверяем поле КОСГУ (ZRST.KBK_RCP c 18 по 20)
                      // поле необязательно для заполнения, поэтому проверяем
                      // только если поле заполнено.
                      xKBK_RCP := VarToStr( Data.GetAttribute( 'KBK_RCP'));
      
                      if (LENGTH( xKBK_RCP) >= 20) then begin
                        xKBK_KES := Copy( xKBK_RCP, 18, 3);
                        if not KbkExists( BudgetId, xKBK_KES, 'Kes') then begin
                          WriteInfo( Format( 'Значение KОСГУ=%s (ZRST.KBK_RCP) не найдено в справочнике '
                                            +'классификаторов бюджета;',
                                             [ xKBK_KES]));

                          // exchange #2995
                          // здесь проблема замены кбк на 0, если косгу не
                          // найден в бд. по exchange #2995 если код =000
                          // то он заменяется на 999, поэтому возникает проблема:
                          // код не найден в бд - заменен на 000, а потом его
                          // заменяют на 999.
                          // поэтому, если код не найден в бд, и заменен на 000,
                          // сохраняем поле KBK_RCP_2869=1. в результате
                          // дальше анализируется это значение и замена на 999
                          // не выполняется.
                          Data.SetAttribute( 'KBK_RCP_2869', '1');

                          xKBK_KES := FormatKbk( 'KES', '0', BudgetId);
                          // обновляем поле ZRST.KBK_RCP с нулевым кодом КОСГУ
                          Data.SetAttribute( 'KBK_RCP',
                                             Copy( xKBK_RCP, 1, 17) + xKBK_KES);
      
                          // фиксируем изменение КБК
                          // эта операция не требуется, поскольку этот КБК не является
                          // существенным и при замене на 0 не должен прерывать
                          // загрузку.
                          //ChangeKbk := True;
                        end;
                      end;
                    end;
                  end;
      *
//            'ZSCH2',
//            'ZVDOC',
            'UFPP',
            'UFPP_N',
//            'ZNKBK',      // exchange #2492 вместо IsCheckKBK_NodeSection_By2492
      //      'UKPP',     // exchange #2832
      //      'UKPP_N',     // exchange #2832
            'BDPDST':
            {
          else if (Data.NodeName = 'ZSCH2') or (Data.NodeName = 'ZVDOC')
            or (Data.NodeName = 'UFPP') or (Data.NodeName = 'UFPP_N')
            // exchange #2492 - требуется проверка КБК для ZN
            or IsCheckKBK_NodeSection_By2492( Data)
            or (Data.NodeName = 'BDPDST') then
            }
                  begin
                    Default_F_Line(Data);

                    // exchange #2855 - тфф16.0
                    // 5.2.1.	В поле ZSCH2.KOD_IST добавлено возможное значение 5.
                    // Добавить условие – документы в системе не создавать,
                    // если ZSCH2.KOD_IST =5.
                    // 5.2.2 и 5.2.3 следствие по 5.2.1
                    // 5.3.1.	В поле ZN.NAME_V_SR добавлено возможное значение 5.
                    // Добавить условие – документы в системе не создавать,
                    // если ZN.NAME_V_SR=5.
                    // 5.4.1.	В поле ZVDOC. VID_S добавлено возможное значение 5.
                    // Добавить условие – документы в системе не создавать,
                    // если ZVDOC.VID_S =5
                    // 5.5.1.	В поле UF. FUND_SOURCE добавлено возможное значение 5.
                    // Добавить условие – документы в системе не создавать,
                    // если UF.FUND_SOURCE =5
                    // для случаев, если эд не создавать, кбк не проверяются.
                    xCheckKBK := TRUE;

                // exchange #2955
                // для создания эд 194/195 по блокам ZR,ZS,ZN,ZV код и тип кбк
                // в файле могут не указываться, в этом случае эд создается
                // с заменой кбк на 0, поэтому, если эти поля пустые и будут
                // созданы жд 194/195, проверку кбк отключаем.
                // причем здесь версию ТФФ не проверяем.
                // эту проверку необходимо выполнять перед проверкой условий
                // по exchange #2855
                if xCheckKBK then begin
  
  (*
                  case Data.NodeName of
{                    'ZSCH2':
                         if ( VarToStr( Data.GetAttribute( 'KOD_IST')) = '6')
                           then xCheckKBK := FALSE;}
                           {
                    'ZNKBK':
                         if ( xIK_ZN_NAME_V_SR = '6')
                           then xCheckKBK := FALSE;}
  {                  'ZVDOC':
                         if ( VarToStr( Data.GetAttribute( 'VID_S')) = '6')
                           then xCheckKBK := FALSE;}
                    'ZRST':
                         if ( VarToStr( Data.GetAttribute( 'KOD_IST_KBK')) = '6')
                           then xCheckKBK := FALSE;
                  end;//case//
                  *
                  // при игнорировании строки добавляем атрибут в строку.
                  // это дает потом исключить проверку по #2855.
                  // главное заполнить атрибут любым значением, чтобы потом
                  // проверить его как vartostr( attr) <> '', а не отдельно
                  // как <>null и <>значение.
                  if NOT xCheckKBK
                    then Data.SetAttribute( '_ignore_2855_', 'yes');
  
                end;

              // exchange #2934
              // добавилась ТФФ 17, поэтому все доработки по ТФФ 16 есть и в ТФФ 17
              // exchange #2996
              // добавилась ТФФ 18 - добавлена обработка как в тфф 17
              // exchange #3040 - к тфф18 и выше
              // поскольку тфф15 уже нет, то здесь тфф уже не проверяется
              if xCheckKBK then begin
                {if (IsVersionSupport( cnVersionTFF_16)
                    OR IsVersionSupport( cnVersionTFF_17)
                    OR IsVersionSupport( cnVersionTFF_18)) then begin}

                  case Data.NodeName of
                  {
                    'ZSCH2':
                         if ( VarToStr( Data.GetAttribute( 'KOD_IST')) = '5')
                           then xCheckKBK := FALSE;}
                           {
                    'ZNKBK':
                         if ( xIK_ZN_NAME_V_SR = '5')
                           then xCheckKBK := FALSE;}
                    'UFPP',
                    'UFPP_N':
                         if ( xIK_UF_FUND_SOURCE = '5')
                           then xCheckKBK := FALSE;
{                    'ZVDOC':
                         if ( VarToStr( Data.GetAttribute( 'VID_S')) = '5')
                           then xCheckKBK := FALSE;}
{                    'ZNKBK':
                         if ( xIK_ZN_NAME_V_SR = '5')
                           then xCheckKBK := FALSE;}
                  end;//case//
               // end;

              end;

                    // если требуется проверка кбк - выполняем ее
                    if xCheckKBK then begin
                      case Data.NodeName of
                        // exchange #2863 - для UFPP/UFPP_N
                        // при проверке этих разделов код цели нужно проверить
                        // на "-" и заменить его на пусто на момент проверки КБК.
                        'UFPP',
                        'UFPP_N': begin
                               xUFPPx_AddClass := Data.GetAttribute( 'ADD_KLASS');
      
                               if (xUFPPx_AddClass = '-')
                                 then Data.SetAttribute( 'ADD_KLASS', '');

                               xCheckKBK_Result := CheckKBK(  Data,
                                                              'KBK',
                                                              BudgetId,
                                                              '',
                                                              xCheckKBK_Purposefullgrant);

                               // восстанавливаем обратно значение поля кода цели
                               Data.SetAttribute( 'ADD_KLASS', xUFPPx_AddClass);
                             end;

//                      'ZSCH2',
                      'BDPDST':
                             xCheckKBK_Result := CheckKBK(  Data,
                                                            'KBK',
                                                            BudgetId,
                                                            param_ShemaLoadDopKbk,
                                                            xCheckKBK_Purposefullgrant);
                      else
                          // exchange #2492 - требуется проверка КБК для ZN
                          if IsCheckKBK_NodeSection_By2492( Data)
                            then xCheckKBK_Result := CheckKBK(  Data,
                                                                'KBK',
                                                                BudgetId,
                                                                param_ShemaLoadDopKbk,
                                                                xCheckKBK_Purposefullgrant)
                            else xCheckKBK_Result := CheckKBK(  Data,
                                                                'KBK',
                                                                BudgetId,
                                                                '',
                                                                xCheckKBK_Purposefullgrant);
                      end;//case//
                      if xCheckKBK_Result
                        then ChangeKbk := True;
                    end;
                  end;

            // exchange #2492 - обработка раздела ZN в IK файле
//            'ZN': CheckParseSectionZN_By2492;
          end;//case//
          *)
          Data := Data.parentNode;
        end;
        {
        if (ChangeKbk) and (not param_changeKBK) then
        begin
          WriteInfo('Найдены КБК в файле, которые отсутствуют в базе АЦК.');
          Exit;
        end;
        if ChangeKbk then
          WriteInfo('Отсутствующие КБК заменены на 0.')
        else
          WriteInfo('Пройдена успешно.');
          }
        WriteInfo('Загрузка документов:');
        Doc := CreateOleObject('Microsoft.XmlDom');
        Doc := Doc.appendChild(Doc.createElement('ROOT'));
        for i := 0 to Data.childNodes.length -1 do
        begin
          Node := Data.childNodes.items[i];
          if Node.nodeName = 'IK' then
          begin
            Doc := Doc.ownerDocument.documentElement;
            Doc := Doc.appendChild(Node.cloneNode(false));
          end
          else
          // exchange #2832
          // из-за того что в UK.GUID_FK по тфф14 может быть пустым,
          // то строить по пустому полю GUID_FK неправильно.
          // нужно проверять наличие атрибута, а не значение.
      //    if (VarToStrDef(Node.getAttribute('GUID_FK'), '') <> '') then
          if NOT VarIsNULL(Node.getAttribute('GUID_FK')) then
          begin
            while Doc.nodeName <> 'IK' do
              Doc := Doc.parentNode;
            Doc := Doc.appendChild(Node.cloneNode(false));
          end
          else
            Doc.appendChild(Node.cloneNode(false));
        end;
        Doc := Doc.ownerDocument.documentElement;
        ProgressBar.Max := Doc.childNodes.Length - 3;
        ProgressBar.Position := 0;
        List := LoadSettings(DirIni + 'Settings\Handling_documents.set');
        try
      
          if List.count = 0 then
          begin
            //Обрабатываем все блоки IK
            for i := 3 to Doc.childNodes.Length -1 do
            begin
              Doc := Doc.childNodes.item[i];
              if Doc.NodeName = 'IK' then
                // если не заполнены поля счета и кода тофк, блок не обрабатываем
                if (Doc.getAttribute('LS_UBP') <> '') and (Doc.getAttribute('KOD_TOFK') <> '') then
                  // exchange #2401
                  // exchange #2600 - отменяет #2401
                  {
                  if ExchTFF10_IK_LS_UBP_CheckBegin( Doc.getAttribute('LS_UBP'))
                    then INC( i)  //???
                    else} begin
                      MakeDocumentIk( Doc,
                                      FinYear,
                                      xZR_GUID_FK2,
                                      vTO_KOD_UBP,
                                      xList_ACC_I,
                                      xList_ACC_V);
                      ProgressBar.Position := ProgressBar.Position + 1;
                    end
                else
                  inc(i);
              Doc := Doc.parentNode;
            end;
          end
          else begin
            //Обрабатываем только те блоки IK, которые подходят под условия
            for i := 3 to Doc.childNodes.Length -1 do
            begin
              Doc := Doc.childNodes.item[i];
              Agreement := '';
              if Doc.NodeName = 'IK' then
                // если не заполнены поля счета и кода тофк, блок не обрабатываем
                if (Doc.getAttribute('LS_UBP') <> '') and (Doc.getAttribute('KOD_TOFK') <> '') then
                  // exchange #2401
                  // exchange #2600 - отменяет #2401
                  {
                  if ExchTFF10_IK_LS_UBP_CheckBegin( Doc.getAttribute('LS_UBP'))
                    then INC( i)  //???
                    else} begin
                      Agreement := Doc.getAttribute('LS_UBP') + '=' + Doc.getAttribute('KOD_TOFK');
                      if FindSettingsType1(Agreement, List) then
                      begin
                        MakeDocumentIk( Doc,
                                        FinYear,
                                        xZR_GUID_FK2,
                                        vTO_KOD_UBP,
                                        xList_ACC_I,
                                        xList_ACC_V);
                        ProgressBar.Position := ProgressBar.Position + 1;
                      end;
                    end
                else
                  inc(i);
              Doc := Doc.parentNode;
            end;
          end;
        finally
          List.Free;
        end;
        Result := True;
        finally
          if (xZR_GUID_FK <> NIL) then xZR_GUID_FK.Free;
          if (xZR_GUID_FK2 <> NIL) then xZR_GUID_FK2.Free;
          if (xList_ACC_I <> NIL) then xList_ACC_I.Free;
          if (xList_ACC_V <> NIL) then xList_ACC_V.Free;
      end;
      except
        ExceptionProc( 'LoadFile');
    end;

end;

//Формирование документов
procedure MakeDocumentIk( DocXml: Variant;
                          aFinYear: string;
                          aZR_GUID_FK: TStringList;
                          aTO_KOD_UBP: string;
                          aList_ACC_I: TStringList;
                          aList_ACC_V: TStringList);
var
  i, j, idx: Integer;
  Doc, UFXml: Variant;
  List: TStringList;
  Flag: Boolean;
  xIK_LS_UBP: string;      // exchange 2600
  xIK_LS_UBP_XX: string;    // exchange 2600
  xID: string;            // exchange 2600
  xSPRR_DEBET: string;
  xSPRR_NewAlgorithm: boolean;
  x2855_DocType: string;
  xCreateDocByZRST: boolean;
  xCreateDocByZSCH2: boolean;
  xCreateDocByZV: boolean;
  xCreateDocByUF: boolean;
  xCreateDoc5: boolean;
  xNode: Variant;
  xDocID: string;
  xCreateDocByZN: boolean;
  xSPD_GUID: string;
  xSPD_NAME_DOC: string;
  xBudgetID: string;
  xXmlTopicLine: Variant;
begin

    try
      // exchange 2600 - IK.LS_UBP
      xIK_LS_UBP:= DocXml.GetAttribute( 'LS_UBP');

      for i := 0 to DocXml.childNodes.Length - 1 do begin
        DocXml := DocXml.childNodes.Item[i];



        Doc := CreateOleObject('Microsoft.XmlDom');
        Doc := Doc.appendChild(Doc.createElement('DOCUMENT'));
        Doc.setAttribute('F_BUDGET_ID', BudgetId);
        Doc.setAttribute('F_ORIGINAL_TYPE', 'IK');

        // exchange #2866
        // создание эд 5го класса теперь индивидуально для каждого из разделов
        // ZR/ZS/ZV/ZN. для прочих разделов эд 5го класса не создается.
        // причем, заполняем флаг (F_CREATE5) прямо в описании создаваемого эд.
        // причем, значение все равно какое, лишь бы был атрибут, а значение
        // отлично от пустой строки.
        // по старому алгоритму было true/false, а сейчас наличие поля
        // указывает на создание эд!
//        Doc.setAttribute('F_CREATE5', IfThen(param_CreateDoc5, 'True', 'False'));
        case DocXml.NodeName of
          'ZR': xCreateDoc5 := vCfg_CreateDoc5_ZR;
          'ZS': xCreateDoc5 := vCfg_CreateDoc5_ZS;
          'ZV': xCreateDoc5 := vCfg_CreateDoc5_ZV;
          'ZN': xCreateDoc5 := vCfg_CreateDoc5_ZN;
          else  xCreateDoc5 := FALSE;
        end;//CASE//
        if xCreateDoc5
          then Doc.SetAttribute( 'F_CREATE5', 'TRUE');//IfThen( xCreateDoc5, 'True', 'False'));


        // exchange #2938
        // чтобы в допЭД анализировать параметр конфига
        // "Схема загрузки доп кодов из поля ADD_KLASS" пихаем его в основной эд.
        Doc.SetAttribute( '__CfgShemaLoadDopKbk__', param_ShemaLoadDopKbk);

        case DocXml.NodeName of
          'ZR': begin
              WriteInfo('---==============---');
              if (VarToStrDef(DocXml.getAttribute('GUID_FK'), '') = '')
                then WriteInfo( FORMAT( 'Не заполнено поле GUID_FK = <%s> для блока ZR',
                                        [ DocXml.getAttribute('GUID_FK')]),
                                True)
                else begin
                  // exchange #3062
                  // получаем первый раздел ZRST. в дальнейшем будем работать
                  // с ним, а не искать его каждый раз.
                  xXmlTopicLine := DocXml.selectSingleNode('ZRST');

                  x2855_DocType := xXmlTopicLine.getAttribute('KOD_IST_KBK');

                  xCreateDocByZRST := TRUE;


                  // exchange #2855 - тфф16.0
                  // 5.1.1 - если ZRST.KOD_IST_KBK=5, писать сообщение в лог
                  // и документы не создавать.
                  if xCreateDocByZRST then
                    // exchange #2934
                    // добавилась ТФФ 17, поэтому все доработки по ТФФ 16 есть и в ТФФ 17
                    // exchange #2996
                    // добавилась ТФФ 18 - добавлена обработка как в тфф 17
                    // exchange #3040 - к тфф18 и выше
                    // поскольку тфф15 уже нет, то здесь тфф уже не проверяется
                    {if (IsVersionSupport( cnVersionTFF_16)
                        OR IsVersionSupport( cnVersionTFF_17)
                        OR IsVersionSupport( cnVersionTFF_18)) then}
                      if (x2855_DocType = '5') then begin
                        WriteInfo( 'Документы по средствам во временном распоряжении не создаются');
                        xCreateDocByZRST := FALSE;
                      end;


                  // exchange #2995
                  // условие проверки KOD_IST_KBK=6 перенесено выше, поскольку
                  // 215й по ZR не создаем никогда, если KOD_IST_KBK=6.
                  if xCreateDocByZRST then
                    if (x2855_DocType = '6') then begin
                      // exchange #2600
                      // 2.3.2.	Если в первой строке KOD_IST_KBK указано значение,
                      // равное 6, обрабатывать блок gпо новому алгоритму
                      // exchange #2952
                      // добавлен список ZR.GUID_FK по всему файлу
                      // добавлен параметр создания эд 194/195
                      Exch2600_Build195_By_IK_ZR( DocXml,
                                                  i,
                                                  BudgetId,
                                                  aFinYear,
                                                  vCfg_2600_CreateED_AUBU,
                                                  xCreateDoc5,
                                                  aZR_GUID_FK,
                                                  param_changeKBK,
                                                  vCfg_CreateParamAUBU);
                      // после обработкипо #2600 другие эд не создаем
                      xCreateDocByZRST := FALSE;
                    end;


                  if xCreateDocByZRST then
                    // exchange #2960
                    // создание эд по блоку IK.ZR. если блок не обработан,
                    // то блок обрабатывается по старому алгоритму
                    if CreateED215_IK_ZR( BudgetId,
                                          DocXml.parentNode,   // IK
                                          DocXml,              // ZR
                                          aZR_GUID_FK,
                                          param_changeKBK)
                      then xCreateDocByZRST := FALSE;


                  if xCreateDocByZRST then
                    // exchange #3062
                    // раньше проверка кбк была до создания эд, поэтому
                    // поле TYPE_KBK переносилось из TYPE_KBK_PAY.
                    // после доработки проверка кбк теперь осществляется уже
                    // на этапе создания эд, поэтому вместо поля TYPE_KBK
                    // придется проверять исходное поле TYPE_KBK_PAY.
                    case xXmlTopicLine.GetAttribute( 'TYPE_KBK_PAY') of
                      '10': begin
                          WriteInfo('АЦК: "Заявка на оплату расходов" № ' +
                            DocXml.getAttribute('NOM_ZR') + ' Дата: ' +
                            DocXml.getAttribute('DATE_ZR') + ' Сумма = ' + DocXml.getAttribute('SUM_V'), True);
                          // exchange #2855 - проверяем строки
                          // если будут проблемы - эд не создаем
                          if CheckIK_ZR_ZRST_2855( DocXml) then begin
                            Doc.setAttribute('DOC_NUMBER', DocXml.getAttribute('NOM_ZR'));
                            Doc.setAttribute('DOC_DATE', DocXml.getAttribute('DATE_ZR'));
                            Doc.setAttribute('AMOUNT', DocXml.getAttribute('SUM_V'));
                            Doc.setAttribute('CASH', '0');
                            Doc.setAttribute('LS', DocXml.parentNode.getAttribute('LS_UBP'));
                            Doc.setAttribute('FOREIGN_KEY', DocXml.getAttribute('GUID_FK'));
                            Doc.setAttribute('class', '11');

                            // exchange #2866
                            // вместо значения boolean прверяем настройку
                            // конфига здесь, и если требуется создавать 5й
                            // но не создавать 11й, то создаем доп.поле
                            // в описании эд.
                            if param_CreateDoc5ZR
                              then Doc.setAttribute( 'F_CREATE5ZR', 'TRUE');

                            // exchange #2616 - заполнение новых полей по ТФФ12
                            // exchange #3062 - убран косгу
                            DoFill2616_FK_BUDGET_CODE_Doc11_ZR( DocXml, Doc);
                            {
                            DoFill2616_FK_BUDGET_CODE(
                                  BudgetId,
                                  VarToStr(
                                      DocXml.selectSingleNode('ZRST').getAttribute('KBK_RCP')),
                                  VarToStr(
                                      DocXml.selectSingleNode('ZRST').getAttribute('TYPE_KBK_RCP')),
                                  Doc);
                                  }

                            // exchange #2805
                            // загрузка поля FAIP
                            if ExchImport_FAIP_Code( DocXml.getAttribute( 'FAIP_CODE'), Doc)
                              then Answer_Documents(Doc, DocXml, DocXml.parentNode);
                          end;
                        end;

                      '20': begin
                          WriteInfo('АЦК: "Заявка на списание спец.средств" № ' +
                            DocXml.getAttribute('NOM_ZR') + ' Дата: ' +
                            DocXml.getAttribute('DATE_ZR') + ' Сумма = ' + DocXml.getAttribute('SUM_V'), True);
                          // exchange #2855 - проверяем строки
                          // если будут проблемы - эд не создаем
                          if CheckIK_ZR_ZRST_2855( DocXml) then begin
                            Doc.setAttribute('DOC_NUMBER', DocXml.getAttribute('NOM_ZR'));
                            Doc.setAttribute('DOC_DATE', DocXml.getAttribute('DATE_ZR'));
                            Doc.setAttribute('AMOUNT', DocXml.getAttribute('SUM_V'));
                            Doc.setAttribute('CASH', '0');
                            Doc.setAttribute('LS', DocXml.parentNode.getAttribute('LS_UBP'));
                            Doc.setAttribute('TAXPAYMENT', '1');
                            Doc.setAttribute('FOREIGN_KEY', DocXml.getAttribute('GUID_FK'));
                            Doc.setAttribute('class', '75');

                            // exchange #2805
                            // загрузка поля FAIP
                            if ExchImport_FAIP_Code( DocXml.getAttribute( 'FAIP_CODE'), Doc)
                              then Answer_Documents(Doc, DocXml, DocXml.parentNode);
                          end;
                        end;

                      '31': begin
                          WriteInfo('АЦК: "Заявка на кассовый расход по источникам" № ' +
                            DocXml.getAttribute('NOM_ZR') + ' Дата: ' +
                            DocXml.getAttribute('DATE_ZR') + ' Сумма = ' + DocXml.getAttribute('SUM_V'), True);
                          // exchange #2855 - проверяем строки
                          // если будут проблемы - эд не создаем
                          if CheckIK_ZR_ZRST_2855( DocXml) then begin
                            Doc.setAttribute('DOC_NUMBER', DocXml.getAttribute('NOM_ZR'));
                            Doc.setAttribute('DOC_DATE', DocXml.getAttribute('DATE_ZR'));
                            Doc.setAttribute('AMOUNT', DocXml.getAttribute('SUM_V'));
                            Doc.setAttribute('LS', DocXml.parentNode.getAttribute('LS_UBP'));
                            Doc.setAttribute('FOREIGN_KEY', DocXml.getAttribute('GUID_FK'));
                            Doc.setAttribute('class', '118');

                            // exchange #2616 - заполнение новых полей по ТФФ12
                            // exchange #3062 - оптимизация кода
                            DoFill2616_FK_BUDGET_CODE(
                                  BudgetId,
                                  GetNodeAttributeEx( xXmlTopicLine, 'KBK_RCP'),
                                  GetNodeAttributeEx( xXmlTopicLine, 'TYPE_KBK_RCP'),
                                  Doc);
{
                            DoFill2616_FK_BUDGET_CODE(
                                  BudgetId,
                                  VarToStr(
                                      DocXml.selectSingleNode('ZRST').getAttribute('KBK_RCP')),
                                  VarToStr(
                                      DocXml.selectSingleNode('ZRST').getAttribute('TYPE_KBK_RCP')),
                                  Doc);}

                            // exchange #2805
                            // загрузка поля FAIP
                            if ExchImport_FAIP_Code( DocXml.getAttribute( 'FAIP_CODE'), Doc)
                              then Answer_Documents(Doc, DocXml, DocXml.parentNode);
                          end;
                        end;

                      // exchange #2855 - тфф 16
                      else CheckIK_ZR_ZRST_2855(
                                DocXml,
                                FORMAT( 'Раздел ZR с полями: № %s Дата: %s Сумма (SUM_V) = %s',
                                        [ DocXml.getAttribute( 'NOM_ZR'),
                                          DocXml.getAttribute( 'DATE_ZR'),
                                          DocXml.getAttribute( 'SUM_V')]));
                    end;//case//
                end;
            end;

          'ZS': begin
              WriteInfo('---==============---');
              if (VarToStrDef(DocXml.getAttribute('GUID_FK'), '') = '')
                then WriteInfo( FORMAT( 'Не заполнено поле GUID_FK = <%s> для блока ZS',
                                        [ DocXml.getAttribute('GUID_FK')]),
                                True)
                else begin

                  x2855_DocType :=
                     DocXml.selectSingleNode('ZSCH2').getAttribute('KOD_IST');


                  xCreateDocByZSCH2 := TRUE;
                  // exchange #2855 - тфф16.0
                  // 5.2.1 - если ZSCH2.KOD_IST=5, писать сообщение в лог
                  // и документы не создавать.
                  if (x2855_DocType = '5') then
                    // exchange #2934
                    // добавилась ТФФ 17, поэтому все доработки по ТФФ 16 есть и в ТФФ 17
                    // exchange #2996
                    // добавилась ТФФ 18 - добавлена обработка как в тфф 17
                    // exchange #3040 - к тфф18 и выше
                    // поскольку тфф15 уже нет, то здесь тфф уже не проверяется
                    {if (IsVersionSupport( cnVersionTFF_16)
                        OR IsVersionSupport( cnVersionTFF_17)
                        OR IsVersionSupport( cnVersionTFF_18)) then} begin
                      WriteInfo( 'Документы по средствам во временном распоряжении не создаются');
                      xCreateDocByZSCH2 := FALSE;
                    end;


                  if xCreateDocByZSCH2 then
                    // exchange #2600
                    // 2.3.2.	Если в первой строке KOD_IST_KBK указано значение,
                    // равное 6, обрабатывать блок gпо новому алгоритму
                    if (x2855_DocType = '6') then begin
                      // exchange #2952
                      // добавлен параметр создания эд 194/195
                      Exch2600_Build194_By_IK_ZS( DocXml,
                                                  i,
                                                  BudgetId,
                                                  aFinYear,
                                                  vCfg_2600_CreateED_AUBU,
                                                  xCreateDoc5,
                                                  param_changeKBK,
                                                  vCfg_CreateParamAUBU);
                      // после обработкипо #2600 другие эд не создаем
                      xCreateDocByZSCH2 := FALSE;
                    end;


                  if xCreateDocByZSCH2 then
                    case DocXml.selectSingleNode('ZSCH2').getAttribute('TYPE_KBK') of
                      '10': begin
                          WriteInfo('АЦК: "Заявка на оплату расходов" № ' +
                            DocXml.getAttribute('NOM_ZVK') + ' Дата: ' +
                            DocXml.getAttribute('DATE_ZVK') + ' Сумма = ' +
                            DocXml.getAttribute('SUM_ITOG'), True);
                          if CheckIK_ZS_ZSCH2_2855( DocXml) then begin
                            Doc.setAttribute('DOC_NUMBER', DocXml.getAttribute('NOM_ZVK'));
                            Doc.setAttribute('DOC_DATE', DocXml.getAttribute('DATE_ZVK'));
                            Doc.setAttribute('AMOUNT', DocXml.getAttribute('SUM_ITOG'));
                            Doc.setAttribute('CASH', '1');
                            Doc.setAttribute('LS', DocXml.parentNode.getAttribute('LS_UBP'));
                            Doc.setAttribute('FOREIGN_KEY', DocXml.getAttribute('GUID_FK'));
                            Doc.setAttribute('class', '11');
                            Answer_Documents(Doc, DocXml, DocXml.parentNode);
                          end;
                        end;
                      '20': begin
                            WriteInfo('АЦК: "Заявка на списание спец.средств" № ' +
                              DocXml.getAttribute('NOM_ZVK') + ' Дата: ' +
                              DocXml.getAttribute('DATE_ZVK') + ' Сумма = ' +
                              DocXml.getAttribute('SUM_ITOG'), True);
                            if CheckIK_ZS_ZSCH2_2855( DocXml) then begin
                              Doc.setAttribute('DOC_NUMBER', DocXml.getAttribute('NOM_ZVK'));
                              Doc.setAttribute('DOC_DATE', DocXml.getAttribute('DATE_ZVK'));
                              Doc.setAttribute('AMOUNT', DocXml.getAttribute('SUM_ITOG'));
                              Doc.setAttribute('CASH', '1');
                              Doc.setAttribute('LS', DocXml.parentNode.getAttribute('LS_UBP'));
                              Doc.setAttribute('TAXPAYMENT', '1');
                              Doc.setAttribute('FOREIGN_KEY', DocXml.getAttribute('GUID_FK'));
                              Doc.setAttribute('class', '75');
                              Answer_Documents(Doc, DocXml, DocXml.parentNode);
                            end;
                          end;

                      // exchange #2855 - тфф 16
                      else CheckIK_ZS_ZSCH2_2855(
                                DocXml,
                                FORMAT( 'Раздел ZS с полями: № %s Дата: %s Сумма (SUM_ITOG) = %s',
                                        [ DocXml.getAttribute( 'NOM_ZVK'),
                                          DocXml.getAttribute( 'DATE_ZVK'),
                                          DocXml.getAttribute( 'SUM_ITOG')]));
                    end;//case//
                end;
            end;

          // exchange #2492 - разбор раздела ZN
          // exchange #2600
          // 2.5.2.	Если в поле ZN.NAME_V_SR указано значение равное 6,
          // обрабатывать блок по новому алгоритму
          // exchange #3062
          // немного переделан алгоритм для максимальной отладки, хотя исходный
          // вариант оптимизирован по производительности и коду.
          'ZN': begin
              WriteInfo('---==============---');
              x2855_DocType := DocXml.getAttribute( 'NAME_V_SR');

              xCreateDocByZN := TRUE;


              // exchange #2855 - тфф16.0
              // 5.3.1.	В поле ZN.NAME_V_SR добавлено возможное значение 5.
              // Добавить условие – документы в системе не создавать,
              // если ZN.NAME_V_SR=5
              // exchange #2934
              // добавилась ТФФ 17, поэтому все доработки по ТФФ 16 есть и в ТФФ 17
              // exchange #2996
              // добавилась ТФФ 18 - добавлена обработка как в тфф 17
              // exchange #3040 - к тфф18 и выше
              // поскольку тфф15 уже нет, то здесь тфф уже не проверяется
              if (x2855_DocType = '5') then begin
                WriteInfo( 'Документы по средствам во временном распоряжении не создаются');
                xCreateDocByZN := FALSE;
              end;


              if xCreateDocByZN then
                if (x2855_DocType = '6') then begin
                  // exchange #2952
                  // добавлен параметр создания эд 194/195
                  Exch2600_Build194_By_IK_ZN( DocXml,
                                              i,
                                              BudgetId,
                                              aFinYear,
                                              vCfg_2600_CreateED_AUBU,
                                              xCreateDoc5,
                                              param_changeKBK,
                                              vCfg_CreateParamAUBU);
                  xCreateDocByZN := FALSE;
                end;


              if xCreateDocByZN
                then ParseSectionZN_By2492( Doc, DocXml);
            end;

          'ZV': begin
              WriteInfo('---==============---');
              if (DocXml.childNodes.Length <= 0)
                then WriteInfo( FORMAT( 'Раздел ZV с полями: № %s Дата: %s не содержит подразделов',
                                        [ DocXml.getAttribute('NOM_ZV'),
                                          DocXml.getAttribute('DATE_ZV')]))
                else
                  if (VarToStrDef(DocXml.getAttribute('GUID_FK'), '') = '')
                    then WriteInfo( FORMAT( 'Не заполнено поле GUID_FK = <%s> для блока ZV',
                                            [ DocXml.getAttribute('GUID_FK')]),
                                    True)
                    else begin
                      x2855_DocType :=
                         DocXml.childNodes.Item[0].getAttribute('VID_S');


                      xCreateDocByZV := TRUE;

                      // exchange #2855 - тфф16.0
                      // 5.4.1 - если ZVDOC.VID_S=5, писать сообщение в лог
                      // и документы не создавать.
                      if (x2855_DocType = '5') then
                        // exchange #2934
                        // добавилась ТФФ 17, поэтому все доработки по ТФФ 16 есть и в ТФФ 17
                        // exchange #2996
                        // добавилась ТФФ 18 - добавлена обработка как в тфф 17
                        // exchange #3040 - к тфф18 и выше
                        // поскольку тфф15 уже нет, то здесь тфф уже не проверяется
                        {if (IsVersionSupport( cnVersionTFF_16)
                            OR IsVersionSupport( cnVersionTFF_17)
                            OR IsVersionSupport( cnVersionTFF_18)) then} begin
                          WriteInfo( 'Документы по средствам во временном распоряжении не создаются');
                          xCreateDocByZV := FALSE;
                        end;


                      if xCreateDocByZV then
                        if (x2855_DocType = '6') then begin
                          // exchange #2600
                          // 2.6.2.	Если в первой строке ZVDOC.VID_S указано
                          // значение равное 6, обрабатывать блок gпо новому алгоритму
                          // exchange #2952
                          // добавлен параметр создания эд 194/195
                          Exch2600_Build195_By_IK_ZV( DocXml,
                                                      i,
                                                      BudgetId,
                                                      aFinYear,
                                                      vCfg_2600_CreateED_AUBU,
                                                      xCreateDoc5,
                                                      param_changeKBK,
                                                      vCfg_CreateParamAUBU);
                          xCreateDocByZV := FALSE;
                        end;


                      if xCreateDocByZV then
                        case DocXml.childNodes.Item[0].getAttribute('TYPE_KBK') of
                          '31': begin
                              WriteInfo('АЦК: "Заявка на возврат по источникам" № ' +
                                DocXml.getAttribute('NOM_ZV') + ' Дата: ' +
                                DocXml.getAttribute('DATE_ZV') + ' Сумма = ' +
                                ifThen(DocXml.childNodes.item[0].getAttribute('SUM_R') = '',
                                  DocXml.childNodes.item[0].getAttribute('SUM_V'),
                                  DocXml.childNodes.item[0].getAttribute('SUM_R')), True);
                              // exchange #2855
                              if CheckIK_ZV_ZVDOC_2855( DocXml) then begin
                                Doc.setAttribute('DOC_NUMBER', DocXml.getAttribute('NOM_ZV'));
                                Doc.setAttribute('DOC_DATE', DocXml.getAttribute('DATE_ZV'));
                                Doc.setAttribute('AMOUNT', ifThen(DocXml.childNodes.item[0].getAttribute('SUM_R') = '',
                                  DocXml.childNodes.item[0].getAttribute('SUM_V'),
                                  DocXml.childNodes.item[0].getAttribute('SUM_R')));
                                Doc.setAttribute('LS', DocXml.parentNode.getAttribute('LS_UBP'));
                                Doc.setAttribute('FOREIGN_KEY', DocXml.getAttribute('GUID_FK'));
                                Doc.setAttribute('class', '80');

                                // exchange #2805
                                // загрузка поля FAIP
                                if ExchImport_FAIP_Code( DocXml.getAttribute( 'FAIP_CODE'), Doc)
                                  then Answer_Documents(Doc, DocXml, DocXml.parentNode);
                              end;
                            end;

                          '20': begin
                              WriteInfo('АЦК: "Заявка на списание спец.средств" № ' +
                                DocXml.getAttribute('NOM_ZV') + ' Дата: ' +
                                DocXml.getAttribute('DATE_ZV') + ' Сумма = ' +
                                ifThen(DocXml.childNodes.item[0].getAttribute('SUM_R') = '',
                                  DocXml.childNodes.item[0].getAttribute('SUM_V'),
                                  DocXml.childNodes.item[0].getAttribute('SUM_R')), True);
                              // exchange #2855
                              if CheckIK_ZV_ZVDOC_2855( DocXml) then begin
                                Doc.setAttribute('DOC_NUMBER', DocXml.getAttribute('NOM_ZV'));
                                Doc.setAttribute('DOC_DATE', DocXml.getAttribute('DATE_ZV'));
                                Doc.setAttribute('AMOUNT', ifThen(DocXml.childNodes.item[0].getAttribute('SUM_R') = '',
                                  DocXml.childNodes.item[0].getAttribute('SUM_V'),
                                  DocXml.childNodes.item[0].getAttribute('SUM_R')));
                                Doc.setAttribute('CASH', '0');
                                Doc.setAttribute('LS', DocXml.parentNode.getAttribute('LS_UBP'));
                                Doc.setAttribute('TAXPAYMENT', '0');
                                Doc.setAttribute('FOREIGN_KEY', DocXml.getAttribute('GUID_FK'));
                                Doc.setAttribute('class', '75');
                                Doc.setAttribute('F_BLOC', True);

                                // exchange #2805
                                // загрузка поля FAIP
                                if ExchImport_FAIP_Code( DocXml.getAttribute( 'FAIP_CODE'), Doc)
                                  then Answer_Documents(Doc, DocXml, DocXml.parentNode);
                              end;
                            end;

                          // exchange #2855 - тфф 16
                          else CheckIK_ZV_ZVDOC_2855(
                                    DocXml,
                                    FORMAT( 'Раздел ZV с полями: № %s Дата: %s Сумма (%s) = %s',
                                            [ DocXml.getAttribute('NOM_ZV'),
                                              DocXml.getAttribute('DATE_ZV'),
                                              ifThen( DocXml.childNodes.item[0].getAttribute('SUM_R') = '',
                                                      'SUM_V',
                                                      'SUM_R'),
                                              ifThen( DocXml.childNodes.item[0].getAttribute('SUM_R') = '',
                                                      DocXml.childNodes.item[0].getAttribute('SUM_V'),
                                                      DocXml.childNodes.item[0].getAttribute('SUM_R'))]));
                        end;//case//
                    end;
            end;

          'UF': begin
                  WriteInfo('---==============---');
                  x2855_DocType := VarToStr( DocXml.getAttribute( 'FUND_SOURCE'));


                  xCreateDocByUF := TRUE;

                  // exchange #2855 - тфф16.0
                  // 5.5.1 - если UF.FUND_SOURCE=5, писать сообщение в лог
                  // и документы не создавать.
                  if (x2855_DocType = '5') then
                    // exchange #2934
                    // добавилась ТФФ 17, поэтому все доработки по ТФФ 16 есть и в ТФФ 17
                    // exchange #2996
                    // добавилась ТФФ 18 - добавлена обработка как в тфф 17
                    // exchange #3040 - к тфф18 и выше
                    // поскольку тфф15 уже нет, то здесь тфф уже не проверяется
                    {if (IsVersionSupport( cnVersionTFF_16)
                        OR IsVersionSupport( cnVersionTFF_17)
                        OR IsVersionSupport( cnVersionTFF_18)) then} begin
                      WriteInfo( 'Документы по средствам во временном распоряжении не создаются');
                      xCreateDocByUF := FALSE;
                    end;


                  if xCreateDocByUF then begin
                    WriteLog(
                        FORMAT( 'АЦК: "Уведомление об уточнении вида и принадлежности платежа" '
                               +'№ %s Дата: %s',
                                [ DocXml.getAttribute('NOM_UF'),
                                  DocXml.getAttribute('DATE_UF')]),
                        True);

                    // exchange #3062
                    // проверяем кбк перед загрузкой раздела UF.
                    // если проверка не успешная - эд не создаем.
                    if NOT CheckKBK_All_UFPP_UFPPN( DocXml, BudgetId)
                      then xCreateDocByUF := FALSE;
                  end;


                  if xCreateDocByUF then begin
                    Doc.setAttribute('DOC_NUMBER', DocXml.getAttribute('NOM_UF'));
                    Doc.setAttribute('DOC_DATE', DocXml.getAttribute('DATE_UF'));
                    Doc.setAttribute('LS', DocXml.parentNode.getAttribute('LS_UBP'));
                    Doc.setAttribute('DECLINE', 'False'); //отказы здесь не приходят

                    // exchange #2582
                    // При обраотке ЭД  "Уведомление об уточнении вида и принадлежности
                    // платежа", найденного по блоку UF файла IK в "Дату исполнения"
                    // ЭД необходимо проставлять дату из файла IK.DATE
                    //Doc.setAttribute('CARRY_DATE', DateTimeToXml(StrToDate(Doc.getAttribute('DOC_DATE'))));
                    Doc.setAttribute( 'CARRY_DATE', DateTimeToXml( StrToDate( Vp_Date)));

                    Doc.setAttribute('class', '114');

                    // exchange #2903
                    // в начале ищем 114й по старому алгоритму.
                    // если его нашли эд 215го не создаем но меняем
                    // статус выгрузки (по старому).
                    xDocID := GetAnswerDocId( Doc);
                    if ( LENGTH( xDocID) > 0) then begin
                      xCreateDocByUF := FALSE;
                      UpdateExtStatusED( xDocID, Doc);
                      //Documents_Answer(Doc);
                    end;// else begin

                    if xCreateDocByUF then begin
                      // exchange #2930
                      // если по старому не нашли - ищем по новому.
                      // если нашли - ничего не делаем, а только отображаем
                      // сообщение в журнале.
                      xDocID := Search_ED114_By_IK_UF(
                                        Doc.getAttribute('DOC_NUMBER'),
                                        Doc.getAttribute('DOC_DATE'),
                                        DocXml,
                                        BudgetId,
                                        DocXml.parentNode.getAttribute('LS_UBP'));
                      if ( LENGTH( xDocID) > 0) then begin
                        WriteInfo(
                            FORMAT( 'Найден ЭД "Уведомление об уточнении вида и принадлежности платежа" '
                                   +'№ %s Дата: %s на статусе %s, поэтому справка не сфомирована.',
                                    [ DocXml.getAttribute('NOM_UF'),
                                      DocXml.getAttribute('DATE_UF'),
                                      QueryField(
                                            ' select DISPSTATUS_ID S'
                                           +' from ' + TableForClass( '114')
                                           +' where ID = ?',
                                            [ xDocID],
                                            'S',
                                            FALSE)]),
                            True);
                        xCreateDocByUF := FALSE;
                      end;
                    end;
                  end;


                  // exchange #2903
                  // создание эд 215го по exchange #2846 перенесено ниже
                  // поиска эд 114го. поскольку по exchange #2846 требовалось
                  // создавать 215й только если не найден 114й.
                  if xCreateDocByUF then
                    // exchange #2846
                    // создание эд 215х из IK.UF если настройка конфигурации
                    // "Создавать дополнительные документы"<>нет
                    // exchange #3018
                    // поправлено потому что произошли накладки с переменной
                    // param_CreateDocuments
                    if (vCfg_CreateDopDoc <> 0) then begin
                      // exchange #2855 - проверяем строки UFPP и UFPP_N
                      // если проверка не пройдет - то и 215й не будет создан.
                      // эта проверка перенесена и не участвует на момент
                      // поиска эд 114го.
                      // exchange #2953
                      // отключена проверка блоков - это все реализовано внутри
                      // формирования эд 215го по IK.UF.

                      //if CheckIK_UF_UFPP_UFPP_N_2855( DocXml) then
                        // при создании 215го по IK.UF строки не проверяем,
                        // поскольку по #2845 и #2846 в разделе UF проверяются
                        // все необходимые данные.
                        // exchange #2903
                        // добавлен параметр - запись сообщений в журнал info.
                        // в результате, все сообщения будут сохраняться в
                        // журнале info, в отличие от загрузчика по BH.
                        case DoCreateDoc215_UF_IK(
                                        DocXml,
                                        BudgetId,
                                        aTO_KOD_UBP,
                                        DocXml.parentNode.getAttribute('LS_UBP'),
                                        // если кбк в бд не найдены, считаем строки
                                        // UFPP/UFPP_N ошибочными
                                        FALSE,
                                        param_changeKBK,
                                        FALSE,
                                        TRUE) of
                          0,10: begin {заглушка} end;
                          else  WriteInfo('ЭД "Справка по внебанковским операциям" по блоку UF не создан.');
                        end;//case//
                        //xCreateDocByUF := FALSE;
                    end else begin
                      // exchange #2903
                      // если значение настройки
                      // "Создавать дополнительные документы"=нет нужно
                      // отобразить запись в логе info.
                      WriteInfo( 'По конфигурации не создается ЭД "Справка по внебанковским операциям" по блоку UF.');
                    end;
                end;

          { exchange #2600
            2.7.	Обработка UK.
            2.7.1.	В списке ЭД 198 класса по Номеру, Дате, Лицевому счету
                    (на основной закладке) ищем документ на статусе «Готов к
                    исполнению» внешний статус «Выгружен». Если однозначно найден,
                    обрабатываем с заполнением даты исполнения из IK.DATE
                    (меняем внешний статус на «Проверен»).
            2.7.2.	Если не найден, обрабатываем дальше документы данного блока.}
          'UK': begin
              WriteInfo('---==============---');
              WriteInfo( FORMAT( 'АЦК: "Справка-уведомление об уточнении операций БУ/АУ"'
                                +' № %s Дата: %s л/с: %s',
                                 [ DocXml.getAttribute('NOM_UK'),
                                   DocXml.getAttribute('DATE_UK'),
                                   xIK_LS_UBP]),
                         True);

              // из за того что требуется искать ЭД с учетом л/с
              // функция Answer_Documents не подходит.
              xID := SearchDoc198ByNomDateLS( Budget_Id,
                                              DocXml.getAttribute('NOM_UK'),
                                              DocXml.getAttribute('DATE_UK'),
                                              xIK_LS_UBP);
              if (LENGTH( xID) <= 0)
                then
                  try
                    // exchange #2832
                    // При обработке блока UK, если:
                    //  1.	документ класса 198 не найден в системе (то есть
                    //      нет ни одного);
                    //  2.	параметр конфигурации «Создавать документы БУ/АУ»
                    //      имеет значение «Да», то требуется формировать ЭД
                    //      класса 199 (справка по операциям БУ/АУ) согласно
                    //      описанию реквизитного состава, приведенного в
                    //      таблице 1, в начальном статусе с возможностью
                    //      редактирования.
                    // exchange #2912
                    // добавился параметр счета IK.LS_UBP
                    // exchange #2945
                    // добавлено доведение эд 199го до 10го статуса по конфигу
                    // exchange #2942
                    // создание эд 199го по каждой уточняемой строке (по конфигу)
                    // exchange #3081
                    // по настройке обрабатываем UK по старому #2832
                    // или по новому #3081.

                    if vCfg_2600_CreateED_AUBU then
                      if vCfg_CreateDoc199byUK_old
                        then Exch2832_Build199_By_IK_UK(
                                                DocXml,
                                                i,
                                                BudgetId,
                                                aFinYear,
                                                xIK_LS_UBP,
                                                vCfg_ChangeStatusED199to10,
                                                vCfg_CreateMultiED199)
                        else Exch3081_Build199_By_IK_UK(
                                                DocXml,
                                                i,
                                                BudgetId,
                                                aFinYear,
                                                xIK_LS_UBP,
                                                vCfg_ChangeStatusED199to10,
                                                vCfg_CreateMultiED199)
                      else WriteInfo( 'Документ не найден.')
                    except
                      WriteInfo( 'Сбой обработки раздела UK: '
                                  + LastException.Message);
                  end
                else
                  try
                    ExecProc( 'DOCUMENT',
                              [ 'action', 'update_extstatus',
                                'class', '198',
                                'ID', xID,
                                'EXTSTATUS_ID', '4',
                                'CARRY_DATE', DateTimeToXml( StrToDate( Vp_Date)),
                                'FROM', 'AZK_Exchange'],
                              Budget_Id);
                    WriteInfo( 'Смена внешнего статуса документа на "Проверен".');
                    except
                      WriteInfo( 'Ошибка при переводе внешнего статуса: '
                                  + LastException.Message);
                  end
            end;

          'SPD': begin
              WriteInfo('---==============---');
              xSPD_GUID := GetNodeAttributeEx( DocXml, 'GUID');
              if ( LENGTH( xSPD_GUID) <= 0) then begin
                WriteInfo(
                    FORMAT( 'Не заполнено поле GUID = <%s> для блока SPD',
                            [ xSPD_GUID]),
                    True);
              end else begin
                // exchange #2600
                // 2.8.2.	(поправка) Если в первой строке в 18м разряде
                // SPRR.DEBET указано значение, не равное 1, обрабатывать блок
                // не по существующему алгоритму, а по новому алгоритму
                xSPRR_NewAlgorithm := FALSE;

                xSPRR_DEBET :=
                      VarToStr(
                          DocXml.selectSingleNode('SPRR').getAttribute('DEBET'));

                if (LENGTH( xSPRR_DEBET) >= 18) then
                  if (xSPRR_DEBET[18] <> '1')
                    then xSPRR_NewAlgorithm := TRUE;

                // exchange #3134
                // доведение эд 199го до 10го статуса при загрузке IK.SP
                if xSPRR_NewAlgorithm then begin
                  Exch2600_Build195_By_IK_SPD( DocXml,
                                               i,
                                               BudgetId,
                                               aFinYear,
                                               vCfg_2600_CreateED_AUBU,
                                               vCfg_ChangeStatusED199to10);

                end;

                { exchange #3062
                  с целью автоматической отладки переделано условие
                  запуска старой ветки кода, если в 18м разряде
                  SPRR.DEBET указано значение равное 1.
                  вместо else проверяем: NOT xSPRR_NewAlgorithm.}
                if NOT xSPRR_NewAlgorithm then begin
                  List := LoadSettings(DirIni + 'Settings\TypeKBK.set');
                  try


                    if List.count = 0 then
                      WriteInfo('Справка  ф.0504833 не обрабатывается, т.к не заполнен файл' +
                        ' соответствия КБК и типа КБК (TypeKBK.set)', True)
                    else begin
                      xSPD_NAME_DOC := DocXml.getAttribute('NAME_DOC');
                      xBudgetID := Doc.getAttribute('F_BUDGET_ID');
                      case LowerCase( xSPD_NAME_DOC) of
                        'уведомление об уточнении вида и принадлежности платежа': begin
                            UFXml := GetAnswerUf(Doc, DocXml);
                            if (UFXml.documentElement.childNodes.Length = 1) and
                              (UFXml.documentElement.childNodes.item[0].getAttribute('DISPSTATUS_ID') = '16') then
                            begin
                              try
                                ExecProc('DOCUMENT', ['action', 'update_extstatus', 'class', '114',
                                  'ID', UFXml.documentElement.childNodes.item[0].getAttribute('ID'),
                                  'EXTSTATUS_ID', '4', 'CARRY_DATE',
                                  DateTimeToXml(StrToDate(DocXml.getAttribute('DATE_DOC')))],
                                  xBudgetID {Doc.getAttribute('F_BUDGET_ID')});
                                WriteInfo('---==============---');
                                WriteInfo('АЦК: "Уведомление об уточнении вида и принадлежности платежа" № ' +
                                  DocXml.getAttribute('NUM_DOC') + ' Дата: ' +
                                  DocXml.getAttribute('DATE_DOC'), True);
                                WriteInfo('Смена внешнего статуса документа/"Проверен"');
                              except
                                WriteInfo('Ошибка при переводе внешнего статуса: ' + LastException.Message);
                              end;
                            end
                            else if UFXml.documentElement.childNodes.Length = 0 then begin

                              // exchange #2792
                              // если необходимо создавать доп.документы,
                              // то проверяется, если создаются эд класса 215,
                              // то проверяем в бд дубли 215го класса и создаем
                              // эд 215го класса вместо 39,40,24. но при этом
                              // необходимо проверить наличие эд 39,40,24-х классов
                              // чтобы не задвоились платежки.
                              if param_CreateDocuments then begin
                                if param_CreateDocuments215 then begin
                                  if IsLoaded_SPIK( xBudgetID, xSPD_GUID)//DocXml.getAttribute('GUID'))
                                    then WriteInfo('Блок SPD: Повторная загрузка документа - пропущен', True)
                                    else
                                  if IsLoaded215( xBudgetID, xSPD_GUID)//DocXml.getAttribute('GUID'))
                                    then WriteInfo('Блок SPD: Повторная загрузка документа 215 - пропущен', True)
                                    else SortSPD( 'IK', Doc, DocXml, DocXml.parentNode, List);
                                end else begin
                                  // если эд 215го класса не создаются,
                                  // то работаем по старому - проверка и создание
                                  // эд 24,39,40го класса
                                  if IsLoaded_SPIK( xBudgetID, xSPD_GUID)//DocXml.getAttribute('GUID'))
                                    then WriteInfo('Блок SPD: Повторная загрузка документа - пропущен', True)
                                    else SortSPD( 'IK', Doc, DocXml, DocXml.parentNode, List);
                                end;
                              end else begin
                                // если доп.документы не создаются проверяем,
                                // если включен параметр создания эд 215го класса,
                                // то проверяем в бд дубли 215го класса и создаем
                                // эд 215го класса вместо 39,40,24. но при этом
                                // необходимо проверить наличие эд 39,40,24-х классов
                                // чтобы не задвоились платежки.
                                if param_CreateDocuments215 then begin
                                  if IsLoaded_SPIK( xBudgetID, xSPD_GUID)//DocXml.getAttribute('GUID'))
                                    then WriteInfo('Блок SPD: Повторная загрузка документа - пропущен', True)
                                    else
                                  if IsLoaded215( xBudgetID, xSPD_GUID)//DocXml.getAttribute('GUID'))
                                    then WriteInfo('Блок SPD: Повторная загрузка документа 215 - пропущен', True)
                                    else SortSPD( 'IK', Doc, DocXml, DocXml.parentNode, List);
                                end else begin
                                  WriteLog('Блок SPD: Доп.документы не создаются - пропущен');
                                end;
                              end;
                            end
                            else if UFXml.documentElement.childNodes.Length > 1 then
                              WriteInfo(Format('Найдено несколько (%d) уведомлений(я) об уточнении' +
                                ' вида и принадлежности с № %s от %s', [UFXml.documentElement.childNodes.Length,
                                DocXml.getAttribute('NUM_DOC'), DocXml.getAttribute('DATE_DOC')]));
                          end;

                        //else if LowerCase(DocXml.getAttribute('NAME_DOC')) in
                        'объявление на взнос наличными',
                        'внутренний внебанковский документ',
                        'справка ф. 0504833', 'справка ф.0504833',
                        // exchange #2911 - добавлено новое значение (небыло реализовано
                        // добавление по exchange #2848)
                        'расшифровка сумм неиспользованных (внесенных через банкомат'
                       +' или пункт выдачи наличных денежных средств) средств',
                        // exchange #2848 - добавлено новое значение
                        'расшифровка неиспользованных средств по банковским картам': begin
                            // exchange #2792
                            // если необходимо создавать доп.документы,
                            // то проверяется, если создаются эд класса 215,
                            // то проверяем в бд дубли 215го класса и создаем
                            // эд 215го класса вместо 39,40,24.
                            if param_CreateDocuments then begin
                              if param_CreateDocuments215 then begin
                                if IsLoaded_SPIK( xBudgetID, xSPD_GUID)//DocXml.getAttribute('GUID'))
                                  then WriteInfo('Блок SPD: Повторная загрузка документа - пропущен', True)
                                  else
                                if IsLoaded215( xBudgetID, xSPD_GUID)//DocXml.getAttribute('GUID'))
                                  then WriteInfo('Блок SPD: Повторная загрузка документа 215 - пропущен', True)
                                  else SortSPD( 'IK', Doc, DocXml, DocXml.parentNode, List);
                              end else begin
                                // если эд 215го класса не создаются,
                                // то работаем по старому - проверка и создание
                                // эд 24,39,40го класса
                                if IsLoaded_SPIK( xBudgetID, xSPD_GUID)//DocXml.getAttribute('GUID'))
                                  then WriteInfo('Блок SPD: Повторная загрузка документа - пропущен', True)
                                  else SortSPD( 'IK', Doc, DocXml, DocXml.parentNode, List);
                              end;
                            end else begin
                              // если доп.документы не создаются, проверяем,
                              // если включен параметр создания эд 215го класса,
                              // то проверяем в бд дубли 215го класса и создаем
                              // эд 215го класса вместо 39,40,24.
                              if param_CreateDocuments215 then begin
                                if IsLoaded_SPIK( xBudgetID, xSPD_GUID)//DocXml.getAttribute('GUID'))
                                  then WriteInfo('Блок SPD: Повторная загрузка документа - пропущен', True)
                                  else
                                if IsLoaded215( xBudgetID, xSPD_GUID)//DocXml.getAttribute('GUID'))
                                  then WriteInfo('Блок SPD: Повторная загрузка документа 215 - пропущен', True)
                                  else SortSPD( 'IK', Doc, DocXml, DocXml.parentNode, List);
                              end else begin
                                WriteInfo('Не созданы дополнительные документы по блоку SPD, ' +
                                  'т.к параметр "Создавать дополнительные документы" выключен ', True);
                              end;
                            end;
                          end;

                        else
                            WriteInfo(
                                FORMAT( 'Не определен класс документа по полю NAME_DOC = %s',
                                        [ xSPD_NAME_DOC]), True);
                      end;//case//
                    end;
                    finally
                      List.Free;
                  end;
                end;
              end;
            end;

          'BDPD': begin
              WriteInfo('---==============---');
              if (VarToStrDef(DocXml.getAttribute('GUID_FK'), '') = '')
                then WriteInfo( FORMAT( 'Не заполнено поле GUID_FK = <%d> для блока BDPD',
                                      [ DocXml.getAttribute('GUID_FK')]),
                                True)
                else begin
                  // exchange #2600
                  // проверяем первые 2 символа л/с IK.LS_UBP
                  if (LENGTH( xIK_LS_UBP) < 2)
                    then xIK_LS_UBP_XX := ''
                    else xIK_LS_UBP_XX := COPY( xIK_LS_UBP, 1, 2);



                  // exchange #2600
                  // 2.9.2.	Если в IK.LS_UBP значение начинается с:
                  // 20, 21, 22, 30, 31, 32, обрабатывать блок не по
                  // существующему алгоритму, а по новому
                  // exchange #2993
                  // добавлены списки дя поиска счета aList_ACC_x
                  if (xIK_LS_UBP_XX in ['20', '21', '22', '30', '31', '32'])
                    then MakeDocumentIkBD_New( Doc,
                                                DocXml,
                                                DocXml.parentNode,
                                                aFinYear,
                                                FALSE,
                                                aList_ACC_I,
                                                aList_ACC_V)
                    else MakeDocumentIkBD(  Doc,
                                            DocXml,
                                            DocXml.parentNode,
                                            aFinYear);
                end;
            end;

          // exchange #2616 ТФФ12. добавлен блок ZK без обработки
          // код взят из скрипта PT. раньше в IK такого небыло.
          else begin
                  WriteInfo( FORMAT( 'Пропущен: документ c маркером=%s не обрабатывается.',
                                      [ DocXml.NodeName]),
                             True);
                end;
        end;
        Doc := null;
        DocXml := DocXml.parentNode;
      end;
      except
        ExceptionLog( 'Сбой MakeDocumentIk');
    end;

end;




{~Answer_Documents
  процедура для поиска и создания доп. документов, а так же создание эд 5го
  класса из созданных доп эд или создание эд 5го класса из 1гго по блоку ZR.

  exchange #2866
  (Imp_FK_IK создание эд 11,118,80,75 с созданием эд 5.vsd)
  изменен алгоритм:
    1) если по настрйке в конфиге требуется создать доп.документы,
      они создаются.
      если при этом требуется создать эд 5го класса (наличие атрибута F_CREATE5
        в описании эд Doc), то после создания доп.эд (Doc) этот эд доводится
        до необходимого статуса и вызывается метод создания эд 5го из него.

    2) если загружаемый эд (Doc) найден в бд (на нужном статусе) без guid_fk,
    проверяется:
      если найдено несколько эд - пишется сообщение в лог и ничего не делается.
      если найден один эд, проверяется:
        если в эд, который найден в бд, не заполнено поле GUID_FK,
        то оно заполняется из файла.
        если требуется создавать эд 5го, то будет выполняться создание эд 5го
        из найденного эд в бд методом user_commit (старый код).

    3) если по п.2 в бд найдено несколько эд или не найдено ни одного эд, то:
       если включена настройка:
         Создавать дебетовое приложение на основании блока ZR = да, то:
           а) в лог записывается "Документ не найден"
           б) создается ЭД 5го класса по описанию ZR,
              без создание ЗОР по описанию ZR.
         эта настройка несовместима с созданием 11го и созданием 5го из 11го,
         поэтому на этапе загрузке нужно проверить этот конфликт.

    4) если параметр конфигурации:
       "Создавать дополнительные документы" = не создавать
       то ЭД не будет создан а в лог пишется "Документ не найден".

    5) проверяется повторная загрузка эд (по FOREIGN_KEY)
       если эд есть в бд, то ничего не создается, а в логе пишется про
       повторную загрузку.

    6) выполняется проверка по #2857:
       если в конфиге выбран параметр «Создавать дополнительные документы»
       =«Справки по расходам, доходам, источникам» или =НЕТ.
       то эд по разделам ZR,ZS,ZN,ZV не создаем а в логе пишется сообщение.

    7) создается эд 11,75,118,80х классв.
       если установлена настройка "создавать эд 5го класса", то созданный эд
       доводится до необходимого статуса и вызывается метод создания эд 5го
       класса. при этом поиск эд 5го класса в бд не выполняется.}
procedure Answer_Documents(Doc, DocXml, IK: Variant);
var
  Document: Variant;
  xCreateED5: boolean;
  xDocFound: integer;
begin

    try
      // exchange #2866
      // добавлена проверка создания эд 5го класса из доп.классов.
      // сейчас достаточно проверить наличие атрибута F_CREATE5
      // на значение отличное от пустой строки
      if (LENGTH( VarToStr( Doc.getAttribute('F_CREATE5'))) > 0)
        then xCreateED5 := TRUE
        else xCreateED5 := FALSE;


      // поиск эд
      Document := GetDocIdforIK(Doc);
      xDocFound := Document.documentElement.childNodes.Length;

      if (xDocFound = 1) then begin
        Document := Document.documentElement.childNodes.Item[0];

        if Document.getAttribute('GUID_FK') <> ''
          then WriteInfo('Поле GUID_FK уже заполнено')
          else
            try
              ExecProc( 'EXCHPROC',
                        [ 'action', 'guid_fk',
                          'class', Doc.getAttribute('class'),
                          'ID', Document.getAttribute('ID'),
                          'VERSION', Document.getAttribute('VERSION'),
                          'GUID_FK', Doc.getAttribute('FOREIGN_KEY')]);
              WriteInfo('Обновление поля GUID_FK документа');
            except
              WriteInfo('Ошибка при обновлении поля GUID_FK: ' + LastException.Message);
            end;

      // exchange #2866
      // здесь проверяем наличие атрибута F_CREATE5 в описании Doc
      // вместо переменных конфигурации
//        if param_CreateDoc5 then
        if xCreateED5 then
          try
            ExecProc( 'DOCUMENT',
                      [ 'action', 'user_commit',
                        'class', Doc.getAttribute('class'),
                        'ID', Document.getAttribute('ID')],
                      Doc.getAttribute('F_BUDGET_ID'));
            WriteInfo( 'АЦК: "Приложение к выписке дебетовое" № ' +
                        Doc.getAttribute('DOC_NUMBER') + ' Дата: ' +
                        Doc.getAttribute('DOC_DATE') + ' Сумма: ' +
                        Doc.getAttribute('AMOUNT'), True);
            WriteInfo('Слинкован');
          except
            WriteInfo('Ошибка при создании дебетового приложения: ' + LastException.Message);
          end;

        EXIT;
      end;

      // если включена настройка:
      // Создавать дебетовое приложение на основании блока ZR,
      // то в лог записывается "Документ не найден" и создается ЭД 5го класса
      // по описанию ZR, без создание ЗОР по описанию ZR.
      // exchange #2866
      // теперь достаточно проверить только наличие атрибута и пустое значение,
      // а не проверять значение как boolean.
      if (LENGTH( VarToStr( Doc.getAttribute( 'F_CREATE5ZR'))) > 0) then begin
        WriteInfo('Документ не найден');
        // вместо 11го создаем 5й из 11го
        Doc.setAttribute('class', '5');
        CreateDoc5(Doc, DocXml, IK);
        EXIT;
      end;

      if (xDocFound > 1) then begin
        WriteInfo(
              Format(
                  'Найдено несколько (%s) документа(ов) %s класса с № %s от %s',
                  [ INTTOSTR( xDocFound),
                    Doc.getAttribute('class'),
                    Doc.getAttribute('DOC_NUMBER'),
                    Doc.getAttribute('DOC_DATE')]));
        EXIT;
      end;

      // если параметр конфигурации:
      // "Создавать дополнительные документы" = не создавать
      // то ЭД не будет создан а в лог пишется "Документ не найден".

      if NOT param_CreateDocuments then begin
        WriteInfo('Документ не найден');
        EXIT;
      end;

      // проверка на повторную загрузку
      if IsLoaded( Doc.getAttribute('F_BUDGET_ID'),
                   Doc.getAttribute('class'),
                   Doc.getAttribute('FOREIGN_KEY'))
        then WriteInfo('Повторная загрузка документа - пропущен', True)
        else
          // exchange #2857
          // не создаем эд если параметр конфига
          // «Создавать дополнительные документы» не соответствует нужному значению
          // exchange #2866
          // добавлено создание эд 5го класса из доп.классов.
          if Check_2857_
            then CreateDocuments(Doc, DocXml, IK, xCreateED5);
      except
        ExceptionLog( 'Сбой Imp_FK_IK.Answer_Documents');
    end;

end;





{~CreateDocuments
  создание доп.документов.

  exchange #2866
  добавлен параметр aCfgCreateED5 - создание эд 5го из создаваемого эд Doc.
  если параметр = TRUE - то создаваемый эд Doc доводится до нужного статуса
  и взывается метод АЦК-Ф для создания эд 5го из него.
  здесь особенность:
    если требуется создавать эд 5й из создаваемого эд, то созданный эд
    будет доводится до нужного статуса (по exchange #2866).
    если эд 5го класса создавать не нужно, то созданный эд будет находится
    на статусе по старому алгоритму.
    для этого последние два параметра подпрограммы Exec_ChildDoc
    будут одинаковыми и будут соответствовать флагу создания эд 5го класса.}
procedure CreateDocuments( Doc, DocXml, IK: Variant;
                           aCfgCreateED5: boolean = FALSE);
var
  ChildDoc: Variant;
begin

    try
      WriteLog('Формирование документа ...', True);
      case Doc.getAttribute('class') of
        '11': begin
              WriteInfo('---==============---');
              // exchange #2492 - создание ЭД 11-го класса по разделу ZN
              // если ЭД создан - выходим из подпрограммы.
              if CreateDocZN_By2492( Doc,
                                      DocXml,
                                      IK,
                                      BudgetId,
                                      param_Search_Bo,
                                      param_UseGroupBuh25,
                                      aCfgCreateED5)
                then EXIT;

              // exchange #3010
              //
              try
                if Doc.getAttribute('CASH') = 0 then begin
                  if CreateDoc11(Doc, DocXml, IK) then
                    Exec_ChildDoc( Doc.getAttribute('BUDGET_ID'),
                                   '',
                                   Doc,
                                   aCfgCreateED5,
                                   aCfgCreateED5);
                end
                else begin
                  // exchange #3010
                  SetIgnoreAzkErrors( ';AZK-1099;1099;');
                  if CreateDoc11ZS(Doc, DocXml, IK) then
                    Exec_ChildDoc( Doc.getAttribute('BUDGET_ID'),
                                   '',
                                   Doc,
                                   aCfgCreateED5,
                                   aCfgCreateED5);
                end;
                finally
                  SetIgnoreAzkErrors( '');
              end;
            end;
        '75': begin
              WriteInfo('---==============---');
              //для 75 класса блока ZV алгоритм заполнения другой.
              if (not VarIsNull(Doc.getAttribute('F_BLOC')))
                and (StrToBool(Doc.getAttribute('F_BLOC'))) then
              begin
                if CreateDoc75ZV(Doc, DocXml, IK) then
                  Exec_ChildDoc( Doc.getAttribute('BUDGET_ID'),
                                 '',
                                 Doc,
                                 aCfgCreateED5,
                                 aCfgCreateED5);
              end
              else
                if Doc.getAttribute('CASH') = 0 then
                begin
                  if CreateDoc75(Doc, DocXml, IK) then
                    Exec_ChildDoc( Doc.getAttribute('BUDGET_ID'),
                                   '',
                                   Doc,
                                   aCfgCreateED5,
                                   aCfgCreateED5);
                end
                else if CreateDoc75ZS(Doc, DocXml, IK) then
                  Exec_ChildDoc( Doc.getAttribute('BUDGET_ID'),
                                 '',
                                 Doc,
                                 aCfgCreateED5,
                                 aCfgCreateED5);
          end;
        '118': begin
              WriteInfo('---==============---');
              if CreateDoc118(Doc, DocXml, IK) then
                Exec_ChildDoc( Doc.getAttribute('BUDGET_ID'),
                               '',
                               Doc,
                               aCfgCreateED5,
                               aCfgCreateED5);
          end;
        '80': begin
              WriteInfo('---==============---');
              if CreateDoc80(Doc, DocXml, IK) then
                Exec_ChildDoc( Doc.getAttribute('BUDGET_ID'),
                               '',
                               Doc,
                               aCfgCreateED5,
                               aCfgCreateED5);
          end;
      end;
      except
        ExceptionLog( 'Сбой CreateDocuments');
    end;

end;

procedure Initialize(Xml: Variant);
var
  SL: TStringList;
  s: string;
begin

    try
      SL := TStringList.Create;
      with SL do
        try
          CommaText := InitializeDefault(Xml, ChangeFileExt(TestFileName, ''), False);
          param_CrushDoc24 := Values['Схема загрузки кредитового приложения'] =
            'разбивать многострочный документ';
        //    param_CreateDocuments := Values['Создавать дополнительные документы'] = 'Да';
          param_CreateDoc24 := Values['Формировать приложение к выписке кредитовое' +
            ' по Объявлению на взнос наличными'] = 'Да';
    //      param_CreateDoc5 := Values['Создавать дебетовое приложение на основании ЭД,' +
    //        ' созданных по блокам ZR, ZS, ZV'] = 'Да';
          param_ShemaLoadDopKbk := Values['Схема загрузки доп кодов из поля ADD_KLASS'];
          param_UseGroupBuh25 := Values['Поиск разрешения на открытие л/с с ' +
            'учетом группы по бухгалтерии'] = 'Да';
          param_CreateDoc5ZR := Values['Создавать дебетовое приложение на основании блока ZR'] = 'Да';
          param_Search_Bo := Values['Автоподстановка бюджетного обязательства'] = 'Да';

          // exchange #3009
          vCfg3009 := Values['Исключить из загрузки BDPD пречисления на 40116'] = 'Да';


          // проверяем по опции, какой документ нужно создавать по параметру
          // "Создавать Справки ф.0504833" в cfg.
          // exchange #2355
          // если выбрано "не создавать документы", блокируем создание документов
          // вообще. сообщение уже создано в подпрограмме.
          // exchange #2792
          // добавлено 4-е условие: Создание документа класса 215 (SP,IK,SF)
          // "Справка по внебаковским операциям" без создания заявок.
          // exchange #2857
          // создаем эд, если выбран п.5, но при этом в первую очередь проверяем
          // условия CfgParameter2857
          // exchange #3018
          // добавлен в конфигурацию параметр "Справка по внебанковским операциям"
          // при этом будут создаваться только эд 215е без заявок.
          // этот параметр учитывает обработку блоков IK.UF!
          // из-за накладок с param_CreateDocuments, добавлена дополнительная
          // переменная vCfg_CreateDopDoc. в ней будет хранится значение
          // "Создавать дополнительные документы" как есть.
          vCfg_CreateDopDoc := ParseParameterCreateDocument(
                                  Values['Создавать дополнительные документы']);
          // в этом параметре хранится флаг создания доп.эд для определенных
          // значений параметра "Создавать дополнительные документы".
          // доп.эд создаются не для всех значений параметра!
          // по exchange #3018 добавлено значение "Справка по внебанковским операциям"
          // по которому создаются эд 215е, но не создаются доп.эд.
          // однако для раздела UF нужно создавать эд 215е.
          param_CreateDocuments :=
              (ParseParameterCreateDocument(
                          Values['Создавать дополнительные документы']) in [1,2,3,5]);

          // exchange #2857
          CfgParameter2857(
               ParseParameterCreateDocument(
                          Values['Создавать дополнительные документы']));

          // поскольку документ 215 объединяет в себе документы "справки по расходам,
          // доходам, источникам" вместе взятые, то при создании документа 215
          // будем пользоваться уже имеющимся кодом по созданию других документов.
          // exchange #2792
          // отменяет это условие
          {
          if param_CreateDocuments215
            then param_CreateDocuments := TRUE;
            }

          // exchange #2600
          // настройка "Создавать документы БУ/АУ"
          vCfg_2600_CreateED_AUBU := (Values[ 'Создавать документы БУ/АУ'] = 'Да');

          // exchange #2866
          // Создавать дебетовое приложение на основании ЭД, созданных по блокам
          // здесь указывается не название параметра, а ID - поскольку если в
          // параметре указан идентификатор параметра, то передается именно
          // идентификатор а не название параметра.
          s := Values[ 'param_CreateDoc5'];
          if (POS( 'ZR', s) > 0)
            then vCfg_CreateDoc5_ZR := TRUE
            else vCfg_CreateDoc5_ZR := FALSE;
          if (POS( 'ZS', s) > 0)
            then vCfg_CreateDoc5_ZS := TRUE
            else vCfg_CreateDoc5_ZS := FALSE;
          if (POS( 'ZV', s) > 0)
            then vCfg_CreateDoc5_ZV := TRUE
            else vCfg_CreateDoc5_ZV := FALSE;
          if (POS( 'ZN', s) > 0)
            then vCfg_CreateDoc5_ZN := TRUE
            else vCfg_CreateDoc5_ZN := FALSE;
    

          // exchange #2866
          // здесь нужно проверить конфликт двух настроек:
          // Создавать дебетовое приложение на основании блока ZR = да
          // и Создавать дебетовое приложение на основании ЭД, созданных по блокам
          // =ZR. в этом случае и нужно создавать эд 11го класса по ZR,
          // и одновременно не нужно. в этом случае будет сообщение об ошибке
          // в конфигурации и загрузка не будет выполнена
          if (vCfg_CreateDoc5_ZR AND param_CreateDoc5ZR) then begin
            WriteInfo( 'В конфигурации указаны несовместимые параметры '
                      +'"Создавать дебетовое приложение на основании блока ZR"=Да и '
                      +'"Создавать дебетовое приложение на основании ЭД, созданных по блокам"=ZR');
            WriteInfo( 'Загрузка не возможна.');
          end;

          // exchange #2952
          vCfg_CreateParamAUBU := Values[
                'Заменять значение аналитического кода АУ/БУ в строке на 0 при отсутствии  в справочнике'];
    

          // exchange #2791
          // настройка "Позволять загружать 0 в КБК ИДП"
          DoConfig_2791_LoadKBK0_PI_BUDGET_CODE( SL);

          // exchange #2945
          // добавлен новый параметр в конфигурацию
          vCfg_ChangeStatusED199to10 :=
                  (Values[ 'Автоматическая обработка справок'] = 'Да');

          // exchange #2942
          // добавлен новый параметр в конфигурацию
          vCfg_CreateMultiED199 :=
                  (Values[ 'Формировать отдельные справки из многострочных документов']
                    = 'Да');

          // exchange #3081
          vCfg_CreateDoc199byUK_old :=
                  (Values[ 'Работа по аналитическому коду расходов']
                    = 'КОСГУ');
          finally
            SL.Free;
        end;
      // Exchange 2336 загружаем схему в зависимости от версии + отменяется ТФФ8
      // exchange #2542 - переход на тфф11 + переработка модуля проверки версий схем
      LoadSchema( GetFileNameSchemaTFF( 'ik_txik*'));
      // exchange #3081
      InitializationSPD;
    {
      LoadSchema(DirIni + VersionSchemsDir
                    + IfVersionSupportThenElse(
                        cnVersionTFF_10,
                        'ik_txik130101.xml',
                        'ik_txik120801.xml'));}

      except
        ExceptionProc( 'Initialize');
    end;

end; {End Initialize}

procedure Finalize(Xml: Variant);
begin
  
  FinalizationSPD;       // exchange #3081
  FinalizeDefault(Xml);
  FinalizeMain;
end; {End Finalize}

{var
  Xml: Variant;}

begin
  Main(NULL);{
  Xml := LoadXmlTest(TestFileName);
  if not VarIsNull(Xml) then
    Main(Xml);}
end.
