//АЦК: Заявка на получение наличных денег
//Постановка: Exchange #1541
// #2344 - убран спец параметр
// #2389 - доработка получения значения ADD_KLASS по ТФФ9
// #2399 - ТФФ10
uses
  'Un_Exch2739',    // #2739 - контроль выгрузки
  'Un_Exch2719',    // exchange #2719
  'Un_Exch2675',
  'Un_Exch2467',     // exchange #2467
  'Un_Export_AuBu',    // exchange #3081
  'Un_Export',
  'Un_Exch2344',
  'Un_Org',
  'Un_Default',
  'Un_OrgAccountGetter',
  'QueryWork',
  'QueryKbk',
  'Un_SysParams',     // exchange #2412
  'QueryTools',
  'Un_MessageValidForm',
  'Un_VersionSupport',
  'Un_Schems',
  'Un_ToolsXml',
  'Un_Tools',
  'Un_Const',
  'Un_Progress',
  'Un_System',
  'Un_Log',
  'Un_Debug';

const
  TestFileName = 'Exp_Fk_ZS.Xml';
var
  param_Spec1, param_SpecS, param_SVR: Boolean;

function Main(Xml: Variant): Boolean;
begin
  Result := False;
  xml := InitializeMain( xml, TestFileName);
  if VarIsNull( xml) then exit;
  try
    try
      Initialize(Xml);
      // инициализация модуля описания счета.
      GetOrgAccountGetter_Initialize;

      //заполнение содержимого файла.
      if not MakeFormat(Xml) then
        Exit;
      //валидация схем.
      if param_CtlValidOn then begin

        if NOT ValidateFormatXml( Data, Schema, RegExp, FileValidate) then begin
          // если опция останавливать выгрузку если контроль валидности не пройден
          // то отображаем диалог с ошибкой и ожидаем действия пользователя.
          if param_StopAllUnloadDocNotValid then
            if NOT ShowMessageValid( FileValidate,
                                     'Не пройден контроль валидности отдельными документами')
              then begin
                WriteLog('Выгрузка прервана пользователем');
                Exit;
              end;
        end;
      end;
      try
        FileTmp := DirTmp + FileOut;
        WriteLog('Сохранение во временном каталоге: ' + FileTmp, True);
        XmlToTextFile(FileTmp);
      except
        raise('Ошибка сохранения: ' + FileTmp);
      end;
      // exchange #2719
      ExportOutDirExch2719( Xml.documentElement.getAttribute('EXCH_DATE'),
                            'ZS');
      WriteLog('Перенос документов в архив', True);
      Move_To_Arhiv(Xml);
//      WriteLog('Перенос файла в исходящий каталог: ' + DirOut + FileOut, True);
//      CopyFile(DirTmp + FileOut, DirOut + FileOut, False);
      if Trim(DirArh) <> '' then
      begin
        WriteLog('Копирование файла в каталог архива, согласно настройке');
        CopyFile(DirTmp + FileOut, DirArh + FileOut, False);
        if not FileExists(DirArh + FileOut) then
          ShowMessage('Не удалось скопировать файл в каталог архива:' +
              DirArh + FileOut);
      end;

        // exchange #2968 - формируем конечный файл с учетом создания zip архива
        CopyExportResultFile( DirTmp + FileOut, DirOut);
{
      if not FileExists(DirOut + FileOut) then
        MessageDlg('Ошибка копирования в исходящий каталог.' + #13 + #10 +
            'Файл находится: ' + DirTmp + FileOut, mtError, mbOk, 0)
      else
        DeleteFile(DirTmp + FileOut);
        }
    Result := True;
    finally
      ShowJournalEnd;
      {if FileExists(FileInfo)
        then ShellExecute( 'NotePad', FileInfo, False);}
        {ShowMessageValid( FileInfo,
                                 'Журнал выполнения операции',
                                 FALSE,
                                 TRUE);}
      Finalize(Xml);
    end;
    except
      ExceptionHandler;
  end;
end; {end Main}


{~DoFill2616_ZS_OKPO_FO
  exchange #2616 - ТФФ 12
  если заполняется поле ZS.NAME_UBP_FO, то заполнять OKPO_FO из поля
  ОКПО карточки организации, наименование которой выгружается в ZS.NAME_UBP_FO.

  exchange #2703 - ТФФ 12.2.
  ТФФ 11 и 11.2 не используются больше, поэтому проверка тфф 12 отменяется.}
procedure DoFill2616_ZS_OKPO_FO( aDocNodeXml, aDataXml: Variant);
begin

    try
//      if IsVersionSupport( cnVersionTFF_12) then
        if ( LENGTH( VarToStr( aDataXml.GetAttribute('NAME_UBP_FO'))) > 0)
          then begin
            aDataXml.SetAttribute(
                        'OKPO_FO',
                        QueryField( sqlFoNameByBudg,
                                    [ aDocNodeXml.getAttribute('BUDGET_ID')],
                                    'OKPO'));

          end;

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

end;


{~DoAppendZSCH2_
   exchange #3097
   добавляем раздел ZSCH2 в список разделов.
   при этом контролируем идентичность полей:
   TYPE_KBK, KBK,ADD_KLASS.
   для одинаковых полей суммируем поле SUMR_KBK.
   делаем это так:
   ищем одинаковость полей от текущего раздела выше до ближайшего
   раздела не ZSCH2. если не нашли - добавляем раздел в хвост.
   если нащли - суммируем поле SUM_V_KBK и новый раздел не добавляем.}
procedure DoAppendZSCH2_( aXmlFile, aXmlZSCH2: variant);
begin
    try
      DoAppendUniqueChild(aXmlFile, aXmlZSCH2, 'TYPE_KBK,KBK,ADD_KLASS', 'SUMR_KBK', 'ZSCH2');
      except
        ExceptionProc( 'DoAppendZSCH2_');
    end;
end;


function MakeFormat(Xml: Variant): Boolean;

  procedure FileOut_TFF9;
  begin
    try
      
      case Xml.childNodes.Item[0].getAttribute('DOCUMENTCLASS_ID') of
        // exchange #2399 отменяется ТФФ8, а по ТФФ10 аналогично ТФФ9
        11: FileOut := GetFileName(
                        Xml.childNodes.Item[0].getAttribute( 'ORG_CREDENTIALS_CODE'),//'ORG_CODE'),
                        'ZS',
                        XmlToDateTime(Xml.getAttribute('EXCH_DATE')),
                        Xml.getAttribute('EXCH_PACKET'),
                        FileOutIsLocalNet,
                        FileOutOrgCodeIsFk);

      194: FileOut := GetFileName(
                        Xml.childNodes.Item[0].getAttribute('CLIENT_CODE'),
                        'ZS',
                        XmlToDateTime(Xml.getAttribute('EXCH_DATE')),
                        Xml.getAttribute('EXCH_PACKET'),
                        FileOutIsLocalNet,
                        FileOutOrgCodeIsFk);

      else FileOut := GetFileName(
                        Xml.childNodes.Item[0].getAttribute('PAY_CODE'),
                        'ZS',
                        XmlToDateTime(Xml.getAttribute('EXCH_DATE')),
                        Xml.getAttribute('EXCH_PACKET'),
                        FileOutIsLocalNet,
                        FileOutOrgCodeIsFk);
      end;//case//
      
      except
        ExceptionLog( 'Сбой скрипта: "Exp_FK_ZS.MakeFormat.FileOut_TFF9".');
    end;
  end;

var
  i, j, idx: Integer;
  CashSymbAmount: TStrings; //содержит симв.касс. документа и суммы по симв.касс.
  xCashSymbXml: Variant;
  xCashSymbNode: Variant;
  xNode_ZSCH1: Variant;
  xNode: Variant;
  xDataRoot: variant;
  xAccount194: string;     // exchange #2467
  xAccountID194: string;      // exchange #2467
  xDocClass: string;
  xDocID: string;
  xDocNum: string;
  xDocDate: string;
  s: string;
  xPayID: string;
begin

    try
      Result := False;

      Xml := Xml.documentElement;

      // exchange #2399 отменяется ТФФ8, а по ТФФ10 аналогично ТФФ9
      if NOT CompareVersionAZK_Finance(
                  FORMAT( 'Выгрузка ЭД "%s" по ТФФ 9',
                          [ GetDocumentNameByClass(
                             Xml.childNodes.Item[0].getAttribute('DOCUMENTCLASS_ID'))]),
                  '2.28', FALSE, TRUE)
        then EXIT;


      // exchange #2399 отменяется ТФФ8, а по ТФФ10 аналогично ТФФ9
      FileOut_TFF9;

      WriteLog('Наименование формируемого файла: ' + FileOut, True);

      Data := Data.documentElement;
      // 2013/02/27 Выдыш С.М.
      // сохраняем корневой раздел - сюда будем добавлять все подразделы.
      // ошибка в том, что если не делать откат к корневому узлу, при валидации сообщения
      // отображаются криво, поскольку ожидается линейная структура XML результата
      // для документов, т.е. разделы документов должны быть корневыми узлами!
      xDataRoot := Data;

      WriteLog('Заполнение данных файла: ' + FileOut, True);
      Data := xDataRoot.appendChild(FillElementBySchema(Xml, 'FK'));
      Data.setAttribute('FORM_VER', AppVersion);

    //  Data := Data.parentNode;
      Data := xDataRoot.appendChild(FillElementBySchema(Xml.childNodes.Item[0], 'FROM'));  if Xml.childNodes.Item[0].getAttribute('DOCUMENTCLASS_ID') = 194 then
        Data.setAttribute('BUDG_LEVEL', 6)
      else
        Data.setAttribute('BUDG_LEVEL',
          GetBudgLevel(Xml.childNodes.Item[0].getAttribute('BUDGET_ID')));

    
      // exchange #2399 отменяется ТФФ8, а по ТФФ10 аналогично ТФФ9
      xNode := Xml.childNodes.Item[0];
      try
        Exch2344_FromZRZS_TFF9( Data, xNode);
        except
          ExceptionLog( 'Сбой');
      end;

    //  Data := Data.parentNode;
      Data := xDataRoot.appendChild(FillElementBySchema(Xml.childNodes.Item[0], 'TO'));
      if Xml.childNodes.Item[0].getAttribute('DOCUMENTCLASS_ID') = 11 then
      begin
        Data.setAttribute('KOD_TOFK', QueryField(sqlTofkAcc,
          [Xml.childNodes.Item[0].getAttribute('ORGACCOUNT_ID')], 'NAME'));
        Data.setAttribute('NAME_TOFK', QueryField(sqlTofkAcc,
          [Xml.childNodes.Item[0].getAttribute('ORGACCOUNT_ID')], 'DESCRIPTION'));
    //    Data := Data.parentNode;
      end;
      ProgressBar.Max := Xml.childNodes.length;

      //Шапка заявки (ZS)
      for i := 0 to Xml.childNodes.length - 1 do begin
        ProgressBar.Position := i;
        Xml := Xml.childNodes.items[i];


        // exchange #2739 - проверяем ЭД
        CheckByExch2739( Xml, 'ZS');

        xDocID := Xml.GetAttribute('ID');
        xDocClass := Xml.GetAttribute('DOCUMENTCLASS_ID');
        xDocNum := VarToStr( TRIM( Xml.GetAttribute('DOC_NUMBER')));
        xDocDate := VarToStr( TRIM( Xml.GetAttribute('DOC_DATE')));

        Data := xDataRoot.appendChild(FillElementBySchema(Xml, 'ZS'));
        Data.setAttribute('NOM_ZVK', Trim(Data.getAttribute('NOM_ZVK')));
        Data.setAttribute('DATE_ZVK', FormatDateTime('dd.mm.yyyy',
          XmlToDateTime(Data.getAttribute('DATE_ZVK'))));
        if xDocClass = '194' then
        begin
          // exchange #2467
          xAccount194   := Xml.getAttribute('PAY_ACCOUNT');
          xAccountID194 := Xml.getAttribute('PAY_ACC_ID');

          Data.setAttribute('NAME_BUD', '');
          Data.setAttribute('NAME_UBP_FO', '');
          Data.setAttribute('GLAVA_GRBS', '');
          //в предзаполнении записываем Id нужной организации
          if Data.getAttribute('NAME_GRBS') <> '' then
            Data.setAttribute('NAME_GRBS', QueryField(sqlOrgId,
              [Data.getAttribute('NAME_GRBS')], 'DESCRIPTION'));
          { Exchange #2351
            выгрузка предельной даты заполнения, если заполнено в документе
            для всех классов, кроме 194 }
          Data.setAttribute('DATE_LIM', '');
        end
        else begin
          Data.setAttribute('NAME_BUD', QueryField(sqlBudgId,
            [Xml.getAttribute('BUDGET_ID')], 'CAPTION'));
          Data.setAttribute('NAME_UBP_FO', QueryField(sqlFoNameByBudg,
            [Xml.getAttribute('BUDGET_ID')],'DESCRIPTION'));
          Data.setAttribute('GLAVA_GRBS',
            StringReplace(Format('%3s', [Data.getAttribute('GLAVA_GRBS')]), ' ', '0'));
          { Exchange #2351
            выгрузка предельной даты заполнения, если заполнено в документе
            для всех классов, кроме 194 }
          CopyNotEmptyAttrXmlDateTime(Data, 'DATE_LIM', Data, 'DATE_LIM');

          // exchange #2675 - заполнение поля DATE_ISP при выгрузке ЗОР
          if Xml.getAttribute('DOCUMENTCLASS_ID') = '11'
            then DoExch2675( Data, 'DATE_LIM');
        end;

    
        // exchange #2399 отменяется ТФФ8, а по ТФФ10 аналогично ТФФ9
        // exchange #2434 доработка
        Exch2344_ZS_TFF9( Data, Xml, param_Spec1);

        // exchange #2616 - ТФФ 12 - заполнение поля ZS.OKPO_FO
        DoFill2616_ZS_OKPO_FO( Xml, Data);
    

        Data.setAttribute('DATE_POD', IfThen(Data.getAttribute('DATE_POD') <> '',
          FormatDateTime('dd.mm.yyyy', XmlToDateTime(Data.getAttribute('DATE_POD'))), ''));
        Data.setAttribute('DATE_DOC', IfThen(Data.getAttribute('DATE_DOC') <> '',
          FormatDateTime('dd.mm.yyyy',XmlToDateTime(Data.getAttribute('DATE_DOC'))), ''));
        Data.setAttribute('SUM_ITOG', Format('%0.2f', [StrToCurr(Xml.getAttribute('AMOUNT'))]));

        // exchange #2898
        // совместимость с АЦК-Ф не ниже 2.37.0.13
        // теперь заполнение кассовых символов описывается для шапки ЭД,
        // как группировка по символам кассы, и в скриптах нужно брать из БД
        // а не группировать по своему, хотя по сути это одно и то же.
        // новый код применяем только для эд 11 и 194
        case xDocClass of
          '11','194':
              try
                // получаем список строк шапки ЭД
                // из раздела "расшифровка по символам кассы"
                case xDocClass of
                  '11': xCashSymbXml :=
                                QueryXml( ' select s.* from symbcashline s'
                                         +' join BudgOrder b on'
                                         +'    s.document_id=b.document_id'
                                         +' where b.id=? and s.docpart_key=0',
                                          [ xDocID]);
                  '194': xCashSymbXml :=
                                QueryXml( ' select s.* from symbcashline s'
                                         +' join aubucashrequest b on'
                                         +'    s.document_id=b.document_id'
                                         +' where b.id=? and s.docpart_key=0',
                                          [ xDocID]);
                end;//case//
                xCashSymbXml := xCashSymbXml.DocumentElement;
                if (xCashSymbXml.ChildNodes.Length <= 0) then begin
                  // символы кассы болжны быть!
                  case xDocClass of
                   '11': s := 'Заявка на оплату расходов';
                  '194': s := 'Заявка БУ/АУ на получение наличных денег';
                  end;//case//
                  WriteInfo(
                      FORMAT( 'ЭД %s № %s от %s не выгружен - не имеет строк расшифровки по символам кассы.',
                              [ s,
                                xDocNum,
                                xDocDate]));
                end;
                for j := 0 to xCashSymbXml.ChildNodes.Length - 1 do begin
                  xCashSymbNode := xCashSymbXml.ChildNodes.Items[ j];
                  // создаем раздел ZSCH1 без предзаполнения
                  xNode_ZSCH1 := xDataRoot.AppendChild(
                                    xDataRoot.OwnerDocument.createElement('ZSCH1'));
                  // Сумма по символу кассового плана в чеке.
                  // Значение поля выгружать из поля «Сумма» расшифровки по
                  // символам кассы ЭД (не строки!).
                  xNode_ZSCH1.SetAttribute(
                                  'SUMR_ZVK',
                                  Format( '%0.2f',
                                          [ StrToCurr(
                                              xCashSymbNode.GetAttribute( 'AMOUNT'))]));
                  // Номер чека
                  xNode_ZSCH1.SetAttribute(
                                  'CHECK_NOM',
                                  VarToStr( Xml.GetAttribute( 'CHEQUE_NUM')));
                  // Серия чека
                  xNode_ZSCH1.SetAttribute(
                                  'CHECK_SER',
                                  VarToStr( Xml.GetAttribute( 'CHEQUE_SER')));
                  // Дата чека
                  // exchange #3005
                  // было указано неверное поле из ЭД. причем если в эд дата
                  // не указано - заполняем ее пустым значением, поскольку
                  // поле по ТФФ обязательное, а брать значение по умолчанию
                  // неоткуда.
                  s := VarToStr( Xml.GetAttribute('CHEQUE_DATE'));
                  if (LENGTH( s) > 0)
                    then xNode_ZSCH1.SetAttribute(
                                  'DATE_CHECK',
                                  FormatDateTime( 'dd.mm.yyyy',
                                                  XmlToDateTime( s)))
                    else xNode_ZSCH1.SetAttribute(
                                  'DATE_CHECK',
                                  '');

                  // Срок действия чека		DATE		Да	Не меняется
                  s := VarToStr( Xml.GetAttribute('CHEQUE_ENDURANCE_DATE'));
                  if (LENGTH( s) > 0)
                    then xNode_ZSCH1.SetAttribute(
                                    'DATE_CHECK_LIM',
                                    FormatDateTime( 'dd.mm.yyyy',
                                                    XmlToDateTime( s)))
                    else xNode_ZSCH1.SetAttribute(
                                    'DATE_CHECK_LIM',
                                    '');

                  // Символ кассового плана
                  // Значение поля выгружать из поля «Символ кассы»
                  // расшифровки по символам кассы ЭД (не строки!).
                  // здесь ожидается 2 символа, поэтому значение до цифры 10
                  // добавляем нули слева
                  s := xCashSymbNode.GetAttribute( 'SYMBCASH_ID');
                  case LENGTH( s) of
                    0: s := '00';
                    1: s := '0' + s;
                  end;//case//
                  xNode_ZSCH1.SetAttribute( 'CHECK_KAS', s);
                end;//for//
                except
                  ExceptionLog( 'Сбой при формировании раздела ZSCH1');
              end;

          else begin
              //накопление сумм строк документа в разрезе кассовых символов
              CashSymbAmount := TStringList.Create;
              try
                // цикл по строкам документа
                for j := 0 to Xml.childNodes.length - 1 do
                begin
                  Xml := Xml.childNodes.items[j];
                  idx := CashSymbAmount.indexOfName(Xml.getAttribute('SYMBCASH_ID'));
                  //Заполнение TList данными SYMBCASH_ID=AMOUNT
                  if idx < 0 then
                    //встретился кассовый символ, которого нет в листе CashSymbAmount
                    CashSymbAmount.Add(Xml.getAttribute('SYMBCASH_ID') + '=' +
                      Xml.getAttribute('AMOUNT'))
                  else
                    CashSymbAmount.Strings[idx] := Xml.getAttribute('SYMBCASH_ID') + '=' +
                      CurrToStr(StrToCurr(CashSymbAmount.ValueFromIndex(idx)) +
                        StrToCurr(Xml.getAttribute('AMOUNT')));
                  Xml := Xml.parentNode;
                end;
                //заполняем реквизиты чека (ZSCH1)
                for j := 0 to CashSymbAmount.Count - 1 do
                begin
                  Data := xDataRoot.appendChild(FillElementBySchema(Xml, 'ZSCH1'));
                  Data.setAttribute('DATE_CHECK', IfThen(Data.getAttribute('DATE_CHECK') <> '',
                    FormatDateTime('dd.mm.yyyy', XmlToDateTime(Data.getAttribute('DATE_CHECK'))), ''));
                  Data.setAttribute('DATE_CHECK_LIM', IfThen(Data.getAttribute('DATE_CHECK_LIM') <> '',
                    FormatDateTime('dd.mm.yyyy', XmlToDateTime(Data.getAttribute('DATE_CHECK_LIM'))), ''));
                  Data.setAttribute('CHECK_KAS', StringReplace(Format('%2s',
                    [CashSymbAmount.Names[j]]),' ', '0'));
                  Data.setAttribute('SUMR_ZVK',
                    Format('%0.2f', [StrToCurr(CashSymbAmount.ValueFromIndex(j))]));
          //        Data := Data.parentNode;
                end;
              finally
                CashSymbAmount.Free;
              end;
            end;
        end;//case//

        // exchange #3081
        // сохраняем ид.плательщика из шапки эд 194го
        // здесь эд не проверяем. если есть атрибут - его и сохраним
        xPayID := GetNodeAttributeEx( Xml, 'PAY_ID');

        // расшифровка заявки (ZSCH2)
        for j := 0 to Xml.childNodes.length - 1 do begin
          Xml := Xml.childNodes.items[j];

          // exchange #3097
          // создаем но не выгружаем раздел ZSCH2
//          Data := xDataRoot.appendChild(FillElementBySchema(Xml, 'ZSCH2'));
          Data := FillElementBySchema(Xml, 'ZSCH2');
          // exchange #3062
          // убрано поле косгу из кбк для эд не ау/бу
          // приведение к единообразию выгрузки кбк
          case Xml.getAttribute('DOCUMENTCLASS_ID') of
            11: begin
                  if (not param_SpecS) and (Data.getAttribute('KOD_IST') = 2) then
                    Data.setAttribute('KBK',
                          GetRuleKBKLine_R(
                                Xml.getAttribute('KADMR_CODE'),
                                '0',
                                '0',
                                '0',
                                Xml.getAttribute('KESR_CODE'),
                                Xml.getAttribute('BUDGET_ID'),
                                FALSE))
                          {
                      KadmCodeFormat(Xml.getAttribute('KADMR_CODE'), Xml.getAttribute('BUDGET_ID')) +
                      KfsrCodeFormat('0', Xml.getAttribute('BUDGET_ID')) +
                      KcsrCodeFormat('0', Xml.getAttribute('BUDGET_ID')) +
                      KvrCodeFormat('0', Xml.getAttribute('BUDGET_ID')) +
                      KesCodeFormat(Xml.getAttribute('KESR_CODE'), Xml.getAttribute('BUDGET_ID')))
                      }
                  else
                    if param_SVR and (Data.getAttribute('KOD_IST') = 3) then
                    begin
                      Data.setAttribute('KBK', '');
                      Data.setAttribute('TYPE_KBK', '');
                      Data.setAttribute('KOD_IST', '5');
                    end
                    else
                      begin
                        Data.setAttribute('KBK',
                            GetRuleKBKLine_R(
                                Xml.getAttribute('KADMR_CODE'),
                                Xml.getAttribute('KFSR_CODE'),
                                Xml.getAttribute('KCSR_CODE'),
                                Xml.getAttribute('KVR_CODE'),
                                Xml.getAttribute('KESR_CODE'),
                                Xml.getAttribute('BUDGET_ID'),
                                FALSE));
                          {
                          KadmCodeFormat(Xml.getAttribute('KADMR_CODE'), Xml.getAttribute('BUDGET_ID')) +
                          KfsrCodeFormat(Xml.getAttribute('KFSR_CODE'), Xml.getAttribute('BUDGET_ID')) +
                          KcsrCodeFormat(Xml.getAttribute('KCSR_CODE'), Xml.getAttribute('BUDGET_ID')) +
                          KvrCodeFormat(Xml.getAttribute('KVR_CODE'), Xml.getAttribute('BUDGET_ID')) +
                          KesCodeFormat(Xml.getAttribute('KESR_CODE'), Xml.getAttribute('BUDGET_ID')));
  }
                        Data.setAttribute('TYPE_KBK', '10');
                     end;
          
                  // exchange #2399 отменяется ТФФ8, а по ТФФ10 аналогично ТФФ9
                  Data.setAttribute(
                                'ADD_KLASS',
                                GetPurposeFulgrantCodeEx(
                                            Xml.getAttribute('PURPOSEFULGRANT_ID'),
                                            Xml.getAttribute( 'KDR_CODE' ),
                                            Xml.getAttribute( 'KDE_CODE' ),
                                            Xml.getAttribute( 'KDF_CODE' )));
                end;

            194: begin
                  Data.setAttribute('KOD_IST', 6);
                  { exchange #3081
                    Изменить формирование значения полей блока ZSKBK:
                      TYPE_KBK – определять по правилу 1 ФТ-1.
                      KBK – определять по правилу 2 ФТ-1.}
                  Data.setAttribute(
                          'KBK',
                          ExportKbk_LineED_AuBu( Xml.getAttribute('BUDGET_ID'),
                                                 xPayID,
                                                 Xml));
                  Data.setAttribute(
                          'TYPE_KBK',
                          ExportTypeKbk_LineED_AuBu( Xml));
                                  (*
                  // exchange #3062
                  // для ау/бу все по старому с косгу
                  Data.setAttribute('KBK',
                          GetRuleKBKLine_R(
                                '0',
                                '0',
                                '0',
                                '0',
                                Xml.getAttribute('KESR_CODE'),
                                Xml.getAttribute('BUDGET_ID')));
                                         {
                  Data.setAttribute('KBK', '00000000000000000' +
                    KesCodeFormat(Xml.getAttribute('KESR_CODE'), Xml.getAttribute('BUDGET_ID')));
                    }
                  Data.setAttribute(
                          'TYPE_KBK',
                          GetTypeKbkByKes( Xml.getAttribute('KESR_CODE'),
                                           Xml.getAttribute('BUDGET_ID')));
                                           *)

                  // exchange #2467
                  Exch2467_Export_ADD_CLASS( Data,
                                              xAccount194,
                                              xAccountID194,
                                              Xml.getAttribute('GRANTINVESTMENT_ID'));

          {
                  Data.setAttribute('ADD_KLASS',
                    QueryField('Select Code From GrantInvestment Where Id = ?',
                      [Xml.getAttribute('GRANTINVESTMENT_ID')], 'CODE'));
                  // Exchange #2235
                  if Data.getAttribute('ADD_KLASS') = '0' then
                    Data.setAttribute('ADD_KLASS', '');
          }
                end;

          else
                if param_SVR and (Data.getAttribute('KOD_IST') = 3) then begin
                  Data.setAttribute('KBK', '');
                  Data.setAttribute('TYPE_KBK', '');
                  Data.setAttribute('KOD_IST', '5');
                end else begin
                  Data.setAttribute('KBK',
                        GetRuleKBKLine_D(
                            Xml.getAttribute('KADMD_CODE'),
                            Xml.getAttribute('KD_CODE'),
                            Xml.getAttribute('KESD_CODE'),
                            Xml.getAttribute('BUDGET_ID'),
                            FALSE));
                        {
                    KadmCodeFormat(Xml.getAttribute('KADMD_CODE'), Xml.getAttribute('BUDGET_ID')) +
                    KdCodeFormat(Xml.getAttribute('KD_CODE'), Xml.getAttribute('BUDGET_ID')) +
                    KesCodeFormat(Xml.getAttribute('KESD_CODE'), Xml.getAttribute('BUDGET_ID')));
                    }
                  Data.setAttribute('TYPE_KBK', '20');
                end;
          end;//case//
    //      Data := Data.parentNode;
          Xml := Xml.parentNode;
          // exchange #3097
          // выгружаем раздел ZSCH2
          DoAppendZSCH2_( xDataRoot, Data);

        end;//for//
    //    Data := Data.parentNode;
        Xml := Xml.parentNode;

      end;//for//
      Data := xDataRoot.ownerDocument;//Data.ownerDocument;
      Xml := Xml.ownerDocument;

      if FileExists(FileInfo) then
        Exit;
      // exchange #2739 - проверка ошибок
      if NOT FinalizeByExch2739( param_CtlValidOn)
        then EXIT;
      Result := True;
      except
        ExceptionProc( 'MakeFormat');
    end;

end; {end MakeFormat}

procedure Initialize(Xml: Variant);
var
  SL: TStringList;
begin
  SL := TStringList.Create;
  with SL do
  try
    CommaText := InitializeDefault(Xml, ChangeFileExt(TestFileName, ''));
    param_Spec1 := Values['СпецНастройка1'] = 'бюджетополучатель';
    param_SpecS := Values['Заменять КФСР, КЦСР и КВР на нуль'] = 'Нет';
    param_SVR := Values['Учет средств во временном распоряжении'] = 'Да';
    // exchange #2399 пп.24 ТФФ 10.0
    // exchange #2445 - исправлены версии схем
    // exchange #2542 - переход на тфф11 + переработка модуля проверки версий схем
    LoadSchema( GetFileNameSchemaTFF( 'zs_txzs*'));
    {
    LoadSchema(
        DirIni + VersionSchemsDir
          + IfVersionSupportThenElse(
              cnVersionTFF_10,
              'zs_txzs120101.xml',
              'zs_txzs120101.xml'));
              }
    // exchange #2968
    InitializeExportCfgZip( SL);
  finally
    Free;
  end;
  InitializeMessageValid( 'EXP_FK_ZS', DirIni);
end; {End Initialize}

procedure Finalize(Xml: Variant);
begin

  FinalizeDefault(Xml);
  FinalizeMessageValid;
  FinalizeMain;
end; {End Finalize}

begin
  Main(NULL);
end. {End Begin}
