{~Exch2600_Build195_By_IK_ZR
  создание ЭД 195го класса при загрузке IK из раздела ZR по exchange #2600.

  параметры
     aZR_XML - описание раздела ZR.
                это первый подэлемент в списке элементов узла IK.
                структура:
                  IK
                    ZR
                    ZROSN
                    ZRST
                    ZRST
                    ZRST
                    ...
     aZR_XML_Index - индекс узла ZR в списке элементов узла IK.
                структура:
                  IK
                    ZR       <-- индекс этого узла в списке подузлов IK
                    ZROSN
                    ZRST
                    ZRST
                    ZRST
                    ...

     aBudgetId - бюджет загрузки IK
     aFinYear - фин.год загрузки IK
     aCfg_2600_CreateED_AUBU - опция из конфига: создавать справки АУ/БУ.

  в результате будет создан ЭД 195го класса, если все будет этому благоволить.}
procedure Exch2600_Build195_By_IK_ZR( aZR_XML: Variant;
                                      aZR_XML_Index: integer;
                                      aBudgetId: string;
                                      aFinYear: string;
                                      aCfg_2600_CreateED_AUBU: boolean;
                                      aCfgCreateDoc5: boolean;
                                      aZR_GUID_FK: TStringList;
                                      aChangeKBKto0: boolean;
                                      aCfg_CreateParamAUBU: string);

  {~DoSearchAccount_
    поиск счета aAccNumber с типом aAccType у организации aOrgID.
    результат:
      =true - найден
      =false - не найден или счет aAccNumber не указан (пустая строка).
    если счет найден, то в эд aED заполняются реквизиты счета.}
  function DoSearchAccount_( aAccType, aAccNumber, aOrgID: string;
                             aED: Variant): boolean;
  var
    xRec_LS_Xml: Variant;
  begin

      try
        Result := FALSE;
        // подставляем номер счета
        aED.SetAttribute( 'REC_ACCOUNT', aAccNumber);
        if (LENGTH( aAccNumber) <= 0) then EXIT;
        // ищем счет среди счетов организации
        if (GetOrgAccountGetter_ToXML(
                xRec_LS_Xml,
                 'where=a.account_number=? '
                +'and a.Close_Date is null '
                +'and a.DISTRIBUTIVE_FLAG=0 '
                +'and a.orgacctype_id in (' + aAccType + ') '
                +'and a.org_id=?',
                [ aAccNumber,
                  aOrgID]) = 1)
          then begin
            aED.SetAttribute( 'REC_ACC_ID'     , xRec_LS_Xml.getAttribute('ORGACCOUNT_ID'));
            aED.SetAttribute( 'REC_UFK_NAME'   , xRec_LS_Xml.getAttribute('ORG_UFK_NAME'));
            aED.SetAttribute( 'REC_UFK_ACCOUNT', xRec_LS_Xml.getAttribute('ORG_UFK_ACCOUNT'));
            aED.SetAttribute( 'REC_UFK_ACC_ID' , xRec_LS_Xml.getAttribute('ORG_UFK_ACC_ID'));
            Result := TRUE;
          end;
        except
          ExceptionProc( 'DoSearchAccount_');
      end;

  end;


var
  i,i2: integer;
  s: string;
  xIK_XML: Variant;
  xIK_LS_UBP: string;
  xZR_DocNum: string;
  xZR_DocDate: string;
  xZR_GUID_FK: string;
  xZRST_Amount: Variant;
  xDocInfo: string;
  xXml: Variant;
  xXmlDoc: Variant;
  xXmlNode: Variant;
  xPay_Org_Code: string;
  xPay_LS_ID: string;
  xPay_Org_ID: string;
  xPay_LS_Xml: Variant;
  xRec_Org_ID: string;
  xRec_Org_Xml: Variant;
  xPay_BudgetId: string;
  xRec_LS: string;
  xRec_LS_Xml: Variant;
  xRec_LS_Type: string;
  xRec_BIC_BANK: string;
  xZR_SUM_V_NDS: string;
  xIndexLines_S: integer;
  xIndexLines_E: integer;
  xXmlDocLines: Variant;
  xXmlDocLine: Variant;
  xType_KBK: string;
  xKBK: string;
  xDocID: string;
  xXMLFound: integer;
  xZR_SUM_V: Variant;
  xZR_LS_UBP_RCP: string;
  xZRST_KBK_RCP: string;
  xZRST_TYPE_KBK_RCP: string;
  xZRST_CheckKES: boolean;
  xFillLinesBy2952: boolean;
  xZR_BS_RCP: string;
  xZR_LS_UBP_RCP_30: boolean;
  xKESR: string;
  xCheckKES: boolean;
  xCodeFound: string;
  xProblemIntoLines2952: boolean;
  xOrgID: string;
  xZR_TYPE: string;
  xIndexLines_S_OSN: integer;
  xIndexLines_E_OSN: integer;
  xCheckKVR: boolean;
  xZR_KDOH: string;
begin

    try
      xIK_XML    := aZR_XML.parentNode;
      xZR_DocNum := aZR_XML.getAttribute('NOM_ZR');
      xZR_DocDate:= aZR_XML.getAttribute('DATE_ZR');
      xZR_GUID_FK:= aZR_XML.GetAttribute('GUID_FK');
      // поле л/с обязательно
      xIK_LS_UBP := TRIM( VarToStr( xIK_XML.getAttribute('LS_UBP')));
      // exchange #2952
      xZR_LS_UBP_RCP := VarToStr( aZR_XML.getAttribute( 'LS_UBP_RCP'));
      xZR_BS_RCP     := VarToStr( aZR_XML.getAttribute( 'BS_RCP'));
      // exchange #3021
      // тип загружаемого эд IK.ZR: полный(=1) или краткий(=2)
      xZR_TYPE := aZR_XML.getAttribute( 'TYPE');



      //------------------------------------------------------------------
      // определение индексов строк ZRST в списке разделов вслед за разделом ZR
      xIndexLines_S := -1;
      xIndexLines_E := -1;
      xIndexLines_S_OSN := -1;      // exchange #3021
      xIndexLines_E_OSN := -1;      // exchange #3021
      for i := 0 to aZR_XML.childNodes.Length - 1 do begin
        xXmlNode := aZR_XML.childNodes.Item[i];
        case xXmlNode.NodeName of
          'ZRST': if (xIndexLines_S < 0) then begin
                    xIndexLines_S := i;
                    xIndexLines_E := i;
                    // ищем последний раздел ZRST для секции ZR
                    for i2 := xIndexLines_S + 1 to aZR_XML.childNodes.Length - 1 do begin
                      xXmlNode := aZR_XML.childNodes.Item[ i2];
                      if (xXmlNode.NodeName = 'ZRST')
                        then xIndexLines_E := i2
                        else BREAK;
                    end;//for//
                  end;

          // для секции ZR допускаются такие разделы
          // exchange #3021
          // добавлена загрузка разделов "документы-основания", но только
          // для ZR.TYPE=2. но здесь это не анализируем - это будет позже.
          'ZROSN': if (xIndexLines_S_OSN < 0) then begin
                    xIndexLines_S_OSN := i;
                    xIndexLines_E_OSN := i;
                    // ищем последний раздел ZRST для секции ZR
                    for i2 := xIndexLines_S_OSN + 1 to aZR_XML.childNodes.Length - 1 do begin
                      xXmlNode := aZR_XML.childNodes.Item[ i2];
                      if (xXmlNode.NodeName = 'ZROSN')
                        then xIndexLines_E_OSN := i2
                        else BREAK;
                    end;//for//
                  end;

          // прочие разделы - окончание секции ZR
          else BREAK;
        end;//case//
      end;//for//

      if ((xIndexLines_S = -1) OR (xIndexLines_E = -1)) then begin
        WriteInfo( 'Не найдены разделы ZRST для секции ZR.');
        EXIT;
      end;

      {
      // exchange #3021
      // для ZR.TYPE=2 разделы ZROSN необязательны!
      if (xZR_TYPE = '2') then
        if ((xIndexLines_S_OSN = -1) OR (xIndexLines_E_OSN = -1)) then begin
          WriteInfo( 'Не найдены разделы ZROSN для секции ZR при ZR.TYPE=2.');
          EXIT;
        end;
        }

      //------------------------------------------------------------------
      // сумма всех строк в валюте выплаты
      xZRST_Amount := 0.0;
      // exchange #2817
      // Если значение поля «ZR.TYPE» равно «1» загружать из поля
      // «ZRST.SUM_V_KBK», если «2» - из поля «ZR.SUM_V»
      case xZR_TYPE of
        '1': begin
              for i := xIndexLines_S to xIndexLines_E do begin
                xXmlNode := aZR_XML.childNodes.Item[i];

                xZRST_Amount := xZRST_Amount
                                + StrToCurrDef( xXmlNode.getAttribute( 'SUM_V_KBK'), 0);
              end;//for//

            end;

        '2': begin
              // чтобы каждый раз не проверять тип для каждой строки
              // тип проверяется один раз, но сумму определяем столько
              // сколько строк. фактически это умножение суммы на число строк,
              // но построчное суммирование надежнее.
              xZR_SUM_V := StrToCurrDef( aZR_XML.getAttribute( 'SUM_V'), 0);
              for i := xIndexLines_S to xIndexLines_E
                do xZRST_Amount := xZRST_Amount + xZR_SUM_V;

            end;
      end;//case//

      //------------------------------------------------------------------
      // описание искомого ЭД 195го класса
      // это описание отображается в логах как описание ЭД.
      xDocInfo := FORMAT( '"Заявка БУ/АУ на выплату средств" № %s дата %s '
                             +'сумма в валюте выплаты %s, номер л/с %s',
                              [ xZR_DocNum,
                                xZR_DocDate,
                                FORMAT( '%0.2f', [ xZRST_Amount]),
                                xIK_LS_UBP]);
      WriteInfo( FORMAT( 'ЭД %s.', [ xDocInfo]),
                TRUE);

      // exchange #2855 - проверяем строки
      // если будут проблемы - эд не создаем
      // exchange #3062 - перенос проверки строк в создание эд
      // в результате для ау/бу проверять кбк (CheckKBK) не нужно, поэтому
      // exchange #2952 + exchange #2955 и exchange #2855  не будут выполняться.
//      if NOT CheckIK_ZR_ZRST_2855( aZR_XML) then EXIT;
{
      if NOT CheckKBK_All_ZRST( aZR_XML, aBudgetID, TRUE)
        then EXIT;}

      // 2.3.2.1.	производим поиск ЭД 195 класса в списке ЭД системы
      // (по Номеру заявки, Дате заявки, Сумма документа в валюте выплаты
      // (общая сумма всех строк ЭД «Заявка БУ/АУ на выплату средств»),
      // Номеру лицевого счета (IK.LS_UBP – Счет плательщика).
      // нужно учитывать бюджет загрузки IK.
      // Тип документа в ФК «Заявка на кассовый расход»
      // exchange #2617
      // здесь необходимо отключать кэш.
      // иначе, если загружаются несколько файлов но с одними
      // и теми же данными, то с кэшировании запрос берется из кеша
      // и на повторных данных срабатывает ложно, поэтому при
      // поиске дублей ЭД кэш необходимо отключать.
      // однако это будет больше нагружать сервер.
      xXML := QueryXml(  ' Select A.* From Document D'
                        +' Left Join aubucashrequest A on A.Document_Id = D.Id'
                        +' Where D.Budget_Id = ? and D.DocumentClass_Id = 195'
                        +' and LTrim(A.Doc_Number) = ? and A.Doc_Date = ?'
                        +' and A.PAYDOC_CODE = ?'
                        +' and a.amount = ?'
                        +' and A.Pay_Account = ?'
                        +' and A.dispstatus_id>-1',
                        [ aBudgetId,
                          xZR_DocNum,
                          StrToDate( xZR_DocDate),
                          'ZR',              // Тип документа в ФК
                          // exchange #2817
                          // опять проблема с передачей значения как число
                          FORMAT( '%0.2f', [ xZRST_Amount]),
                          xIK_LS_UBP],
                        FALSE);
      xXMLFound := xXML.documentElement.childNodes.Length;

      // 2.3.2.1.1.	Если ЭД однозначно найден, записываем в поле Foreign_key,
      // если еще не заполнено, значение IK.ZR.GUID_FK.
      if (xXMLFound = 1) then begin
        xXML := xXml.documentElement.childNodes.Item[0];
        // exchange #3019
        // теперь форенкей нужно заполнять всегда, но делаем обновление
        // только если он отличается
        if (GetNodeAttributeEx( xXML, 'FOREIGN_KEY') <> xZR_GUID_FK)
//        if (LENGTH( TRIM( xXML.GetAttribute( 'FOREIGN_KEY'))) <= 0)
          then UpdateDocumentForegnKey( '195', xXML.GetAttribute( 'ID'), xZR_GUID_FK);
(*
          try
            xDocID := xXML.GetAttribute( 'ID');
            xXml := CreateOleObject('Microsoft.XmlDom');
            xXmlDoc := xXml.appendChild( xXml.createElement('DOCUMENT'));
            xXmlDoc.SetAttribute( 'action', 'update');
            xXmlDoc.SetAttribute( 'class', '195');
            xXmlDoc.SetAttribute( 'ID', xDocID);
            xXmlDoc.setAttribute( 'FOREIGN_KEY', xZR_GUID_FK);

            ExecXml( xXml.xml, aBudgetID);

            except
              WriteInfo( FORMAT( 'Ошибка при обновлении поля GUID_FK: %s',
                                  [ LastException.Message]));
          end;
          *)

        EXIT;
      end;

      // если найдено несколько ЭД, тогда записываем сообщение в лог
      // и переходим к следующему ЭД
      if (xXMLFound > 1) then begin
        WriteLog( FORMAT( 'Найдено несколько подобных ЭД %s - не обрабатывается.',
                         [ xDocInfo]));
        EXIT;
      end;

      // 2.3.2.1.2.	Если не найден, и настройка «Создавать документы БУ/АУ»
      // включена, записывать запись в лог и приступать к обработке
      // следующего документа
      if (xXMLFound <= 0) then begin
        // если настройка выключена - ничего в лог не пишем и обрабатываем файл
        // дальше.
        if NOT aCfg_2600_CreateED_AUBU then begin
          WriteLog( FORMAT( 'ЭД %s не найден и не создается по настройке.',
                           [ xDocInfo]));
          EXIT;
        end;
        // логируем что ЭД не найден
        WriteLog( FORMAT( 'ЭД %s не найден и будет создан.',
                          [ xDocInfo]));
      end;

      //------------------------------------------------------------------
      WriteLog( 'Определение плательщика.', TRUE);
      { поиск организации плательщика
        Заполнять ID организации-плательщика и счет плательщика -
        номером счета и ID счета, найденным аналогично SP (#2436+#2516).
          л/с - равный по номеру IK.LS_UBP, без даты закрытия;
          Код организации должен быть равен IK. KOD_UBP_PUBP}
      xPay_Org_Code := TRIM( VarToStr( xIK_XML.getAttribute( 'KOD_UBP_PUBP')));
      xPay_BudgetId:= Exch2436_SearchBudgetID( xPay_Org_Code,
                                               aFinYear,
                                               xIK_LS_UBP,
                                               xPay_LS_ID,
                                               xPay_Org_ID,
                                               // всегда проверяем чтобы л/с
                                               // был без даты закрытия.
                                               TRUE);

      // в случае проблем не создаем ЭД 195го класса
      if (xPay_BudgetId = '') then begin
        WriteInfo( FORMAT(   'Не удалось определить бюджет загрузки по коду организации %s и номеру л/с %s.',
                            [ xPay_Org_Code,
                              xIK_LS_UBP]));
        EXIT;
      end;


      if (xPay_BudgetId <> aBudgetId) then begin
        WriteInfo( FORMAT(   'Не совпадает бюджет найденной организации по коду организации %s и номеру л/с %s с бюджетом загрузки IK файла.',
                            [ xPay_Org_Code,
                              xIK_LS_UBP]));
        EXIT;
      end;

      if (xPay_LS_ID = '') then begin
        WriteInfo( FORMAT(  'Не удалось найти описание л/с по коду организации %s и номеру л/с %s.',
                            [ xPay_Org_Code,
                              xIK_LS_UBP]));
        EXIT;
      end;
      // загружаем описание счета плательщика
      if (GetOrgAccountGetter_ToXML( xPay_LS_Xml, 'id='+xPay_LS_ID) <> 1)
        then begin
          WriteInfo( 'Не удалось прочитать описание найденного л/с в бд.');
          EXIT;
        end;

      //------------------------------------------------------------------
      WriteLog( 'Определение получателя.', TRUE);
      // БИК банка получателя
      xRec_BIC_BANK := TRIM( VarToStr( aZR_XML.getAttribute( 'BIC_RCP')));
      // проверяем в бд наличие банка по бик.
      // если не нашли или нашли несколько - ЭД не создаем
      if (LENGTH( xRec_BIC_BANK) <= 0) then begin
        WriteInfo( 'Не указан банк получателя.');
        EXIT;
      end;
      if (QueryField( 'select count(*) N from bank where bic=?',
                      [ xRec_BIC_BANK],
                      'N') <> '1') then begin
        WriteInfo( FORMAT(  'Не найден банк получателя %s.',
                            [ xRec_BIC_BANK]));
        EXIT;
      end;

      //------------------------------------------------------------------
      // exchange #2952 - здесь проверяем ФТ-1...ФТ-2
      // в переменной будет =true для алгоритма по #2952,
      // иначе заполняем строки по старому алгоритму.
      // в начале предполагаем что будет работать по новому алгоритму,
      // а по мере проверок флаг будет сборошен, тогда будем заполнять строки
      // по старому.
      // чтобы небыло вложенного глубокого if then каждый ФТ проверяем
      // в отдельном if и если хотя бы первая проверка не прошла - сбрасываем
      // флаг, что укажет на работу по старому алгоритму, а каждый следующий
      // ФТ проверяем, если флаг все еще =true. это несколько медленее,
      // но код более читабельный.
      xFillLinesBy2952 := TRUE;
      { ФТ-1: если IK.ZR.TYPE равен «1», то переходим к ФТ-1.1,
              иначе формируем ЭД по существующему алгоритму.}

      if (aZR_XML.getAttribute( 'TYPE') <> '1')
        then xFillLinesBy2952 := FALSE;    // по старому

      { ФТ-1 проверено успешно.
        ФТ-1.1 Требуется сравнить значения IK.ZR. BS_RCP со значением
               банковского счета, указанного в поле «Единый счет бюджета»
               карточки лицевого счета IK.LS_UBP.}
      if xFillLinesBy2952 then begin

      // exchange 2995
      // Требуется сравнить значения IK.ZR. BS_RCP и IK.ZR.BIK_RCP
      // со значением банковского счета, указанного в поле «Единый счет бюджета»
      // карточки лицевого счета IK.LS_UBP, и значением «БИК»  счета,
      // указанного в поле «Единый счет бюджета» карточки лицевого счета
      // IK.LS_UBP, соответственно. Если значения счетов и БИК равны, то
      // перейти к ФК-2.
      // чтобы не делать несколько запросов, можно спросить сразу количество
      // счетов, равных IK.LS_UBP, у которых есдиный счет бюджета = IK.ZR.BS_RCP
      // и при этом бик этого счета = IK.ZR.BIK_RCP.
      // если запись одна - значит есть всего один счет IK.LS_UBP с нужными
      // полями. если найдено несколько записей - значит счетов IK.LS_UBP
      // несколько и параметры таких счетов удовлетворяют "единому счету
      // бюджета" и его бику.

      if (LENGTH( xZR_BS_RCP) <= 0)
        then xFillLinesBy2952 := FALSE    // по старому
        else
          if (QueryField( ' select count( * ) N from orgaccount o'
                         +' join orgaccount oo on oo.id = o.EXECUTERACC_ID'
                         +' join bank b on b.id=oo.bank_id'
                         +' where o.account_number=? and o.orgacctype_id=5'
                         +' and o.close_date is null'
                         +' and b.bic=?'
                         +' and oo.account_number=?',
                          [ xIK_LS_UBP,
                            VarToStr( aZR_XML.getAttribute( 'BIC_RCP')),
                            xZR_BS_RCP],
                          'N') = '0')
            then xFillLinesBy2952 := FALSE    // по старому
(*
        if (QueryField( ' select oaa.account_number E'
                       +' from orgaccount oa'
                       +' join orgaccount oaa on oa.EXECUTERACC_ID=oaa.id'
                       +' where oa.ID=?',
                        [ xPay_LS_ID],
                        'E') <> xZR_BS_RCP)
          then xFillLinesBy2952 := FALSE    // по старому
          else
            { Если значения счетов равны, то сравнить значение IK.ZR.BIC_RCP
            со значением поля «БИК» строки справочника «Счета организаций»,
            имеющей значение в поле «Счет» равное  IK.ZR. BS_RCP,
            иначе формировать документ по существующему алгоритму.
              Если значения БИК равны, то переходить к ФТ-2, иначе
            формировать документ по существующему алгоритму.}
            if (LENGTH( xZR_BS_RCP) <= 0)
              then xFillLinesBy2952 := FALSE    // по старому
              else
                if ( QueryField( ' select count( * ) N'
                                +' from orgaccount oa'
                                +' join bank b on b.id=oa.bank_id'
                                +' where oa.orgacctype_id=2'
                                +' and oa.ACCOUNT_NUMBER=? and b.bic=?',
                                 [ xZR_BS_RCP,
                                   VarToStr( aZR_XML.getAttribute( 'BIC_RCP'))],
                                 'N') <> '1')
                  then xFillLinesBy2952 := FALSE;    // по старому
*)
      end;

      { ФТ-1 проверено успешно.
        ФТ-1.1  проверено успешно.
        ФТ-2 Требуется сравнить значения IK.LS_UBP и IK.ZR.LS_UBP_RCP,
            если значения равны, то в загружаемом IK – файле по
            всем блокам ZR  требуется искать значение ZR.GUID_FK,
            равное значению загружаемого (анализируемого в текущий
            момент блока IK.ZR) IK.ZR.GUID_FK. Иначе переходим к ФТ-3.
            т.е. если IK.LS_UBP <> IK.ZR.LS_UBP_RCP то это уже условие
            нового алгоритма и здесь по GUID_FK не проверяем.}
      if xFillLinesBy2952 then begin

        if (xIK_LS_UBP = GetNodeAttributeEx( aZR_XML, 'LS_UBP_RCP'))

          then
            { Если блок ZR с таким же GUID_FK найден, то текущий IK.ZR
              пропускаем (по данному блокуZR ничего формировать не требуется),
              переходим к разбору следующего документа.
              Иначе переходим к ФТ-3.}
            if (aZR_GUID_FK.IndexOf( xZR_GUID_FK) <> -1) then begin
              WriteInfo( FORMAT( 'Найдено несколько разделов ZR с одинаковым значением ZR.GUID_FK %s.',
                                 [ xZR_GUID_FK]));
              EXIT;
            end;
      end;

      // exchange #2952
      // если все проверки ФТ проверены успешно, то чтобы по ФТ-3 каждый раз
      // не проверять начало счета ZR.LS_UBP_RCP на 30, проверяем это здесь
      // один раз. если строки заполняются по старому алгоритму, то значение
      // переменной можно не инициализировать.
      if xFillLinesBy2952 then begin
        xZR_LS_UBP_RCP_30 := (POS( '30', xZR_LS_UBP_RCP) = 1);

      end else begin
        xZR_LS_UBP_RCP_30 := FALSE;
      end;



    //------------------------------------------------------------------
    // exchange #2952
    // если будут проблемы с заполнением косгу или Код субсидии
    // в любой строке эд, то взводим флаг xProblemIntoLines2952 в =true.
    // это понадобится для проверки создания эд 194/195 с учетом
    // параметра конфига.
    // перенесено в начало, поскольку мало ли какие поля будут неправильно
    // заполнены.
    xProblemIntoLines2952 := FALSE;

    //------------------------------------------------------------------
      // создаем документ Заявка БУ/АУ на выплату средств

        xXml := CreateOleObject('Microsoft.XmlDom');
        xXmlDoc := xXml.appendChild( xXml.createElement('DOCUMENT'));
        xXmlDoc.setAttribute( 'action', 'insert');
        xXmlDoc.setAttribute( 'class', '195');
        xXmlDoc.setAttribute( 'BUDGET_ID', aBudgetID);
        // F_BUDGET_ID и FOREIGN_KEY нужны для проверки документа в
        // подпрограмме ExistsDocument.
        xXmlDoc.setAttribute( 'F_BUDGET_ID', aBudgetID);
        xXmlDoc.setAttribute( 'FOREIGN_KEY', xZR_GUID_FK);
//        xXmlDoc.setAttribute( 'F_ORIGINAL_TYPE',
//                              xDocument.getAttribute( 'F_ORIGINAL_TYPE'));
        // Номер документа	Номер заявки	ZR.NOM_ZR
        xXmlDoc.setAttribute( 'DOC_NUMBER', xZR_DocNum);
        // Дата документа	Дата заявки	ZR.DATE_ZR
        // строка должна быть в формате YYYY-MM-DD
        xXmlDoc.setAttribute( 'DOC_DATE',
                              DateTimeToXml( StrToDate( xZR_DocDate)));

        // тип операции по умолчанию для текущего ЭД
        xXmlDoc.SetAttribute( 'OPERTYPE_ID',
                              OperTypeDefaultForClassEx(
                                            xXmlDoc.GetAttribute( 'class')));
        // exchange #3021
        // тип заявки:
        // Если ZR.TYPE=1, заполнять значением «1 – полная»
        // Если ZR.TYPE=2, «2 – сокращённая»
        case xZR_TYPE of
          '1': xXmlDoc.SetAttribute( 'SIGN_VOLUME', '1');
          '2': xXmlDoc.SetAttribute( 'SIGN_VOLUME', '2');
        end;//case//

        // exchange #2952
        // фт-3.1: если заполнение строк осуществляется по новому алгоритму,
        // Полю «Тип операции» присваивать значение поля «Имя» справочника
        // «Типы операций с документами» равное «Внебанковская операция» (-29).
        // Если такое значение в справочнике отсутствует, то выдавать
        // сообщение в журнал о незаполнении поля, поле не заполнять.
        // п.фт-3.1 не реализуется и заполняется как раньше: по умолчанию
        // для эд 195го. но код оставлен на всякий случай.
{
        if xFillLinesBy2952 then begin
          if (QueryField( 'select count( * ) N from opertype where id=?',
                          [ '-29'],
                          'N') <> '1')
            then WriteInfo( 'Поле "Тип операции" не заполняется - в БД не '
                           +'найдено значение «Внебанковская операция» (-29).')
            else xXmlDoc.SetAttribute( 'OPERTYPE_ID', '-29');
        end else begin
          // тип операции по умолчанию для текущего ЭД
          xXmlDoc.SetAttribute( 'OPERTYPE_ID',
                                OperTypeDefaultForClassEx(
                                              xXmlDoc.GetAttribute( 'class')));
        end;
}

        // дата подписания заполняется датой документа
        // строка должна быть в формате YYYY-MM-DD
        xXmlDoc.setAttribute( 'SIGN_DATE',
                              xXmlDoc.getAttribute( 'DOC_DATE'));
        // сумма из всех строк
        xXmlDoc.setAttribute( 'AMOUNT',
                              FORMAT( '%0.2f', [ xZRST_Amount]));
        // Предельная дата исполнения - Не заполняется
        // Обязательство - Не заполняется
        //------------------------------------------------------------------
        // плательщик
        xXmlDoc.setAttribute( 'PAY_ID', xPay_Org_ID);
        // КПП - из файла IK. KPP_UBP
        xXmlDoc.setAttribute( 'PAY_KPP', xIK_XML.getAttribute( 'KPP_UBP'));
        // ИНН плательщика заполнять из организации, ID которой заполняется
        // в этом блоке.
        xXmlDoc.setAttribute( 'PAY_TAXCODE', GetOrgTaxCode( xPay_Org_ID));
        // Наименование - из файла IK.NAME_UBP_PUBP
        xXmlDoc.setAttribute( 'PAY_NAME',
                              VarToStr( xIK_XML.GetAttribute( 'NAME_UBP_PUBP')));
        // описание л/с
        xXmlDoc.setAttribute( 'PAY_ACC_ID'  , xPay_LS_ID);
        xXmlDoc.setAttribute( 'PAY_ACCOUNT' , xIK_LS_UBP);
        // описание реквизиитов по ЛС
        xXmlDoc.setAttribute( 'PAY_ACC_ID'     , xPay_LS_Xml.GetAttribute('ORGACCOUNT_ID'));
        xXmlDoc.setAttribute( 'PAY_OFK_NAME'   , xPay_LS_Xml.GetAttribute('ORG_OFK_NAME'));
        xXmlDoc.setAttribute( 'PAY_UFK_NAME'   , xPay_LS_Xml.GetAttribute('ORG_UFK_NAME'));
        xXmlDoc.setAttribute( 'PAY_UFK_ACCOUNT', xPay_LS_Xml.GetAttribute('ORG_UFK_ACCOUNT'));
        xXmlDoc.setAttribute( 'PAY_UFK_ACC_ID' , xPay_LS_Xml.GetAttribute('ORG_UFK_ACC_ID'));
        xXmlDoc.setAttribute( 'PAY_BIC'        , xPay_LS_Xml.GetAttribute('ORG_BIC'));
        xXmlDoc.setAttribute( 'PAY_B_NAME'     , xPay_LS_Xml.GetAttribute('ORG_B_NAME'));
        // Код клиента	IK.KOD_UBP_PUBP
        xXmlDoc.setAttribute( 'CLIENT_CODE', xPay_Org_Code);
        // Код ФК	IK.KOD_TOFK
        xXmlDoc.setAttribute( 'FK_CODE',
                              xIK_XML.getAttribute( 'KOD_TOFK'));
        // описание учредителя по коду вышестоящего ГРБС организации плательщика
        xXmlDoc.SetAttribute( 'ORG_ID',
                              GetOrgManagerID( xPay_Org_ID));
        // Ответственные лица определяются по организации плательщику
        // руководитель: код=-2
        UpdateRespersonM1ByOrgID_IntoXML(
              xXmlDoc,
              'CHIEF_',
              xPay_Org_ID,
              ' and Rp.appointment_id = -2 and Rp.Actual_flag=1');
        // гл.бух: код=-3
        UpdateRespersonM1ByOrgID_IntoXML(
              xXmlDoc,
              'BUH_',
              xPay_Org_ID,
              ' and Rp.appointment_id = -3 and Rp.Actual_flag=1');
        //------------------------------------------------------------------
        // получатель
        // ИНН контрагента
        xXmlDoc.setAttribute( 'REC_TAXCODE' , aZR_XML.getAttribute( 'INN_RCP'));
        // КПП контрагента
        xXmlDoc.setAttribute( 'REC_KPP'     , aZR_XML.getAttribute( 'KPP_RCP'));
        // Наименование получателя
        xXmlDoc.setAttribute( 'REC_NAME'    , aZR_XML.getAttribute( 'NAME_RCP'));
        // ищем организацию и заполняем реквизиты организации
        xRec_Org_Xml := GetOrgByTaxCodeAndKPP_IntoXml( xXmlDoc, 'REC', xRec_Org_ID);
        if NOT VarIsNull( xRec_Org_Xml) then begin
          xXmlDoc.setAttribute( 'REC_ID', xRec_Org_ID);
          { Расчетный счет получателя.
            л/с ищем только если найдена организация.
            Если заполнен ZR.LS_UBP_RCP, искать среди счетов Организации-получателя
            данный счет среди Актуальных 5, 7, 8, 9 типа, нераспорядительный
            незакрытый.
            Если найден однозначно, подставлять. Поля Орган, осущ.кассовое
            обслуживание, Счет органа, осущ.кассовое обслуживанеивание заполнять
            по нему.
            Если ZR.LS_UBP_RCP не заполнен, подставлять ZR.BS_RCP.
            Искать его среди счетов Организации-получателя среди Актуальных
            незакрытых 3 и 2 типа, нераспорядительный. Если найден однозначно,
            подставлять.
            Если не найден однозначно, записывать значение из отчета без ID.
            если заполнены оба поля, проверяем ZR.LS_UBP_RCP и если л/с не
            найден, то ZR.LS_UBP_RCP не проверяем.}
            {
          // тип искомого счета
          xRec_LS_Type := '';
          xRec_LS := xZR_LS_UBP_RCP;//VarToStr( aZR_XML.getAttribute( 'LS_UBP_RCP'));
          if (LENGTH( xRec_LS) > 0)
            then xRec_LS_Type := '5, 7, 8, 9'
            else begin
              // ищем л/с по ZR.BS_RCP
              xRec_LS := xZR_BS_RCP; //VarToStr( aZR_XML.getAttribute( 'BS_RCP'));
              if (LENGTH( xRec_LS) > 0)
                then xRec_LS_Type := '2, 3';
            end;

          if (LENGTH( xRec_LS) > 0) then begin
            // подставляем номер счета
            xXmlDoc.setAttribute( 'REC_ACCOUNT', xRec_LS);
            // ищем счет среди счетов организации
            if (GetOrgAccountGetter_ToXML(
                    xRec_LS_Xml,
                     'where=a.account_number=? '
                    +'and a.Close_Date is null '
                    +'and a.DISTRIBUTIVE_FLAG=0 '
                    +'and a.orgacctype_id in (' + xRec_LS_Type + ') '
                    +'and a.org_id=?',
                    [ xRec_LS,
                      xRec_Org_ID]) = 1)
              then begin
                xXmlDoc.setAttribute( 'REC_ACC_ID'     , xRec_LS_Xml.getAttribute('ORGACCOUNT_ID'));
                xXmlDoc.setAttribute( 'REC_UFK_NAME'   , xRec_LS_Xml.getAttribute('ORG_UFK_NAME'));
                xXmlDoc.setAttribute( 'REC_UFK_ACCOUNT', xRec_LS_Xml.getAttribute('ORG_UFK_ACCOUNT'));
                xXmlDoc.setAttribute( 'REC_UFK_ACC_ID' , xRec_LS_Xml.getAttribute('ORG_UFK_ACC_ID'));
              end;
          end;
}
          { exchange #2978
            если заполнен ZR.LS_UBP_RCP, искать среди счетов Организации-получателя
            данный счет среди Актуальных 5, 7, 8, 9 типа, нераспорядительный.
            Если найден однозначно, подставлять. Поля ТОФК, УФК,
            Счет УФК заполнять по нему.Если Счет по ZR.LS_UBP_RCP не находим/
            не находим однозначно, не записывать значение из ZR.LS_UBP_RCP
            в поле Счет блока Получатель, а переходить к полю ZR.BS_RCP - искать
            по ZR.BS_RCP счет среди счетов Организации-получателя среди
            Актуальных 3 и 2 типа, нераспорядительный. Если найден однозначно,
            подставлять.
            Если не найден однозначно, все равно записывать значение из
            отчета из поля ZR.BS_RCP.}

          if NOT DoSearchAccount_( '5, 7, 8, 9',
                                   xZR_LS_UBP_RCP,
                                   xRec_Org_ID,
                                   xXmlDoc)
            then DoSearchAccount_( '2, 3',
                                   xZR_BS_RCP,
                                   xRec_Org_ID,
                                   xXmlDoc);

        end else begin
          // если организация получатель не найдена, то л/с в справочнике
          // не ищем, а в поле номера счета получателя подставляем значение
          // из поля ZR.BS_RCP, не зависимо, пустое оно или нет.
          xXmlDoc.setAttribute( 'REC_ACCOUNT', xZR_BS_RCP);
        end;


        // БИК банка получателя
        xXmlDoc.setAttribute( 'REC_BIC', xRec_BIC_BANK);
        // Наименование банка получателя
        xXmlDoc.setAttribute( 'REC_B_NAME',
                              VarToStr( aZR_XML.getAttribute( 'NAME_BIC_RCP')));
        // Коррсчет банка Получателя (контрагента) ZR.KS_BIC_RCP
        xXmlDoc.setAttribute( 'REC_CORACCOUNT',
                              VarToStr( aZR_XML.getAttribute( 'KS_BIC_RCP')));
        //------------------------------------------------------------------
        // прочее
        WriteLog( 'Заполняется раздел прочее.');
        // вид платежа
        xXmlDoc.setAttribute( 'PAYKIND',
                              PayKindSetAsAzk( aZR_XML.getAttribute( 'VID_PL')));
        // очередность платежа
        xXmlDoc.setAttribute( 'QUEUE_KIND', aZR_XML.getAttribute( 'ORDER_PL'));
        // внешний статус - не выгружен
        xXmlDoc.setAttribute( 'EXTSTATUS_ID', '0');
        // Тип выгружаемого документа	(вид документа в ФК) - Заполняется значением
        // "Заявка на кассовый расход"
        xXmlDoc.setAttribute( 'PAYDOC_CODE', 'ZR');
        // Сумма НДС - Если заполнено ZR.SUM_V_NDS , то из него,
        // если нет - значение по умолчанию «0.00»
        xZR_SUM_V_NDS := TRIM( VarToStr( aZR_XML.getAttribute( 'SUM_V_NDS')));
        if (LENGTH( xZR_SUM_V_NDS) <= 0)
          then xZR_SUM_V_NDS := '0.00';
        xXmlDoc.setAttribute( 'VAT', xZR_SUM_V_NDS);
        //Назначение платежа
        xXmlDoc.setAttribute( 'DESCRIPTION',
                              VarToStr( aZR_XML.getAttribute( 'PURPOSE')));
        // вид операции - не заполняется
        // вид операции по л/с - не заполняется
        // результат проверки - не заполняется
        // комментарий - не заполняется
        //------------------------------------------------------------------
        // Реквизиты возвращаемого документа - не заполняется
        //------------------------------------------------------------------
        // Идентификатор платежа
        WriteLog( 'Заполняется идентификатор платежа.');

        // exchange #3081
        // фт-3 для эд 195го по ZR:
        //   2. При формировании значения кода бюджетной классификации поля
        //      «Идентификатор платежа», если значение реквизита ZR.KDOH
        //      не пустое, то сохранять его значение всегда в строке с типом
        //      «Доходы».
        // по сути это отменяет определение типа ид.платежа по exchange #3021
        xZR_KDOH := GetNodeAttributeEx( aZR_XML, 'KDOH');
        xType_KBK := '1';
        {
        if (LENGTH( xZR_KDOH) > 0)
          then xType_KBK := '1';


        // exchange #3021
        // Если ZR.TYPE=2 - «Доходы»
        if (xZR_TYPE = '2')
          then xType_KBK := '1'
          else begin
            // вид классификации - ZRST.TYPE_KBK_RSP первой строки,
            // если не заполнено, то «Доходы».
            xXmlNode := aZR_XML.childNodes.Item[ xIndexLines_S];
            xType_KBK := TRIM( VarToStr( xXmlNode.getAttribute( 'TYPE_KBK_RCP')));
            if ( LENGTH( xType_KBK) <= 0)
              then xType_KBK := '1'
              else
                // ZRST.TYPE_KBK_RSP - Тип.
                // Разрешеные символы(10-расходы, 20-доходы, 31-ИВФДБ, 32-ИВнФДБ)
                case xType_KBK of
                  '20':       xType_KBK := '1';
                  '10':       xType_KBK := '2';
                  '31','32':  xType_KBK := '3';
                end;//case//
          end;
          }

        // заполнение идентификатора платежа в ЭД:
        // exchange #2791 - проверка КБК в ид.платежа
        DoCheck_2791_LoadKBK0_PI_BUDGET_CODE( xZR_KDOH);

        // проверка значений полей,без проверки КБК в БД
        // коды не проверяем на =0.
        FillDepartmentalInfo( xXmlDoc,
                              aBudgetID,
                              xDocInfo,
                              GetNodeAttributeEx( aZR_XML, 'PAYSTATUS'),
                              GetNodeAttributeEx( aZR_XML, 'OKATO'),
                              GetNodeAttributeEx( aZR_XML, 'OSN_PL'),
                              GetNodeAttributeEx( aZR_XML, 'NAL_PER'),
                              GetNodeAttributeEx( aZR_XML, 'TYPE_PL'),
                              GetNodeAttributeEx( aZR_XML, 'NOM_DOK'),
                              GetNodeAttributeEx( aZR_XML, 'DATE_DOK'),
                              xType_KBK,
                              xZR_KDOH,
                              FALSE,
                              TRUE,
                              FALSE);

        // exchange #3801
        // исправлена ошибка заполнения "классификация получателя ФК" по #2616.
        // блок "классификация получателя ФК"
        for i := xIndexLines_S to xIndexLines_E do begin
          WriteLog( 'Заполняется блок "Классификация получателя в ФК"...');
          // если строк несколько - блок не заполняем
          if (xIndexLines_S <> xIndexLines_E) then begin
            WriteLog( 'Для многострочного ЭД блок "Классификация получателя в ФК" не может быть заполнен.');
            BREAK;
          end;
          xXmlNode := aZR_XML.childNodes.Item[i];

          // exchange #2616 - заполнение новых полей по ТФФ12
          // exchange #3801
          xZRST_KBK_RCP := GetNodeAttributeEx( xXmlNode, 'KBK_RCP');
          if DoFill3801_FK_BUDGET_CODE( xZRST_KBK_RCP)
            then DoFill2616_FK_BUDGET_CODE(
                                aBudgetID,
                                xZRST_KBK_RCP,
                                GetNodeAttributeEx( xXmlNode, 'TYPE_KBK_RCP'),
                                xXmlDoc)
            else WriteLog( 'Блок не заполняется.');
          BREAK;
        end;

        // exchange #2805
        // загрузка поля FAIP
        if NOT ExchImport_FAIP_Code( aZR_XML.getAttribute( 'FAIP_CODE'),
                                     xXmlDoc,
                                     xDocInfo)
          then EXIT;

        //------------------------------------------------------------------
        // exchange #2995 ФТ.3-1
        // заполнение блока "идентификация получателя" заполняем из первой
        // строки ZRST
        // АЦК-Ф 20042 (exchange #3002)
        // исправлена ошибка заполнения "идентификация получателя" вместо
        // заполнения строк.
        // exchange #3081 - отмена условий по #2952 и #2995 с заполнением
        // блока "идентификация получателя".
        // оставлена только проверка на многострочность.
        if xFillLinesBy2952 then
          // если строк несколько - блок не заполняем, считаем эд проблемным
          if (xIndexLines_S <> xIndexLines_E) then begin
            WriteInfo( 'Для многострочного ЭД блок "Классификация получателя" не может быть заполнен.');
            xProblemIntoLines2952 := TRUE;
//            BREAK;
          end;

        if NOT xProblemIntoLines2952 then
          for i := xIndexLines_S to xIndexLines_E do begin
            WriteLog( 'Заполняется блок "Классификация получателя"...');
            // если строк несколько - блок не заполняем
            if (xIndexLines_S <> xIndexLines_E) then begin
              WriteLog( 'Для многострочного ЭД блок "Классификация получателя" не может быть заполнен.');
              BREAK;
            end;

            xXmlNode := aZR_XML.childNodes.Item[i];
            xZRST_KBK_RCP := GetNodeAttributeEx( xXmlNode, 'KBK_RCP');
            // exchange #3081
            if DoFill3801_FK_BUDGET_CODE( xZRST_KBK_RCP) then begin
              WriteLog( 'Блок не заполняется.');
              BREAK;
            end;

            xZRST_TYPE_KBK_RCP := GetNodeAttributeEx( xXmlNode, 'TYPE_KBK_RCP');

            // exchange #3062
            // возможная проблема загрузки - переменная xKESR не была
            // инициализирована, поэтому проверка работала только
            // на пустую строку для случая: Если значение первых двух
            // символов реквизита ZR.LS_UBP_RCP равно «30»
            // exchange #3081 - унификация кода
            xKESR := DoEncodeKBK_KES_or_KVR( xZRST_KBK_RCP);
            //COPY( xZRST_KBK_RCP, LENGTH( xZRST_KBK_RCP) - 2, 3);
            // косгу не проверяем
            xCheckKES := FALSE;
            xCheckKVR := FALSE;     // exchange #3081

            // КОСГУ
            // exchange #2952 - ФТ-3.1
            // КОСГУ	Если значение первых двух символов реквизита
            // ZR.LS_UBP_RCP равно «30», то:
            // - если ZPST. TYPE_KBK_RCP имеет значение «20» или «пусто»
            //   И значение с 18 по 20 знак ZPST.KBK_RCP равно «000» или
            //   пустому значению, то значению поля присвоить «888»;
            // - если ZPST.TYPE_KBK_RCP имеет значение «10»  И значение с 18
            //   по 20 знак ZPST.KBK_RCP равно «000» или пустому значению,
            //   то значению поля присвоить «999».
            // Иначе заполнять поле значением с 18 по 20 знак ZPST.KBK_RCP
            // либо оставлять пустым, если ZPST.KBK_RCP пустое.
            // В случае отсутствия заполняемого значения в справочнике,
            // поле не заполнять.
            if xZR_LS_UBP_RCP_30 then begin
              case xZRST_TYPE_KBK_RCP of
                '20', '':
                    case xKESR of
                      '000','': InsertKES_for_Line_Created_ED(  xXmlDoc,
                                                                'KESR_HEAD_CODE',
                                                                '888',
                                                                TRUE,
                                                                xCheckKES);
                    end;//case//

                '10':
                    case xKESR of
                      '000','': InsertKES_for_Line_Created_ED(  xXmlDoc,
                                                                'KESR_HEAD_CODE',
                                                                '999',
                                                                TRUE,
                                                                xCheckKES);
                    end;//case//
              end;//case//
            end else begin
              // exchange #3081
              // загрузка косгу/квр + новые поля для классификации получателя
              FillLineED_AuBu_by3081( aBudgetId,
                                      xXmlDoc,
                                      xZRST_KBK_RCP,
                                      xZRST_TYPE_KBK_RCP,
                                      '195',
                                      xCheckKES,
                                      xCheckKVR,
                                      1,
                                      GetNodeAttributeEx( xXmlDoc, 'REC_ID'));
{
              if ( LENGTH( xZRST_KBK_RCP) >= 3)
                then InsertKES_for_Line_Created_ED(
                              xXmlDoc,
                              'KESR_HEAD_CODE',
                              xKESR,//COPY( xZRST_KBK_RCP, LENGTH( xZRST_KBK_RCP) - 2, 3),
                              TRUE,
                              xCheckKES)
                else InsertKES_for_Line_Created_ED(
                              xXmlDoc,
                              'KESR_HEAD_CODE',
                              '',
                              TRUE,
                              xCheckKES);}
            end;
            // здесь проверяя косгу, если кода в бд нет, то он заменяется на 0,
            // по при этом сбрасываем флаг xCheckKES.
            // это нужно для дальнейшей проверки формирования эд
            // если КОСГУ заменен на 0, то это считается проблемой формирования
            // эд
            // exchange #3062
            // исправлена ошибка с заменой кода на 0 и без проверки кода.
            if NOT CheckKES_for_Line_Created_ED_Ex( aBudgetId,
                                                     xXmlDoc,
                                                     'KESR_HEAD_CODE',
                                                     xCheckKES)
              then xProblemIntoLines2952 := TRUE;

            // exchange #3081 - проверка для КВР
            if NOT CheckKVR_for_Line_Created_ED_Ex( aBudgetId,
                                                     xXmlDoc,
                                                     'KVR_HEAD_CODE',
                                                     xCheckKVR)
              then xProblemIntoLines2952 := TRUE;

            // КВФО
            // 9 – если ZR.LS_UBP_RCP начинается на 21 или 31,
            // в остальных случаях 8.
            if ((POS( '21', xZR_LS_UBP_RCP) = 1) OR (POS( '31', xZR_LS_UBP_RCP) = 1))
              then xXmlDoc.SetAttribute( 'FSR_HEAD_ID', '9')
              else xXmlDoc.SetAttribute( 'FSR_HEAD_ID', '8');

            // Отраслевой код
            // ищем записи в аналитических строках по л/с плательщика, КВФО, КОСГУ
            // л/с подставлятся должен не как строка счета, а как id счета.
            // exchange #3081
            // отр код ищем по косгу или квр
            xXmlDoc.setAttribute(
                        'INDUSTRYCODE_HEAD_ID',
                        SearchUnicalIndustryCode(
                                    aBudgetID,
                                    GetNodeAttributeEx( xXmlDoc, 'FSR_HEAD_ID'),
                                    GetNodeAttributeEx( xXmlDoc, 'KESR_HEAD_CODE'),
                                    xPay_LS_ID,
                                    GetNodeAttributeEx( xXmlDoc, 'KVR_HEAD_CODE'),
                                    xCheckKES,
                                    xCheckKVR));

            // Код субсидии	- ZRST.ADD_KLASS_PAY
            // Искать в справочнике субсидий по коду только среди кодов,
            // у которых учредитель равен Учредителю документа, либо Не указан.
            // Если не заполнено, заполнять системным значением 0 (код 0,
            // тип «Не указан», учредитель «Не указан»).
            // exchange #2987 - дополнительное сообщение
            xXmlDoc.setAttribute(
                  'GRANTINVESTMENT_HEAD_ID',
                  SearchGrandinvestmentCodeEx(
                            aBudgetID,
                            GetNodeAttributeEx( xXmlNode, 'ADD_KLASS_RCP'),
                            xCodeFound,
                            TRUE));

            // если Код субсидии не указан или заменен на 0,
            // то это считается проблемой формирования строки
            if (LENGTH( xCodeFound) > 0) then
              if (xCodeFound <> '1')
                then xProblemIntoLines2952 := TRUE;

            BREAK;
          end;

        //------------------------------------------------------------------
        // exchange #3021
        // для ZR.TYPE=2 заполняем разделы "Документ-основания" по ZROSN
        // создаются разделы:
        // <GROUND_DOC>
        //  <GROUND_DOC KIND="1111" DOC_NUMBER="111" DOC_DATE="2012-04-12"
        //    DESCRIPTION="111" LINK_DOCUMENT_ID="" ID="980000000285"
        //    VERSION="1" BASE_PAYMENT_FLAG=""/>
        // </GROUND_DOC>
        //if (xZR_TYPE = '2') then begin
        if ((xIndexLines_S_OSN <> -1) AND (xIndexLines_E_OSN <> -1)) then begin
          WriteLog( 'Заполняются вложенные Документы-основания...');
          xXmlDocLines:= xXmlDoc.appendChild( xXml.createElement('GROUND_DOC'));
          for i := xIndexLines_S_OSN to xIndexLines_E_OSN do begin
            xXmlNode := aZR_XML.childNodes.Item[i];

            // вложенный документ
            xXmlDocLine := xXmlDocLines.appendChild(
                                              xXml.createElement('GROUND_DOC'));
            // Признак основания платежа
            // ZROSN.OSN_PLAT Обязательное для ZR.TYPE=2
            // Если ZR.TYPE=1 - поле не заполняется.
            // Если ZR.TYPE=2:
            //    Если ZROSN.OSN_PLAT=1, заполнять значением «Основание платежа».
            //    Если ZROSN.OSN_PLAT=2, заполнять значением «Документ-основание»
            //    допускается пустое значение.
            if (xZR_TYPE <> '1') then begin
              s := GetNodeAttributeEx( xXmlNode, 'OSN_PLAT');
              if (LENGTH( s) > 0) then
                case s of
                  '1': xXmlDocLine.SetAttribute( 'BASE_PAYMENT_FLAG', '1');
                  '2': xXmlDocLine.SetAttribute( 'BASE_PAYMENT_FLAG', '2');
                 else begin
                        // это на случай, если валидацию отключат или проигнорируют
                        WriteInfo( 'Поле "Признак основания платежа" имеет недопустимое значение. ЭД не будет создан.');
                        EXIT;
                      end;
                end;//case//
            end;

            // Вид документа-основания 		ZROSN.VID_OSN
            xXmlDocLine.SetAttribute( 'KIND',
                                      GetNodeAttributeEx( xXmlNode, 'VID_OSN'));
            // Номер документа основания 		ZROSN.NOM_OSN
            xXmlDocLine.SetAttribute( 'DOC_NUMBER',
                                      GetNodeAttributeEx( xXmlNode, 'NOM_OSN'));
            // Дата документа-основания 		ZROSN.DATE_OSN
            s := GetNodeAttributeEx( xXmlNode, 'DATE_OSN');
            if (LENGTH( s) > 0)
              then xXmlDocLine.SetAttribute( 'DOC_DATE',
                                             DateTimeToXml( StrToDate( s)));
            // Предмет документа-основания 		ZROSN.OSN
            xXmlDocLine.SetAttribute( 'DESCRIPTION',
                                      GetNodeAttributeEx( xXmlNode, 'OSN'));
          end;//for//
        end;

        //------------------------------------------------------------------
        // exchange #3014 - поиск отр.кода с учетом учредителя
        // берем значение один раз из шапки и передаем его каждой строке.
        // если учредитель не указан - ищется без учета учредителя.
        // в этом случае, если код есть для уяредителя и для "не указан"
        // то код не будет найден.
        xOrgID := GetNodeAttributeEx( xXmlDoc, 'ORG_ID');

        //------------------------------------------------------------------
        // вложенные таблицы
        WriteLog( 'Заполняются вложенные документы...');

          // узел списка вложенных документов
          xXmlDocLines:= xXmlDoc.appendChild( xXml.createElement('LINES'));
          for i := xIndexLines_S to xIndexLines_E do begin
            xXmlNode := aZR_XML.childNodes.Item[i];

            // вложенный документ
            xXmlDocLine := xXmlDocLines.appendChild(
                                              xXml.createElement('LINE'));
            // Сумма
            // Если значение поля «ZR.TYPE» равно «1» загружать из поля
            // «ZRST.SUM_V_KBK», если «2» - из поля «ZR.SUM_V»
            case xZR_TYPE of
              '1': xXmlDocLine.setAttribute(
                          'AMOUNT',
                          xXmlNode.getAttribute( 'SUM_V_KBK'));
              '2': xXmlDocLine.setAttribute(
                          'AMOUNT',
                          aZR_XML.getAttribute( 'SUM_V'));
            end;//case//

            // КОСГУ - Последние 3 символа ZRST.KBK_PAY
            // exchange #2955 + exchange #2952
            // поскольку проверка кбк не выполняется в начале загрузки,
            // проверка переносится сюда.
            // exchange #3081
            // загрузка косгу/квр + новые поля
            FillLineED_AuBu_by3081( aBudgetId,
                                    xXmlDocLine,
                                    xXmlNode.getAttribute( 'KBK_PAY'),
                                    xXmlNode.getAttribute( 'TYPE_KBK_PAY'),
                                    '195',
                                    xCheckKES,
                                    xCheckKVR,
                                    0,
                                    xPay_Org_ID);
(*
            xKBK := xXmlNode.getAttribute( 'KBK_PAY');
            if (LENGTH( xKBK) >= 3)
//              then xXmlDocLine.setAttribute( 'KESR_CODE', COPY( xKBK, LENGTH( xKBK) - 2, 3))
//              else xXmlDocLine.setAttribute( 'KESR_CODE', '000');
              then InsertKES_for_Line_Created_ED(
                                        xXmlDocLine,
                                        'KESR_CODE',
                                        // exchange #3062 - унификация кода
                                        DoEncodeKBK_KES( xKBK, TRUE),
//                                        COPY( xKBK, LENGTH( xKBK) - 2, 3),
                                        TRUE,
                                        xCheckKES)
              else InsertKES_for_Line_Created_ED(
                                        xXmlDocLine,
                                        'KESR_CODE',
                                        '000',
                                        FALSE,
                                        xCheckKES);
                                        *)
(*
            // exchange #2952 - ФТ-3.1
            // КОСГУ	Если значение первых двух символов реквизита
            // ZR.LS_UBP_RCP равно «30», то:
            // - если ZPST. TYPE_KBK_RCP имеет значение «20» или «пусто»
            //   И значение с 18 по 20 знак ZPST.KBK_RCP равно «000» или
            //   пустому значению, то значению поля присвоить «888»;
            // - если ZPST.TYPE_KBK_RCP имеет значение «10»  И значение с 18
            //   по 20 знак ZPST.KBK_RCP равно «000» или пустому значению,
            //   то значению поля присвоить «999».
            // Иначе заполнять поле значением с 18 по 20 знак ZPST.KBK_RCP
            // либо оставлять пустым, если ZPST.KBK_RCP пустое.
            // В случае отсутствия заполняемого значения в справочнике,
            // поле не заполнять.
            if xFillLinesBy2952 then begin
              xZRST_KBK_RCP := VarToStr( xXmlNode.getAttribute( 'KBK_RCP'));

              // косгу берем последние 3 символа строки KBK_RCP
              // exchange #2995 - поправлено заполнение косгу
              if ( LENGTH( xZRST_KBK_RCP) >= 3)
                then xKESR := COPY( xZRST_KBK_RCP, LENGTH( xZRST_KBK_RCP) - 2, 3)
                else xKESR := '';
              InsertKES_for_Line_Created_ED(  xXmlDocLine,
                                              'KESR_CODE',
                                              xKESR,
                                              TRUE,
                                              xCheckKES);
              if xZR_LS_UBP_RCP_30 then
                case VarToStr( xXmlNode.getAttribute( 'TYPE_KBK_RCP')) of
                  '20', '':
                      case xKESR of
                        '000','': InsertKES_for_Line_Created_ED(  xXmlDocLine,
                                                                  'KESR_CODE',
                                                                  '888',
                                                                  TRUE,
                                                                  xCheckKES);
                      end;//case//

                  '10':
                      case xKESR of
                        '000','': InsertKES_for_Line_Created_ED(  xXmlDocLine,
                                                                  'KESR_CODE',
                                                                  '999',
                                                                  TRUE,
                                                                  xCheckKES);
                      end;//case//
              end;
            end;
            *)


            // проверка косгу. если проверка не успешная - эд не создаем
//            if NOT CheckKES_for_Line_Created_ED( aBudgetId,
//                                                 xXmlDocLine,
//                                                 'KESR_CODE',
//                                                 xCheckKES,
//                                                 aChangeKBKto0,
//                                                 'ЭД не создан. %s')
//              then EXIT;
            // exchange #2952
            // здесь проверяя косгу, если кода в бд нет, то он заменяется на 0,
            // по при этом сбрасываем флаг xCheckKES.
            // это нужно для дальнейшей проверки формирования эд
            // exchange #3062
            // исправлена ошибка с заменой кода на 0 и без проверки кода.
            // если КОСГУ заменен на 0, то это считается проблемой формирования
            // строки
            if NOT CheckKES_for_Line_Created_ED_Ex( aBudgetId,
                                                     xXmlDocLine,
                                                     'KESR_CODE',
                                                     xCheckKES)
              then xProblemIntoLines2952 := TRUE;

            // exchange #3081 - проверка для КВР
            if NOT CheckKVR_for_Line_Created_ED_Ex( aBudgetId,
                                                     xXmlDocLine,
                                                     'KVR_CODE',
                                                     xCheckKVR)
              then xProblemIntoLines2952 := TRUE;

            // КВФО
            // 9 – если IK.LS_UBP начинается на 21 или 31,
            // в остальных случаях 8.
            if ((POS( '21', xIK_LS_UBP) = 1) OR (POS( '31', xIK_LS_UBP) = 1))
              then xXmlDocLine.setAttribute( 'FSR_ID', '9')
              else xXmlDocLine.setAttribute( 'FSR_ID', '8');

            // Отраслевой код
            // ищем записи в аналитических строках по л/с плательщика, КВФО, КОСГУ
            // л/с подставлятся должен не как строка счета, а как id счета.
            xXmlDocLine.setAttribute(
                        'INDUSTRYCODE_ID',
                        SearchUnicalIndustryCode(
                                    aBudgetID,
                                    GetNodeAttributeEx( xXmlDocLine, 'FSR_ID'),
                                    GetNodeAttributeEx( xXmlDocLine, 'KESR_CODE'),
                                    xPay_LS_ID,
                                    GetNodeAttributeEx( xXmlDocLine, 'KVR_CODE'),
                                    xCheckKES,
                                    xCheckKVR));

            // Код субсидии	- ZRST.ADD_KLASS_PAY
            // Искать в справочнике субсидий по коду только среди кодов,
            // у которых учредитель равен Учредителю документа, либо Не указан.
            // Если не заполнено, заполнять системным значением 0 (код 0,
            // тип «Не указан», учредитель «Не указан»).
            // exchange #2987 - дополнительное сообщение
            // exchange #3014 - поиск с учетом учредителя
            xXmlDocLine.setAttribute(
                  'GRANTINVESTMENT_ID',
                  SearchGrandinvestmentCodeEx(
                            aBudgetID,
                            GetNodeAttributeEx( xXmlNode, 'ADD_KLASS_PAY'),
                            xCodeFound,
                            TRUE,
                            xOrgID));

            // если Код субсидии не указан или заменен на 0,
            // то это считается проблемой формирования строки
            if (LENGTH( xCodeFound) > 0) then
              if (xCodeFound <> '1')
                then xProblemIntoLines2952 := TRUE;


            // Назначение платежа	Назначение платежа	ZRST.PURPOSE_KBK
            // exchange #3021
            // заполняется только в случае полного эд
            if (xZR_TYPE <> '2') then begin
              xXmlDocLine.setAttribute(
                    'DESCRIPTION_LINES',
                    TRIM( VarToStr( xXmlNode.getAttribute( 'PURPOSE_KBK'))));
              // Примечание	Примечание	ZRST.NOTE_KBK
              xXmlDocLine.setAttribute(
                    'NOTE',
                    TRIM( VarToStr( xXmlNode.getAttribute( 'NOTE_KBK'))));
            end;
          end;//for//

      //------------------------------------------------------------------
      // передаем документ на сервер
      // exchange #2866
      // после создания эд и изменения статуса, создаем эд 5го класса
      // и линкуем с созданным эд 195го класса, если aCfgCreateDoc5=true.

      // exchange #2952
      // если проблем в строках нет, создаем эд как раньше.
      // если проблемы есть, проверяем параметр aCfg_CreateParamAUBU.
      // здесь учитываем xFillLinesBy2952 - ФТ-4:
      //   Вызывать метод формирования ЭД класса 193 вместо эд 5го
      //   по параметру конфига aCfgCreateDoc5.
      CreateDoc_194_195_by_IK_Ex( aBudgetID,
                                  xXmlDoc,
                                  aCfgCreateDoc5,
                                  xProblemIntoLines2952,
                                  aCfg_CreateParamAUBU,
                                  xFillLinesBy2952);
//      Exec_ChildDoc( aBudgetID, '', xXmlDoc, TRUE, aCfgCreateDoc5);
//      WriteLog( 'ЭД Создан на статусе "Черновик".');
      except
        ExceptionLog( 'Сбой Un_ImpIK_2600_ZR.Exch2600_Build195_By_IK_ZR');
    end;

end;

begin
end.
