{~Exch2600_Build194_By_IK_ZN
  создание ЭД 194го класса при загрузке IK из раздела ZS по exchange #2600.
  здесь, в основном, взято по аналогии с Exch2600_Build194_By_IK_ZS,
  за исключением названия полей из ZN и способа получения наличных - карта.

  параметры
     aZN_XML - описание раздела ZN.
                это первый подэлемент в списке элементов узла IK.
                структура:
                  IK
                    ZN
                    ZNKBK
                    ZNKBK
                    ZNKBK
                    ...
     aZN_XML_Index - индекс узла ZN в списке элементов узла IK.
                структура:
                  IK
                    ZN       <-- индекс этого узла в списке подузлов IK
                    ZNKBK    <-- xIndexLines_S - первая строка в ZN
                    ZNKBK
                    ZNKBK    <-- xIndexLines_E - последняя строка в ZN
                    ...

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

  в результате будет создан нужный ЭД, если все будет этому благоволить.}
procedure Exch2600_Build194_By_IK_ZN( aZN_XML: Variant;
                                      aZN_XML_Index: integer;
                                      aBudgetId: string;
                                      aFinYear: string;
                                      aCfg_2600_CreateED_AUBU: boolean;
                                      aCfgCreateDoc5: boolean;
                                      aChangeKBKto0: boolean;
                                      aCfg_CreateParamAUBU: string);
var
  i,i2: integer;
  xIK_XML: Variant;
  xIK_LS_UBP: string;
  xZN_DocNum: string;
  xZN_DocDate: string;
  xZN_GUID_FK: string;
  xLines_Amount: Variant;
  xDocInfo194: string;
  xXml: Variant;
  xXmlDoc: Variant;
  xXmlNode: Variant;
  xPay_Org_Code: string;
  xPay_LS_ID: string;
  xPay_Org_ID: string;
  xPay_LS_Xml: Variant;
  xPay_BudgetId: string;
  xRec_Xml: Variant;
  xIndexLines_S: integer;
  xIndexLines_E: integer;
  xXmlDocLines: Variant;
  xXmlDocLine: Variant;
  xType_KBK: string;
  xKBK: string;
  xDocID: string;
  xXMLFound: integer;
  xCheckKES: boolean;
  xCheckKVR: boolean;
  xIndustryCodeFound: string;
  xProblemIntoLines2952: boolean;
  xOrgID: string;
//  xCardXml: Variant;
begin

    try
      xIK_XML    := aZN_XML.parentNode;
      xZN_DocNum := aZN_XML.getAttribute('NOM_ZN');
      xZN_DocDate:= aZN_XML.getAttribute('DATE_ZN');
      xZN_GUID_FK:= aZN_XML.GetAttribute('GUID_FK');
      // поле л/с обязательно
      xIK_LS_UBP := TRIM( VarToStr( xIK_XML.getAttribute('LS_UBP')));


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

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

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

      //------------------------------------------------------------------
      // сумма всех строк в валюте выплаты
      xLines_Amount := 0.0;
      for i := xIndexLines_S to xIndexLines_E do begin
        xXmlNode := aZN_XML.childNodes.Item[i];

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


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

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

      // 2.5.2.1.	производим поиск ЭД 194 класса в списке ЭД системы
      // (по Номеру заявки, Дате заявки, Сумма документа в валюте выплаты
      // (общая сумма всех строк ЭД «Заявка БУ/АУ на выплату средств»),
      // Номеру лицевого счета (IK.LS_UBP – Счет плательщика)
      // среди ЭД с признаком «Способ получения наличных» = «Карта»
      // 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 = 194'
                        +' and LTrim(A.Doc_Number) = ? and A.Doc_Date = ?'
                        +' and A.WAYTOGETCASH = 1' // «Способ получения наличных»
                        +' and a.amount = ?'
                        +' and A.Pay_Account = ?'
                        +' and A.dispstatus_id>-1',
                        [ aBudgetId,
                          xZN_DocNum,
                          StrToDate( xZN_DocDate),
                          // exchange #2817
                          // возможна проблема с передачей значения как число
                          FORMAT( '%0.2f', [ xLines_Amount]),
                          xIK_LS_UBP],
                        FALSE);
      xXMLFound := xXML.documentElement.childNodes.Length;

      // 2.4.2.1.1.	Если ЭД однозначно найден, записываем в поле Foreign_key,
      // если еще не заполнено, значение IK.ZS.GUID_FK.
      if (xXMLFound = 1) then begin
        xXML := xXml.documentElement.childNodes.Item[0];
        // exchange #3019
        // теперь форенкей нужно заполнять всегда, но делаем обновление
        // только если он отличается
        if (GetNodeAttributeEx( xXML, 'FOREIGN_KEY') <> xZN_GUID_FK)
//        if (LENGTH( TRIM( xXML.GetAttribute( 'FOREIGN_KEY'))) <= 0)
          then UpdateDocumentForegnKey( '194', xXML.GetAttribute( 'ID'), xZN_GUID_FK);
        EXIT;
      end;

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

      // 2.3.2.1.2.	Если не найден, и настройка «Создавать документы БУ/АУ»
      // включена, записывать запись в лог и приступать к обработке
      // следующего документа
      if (xXMLFound <= 0) then begin
        // если настройка выключена - ничего в лог не пишем и обрабатываем файл
        // дальше.
        if NOT aCfg_2600_CreateED_AUBU then begin
          WriteLog( FORMAT( 'ЭД %s - не найден и, по настройке, не будет создан.',
                             [ xDocInfo194]));
          EXIT;
        end;
        // логируем что ЭД не найден
        WriteLog( FORMAT( 'ЭД %s не найден и будет создан.',
                          [ xDocInfo194]));
      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);
      { Реквизиты организации-владельца «Счета для наличных»,
        указанного в карточке «Счета плательщика».
        Наименование – официальное, КПП – с основной закладки
        «Счет для наличных», указанный в  карточке «Счета плательщика»
        Из карточки «Счет для наличных», указанный в  карточке «Счета плательщика»
        exchange #2862
        "Счет" блока "Расходование" ЭД класса 11 заполнять значением поля
        «Счёт для наличных (деб.карты)» карточки лицевого счета,
        указанного в поле «Счет для финансирования».
        Если значение поля пустое, то заполнять значением поля «Счет для наличных»
        в данном случае запрос поиска орг. взят из функции GetOrgByCashAcc
        но поле счета для связки будет получено из функции GetAccountFieldID2862.}
      xRec_Xml := QueryXml(  ' select oa.keeper_id ID, ko.taxcode INN, ko.kpp KPP,'
                            +' koa.account_number ANUM, kboa.bic BIC,'
                            +' kboa.coraccount CORANUM, kboa.description BANKNAME,'
                            +' ko.DESCRIPTION ORGDESCR, koa.id ANUM_ID'
                            +' from orgaccount oa'
                            +' left join org ko on oa.keeper_id=ko.id'
                            +' left join orgaccount koa on'
                            +' oa.' + GetAccountFieldID2862( xPay_LS_ID) + '=koa.id'
                            +' left join bank kboa on kboa.id=koa.bank_id'
                            +' where oa.id=?',
                             [ xPay_LS_ID]);
      xRec_Xml := xRec_Xml.documentElement.childNodes.Item[0];

      //------------------------------------------------------------------
      // создаем документ

        xXml := CreateOleObject('Microsoft.XmlDom');
        xXmlDoc := xXml.appendChild( xXml.createElement('DOCUMENT'));
        xXmlDoc.setAttribute( 'action', 'insert');
        xXmlDoc.setAttribute( 'class', '194');
        xXmlDoc.setAttribute( 'BUDGET_ID', aBudgetID);
        // F_BUDGET_ID и FOREIGN_KEY нужны для проверки документа в
        // подпрограмме ExistsDocument.
        xXmlDoc.setAttribute( 'F_BUDGET_ID', aBudgetID);
        xXmlDoc.setAttribute( 'FOREIGN_KEY', xZN_GUID_FK);
//        xXmlDoc.setAttribute( 'F_ORIGINAL_TYPE',
//                              xDocument.getAttribute( 'F_ORIGINAL_TYPE'));
        // Номер документа	Номер заявки	ZS.NOM_ZVK
        xXmlDoc.setAttribute( 'DOC_NUMBER', xZN_DocNum);
        // Дата документа	Дата заявки	ZS.DATE_ZVK
        // строка должна быть в формате YYYY-MM-DD
        xXmlDoc.setAttribute( 'DOC_DATE',
//                              DDdMMdYYYY_To_YYYYmMMmDD_Str(
                              DateTimeToXml( StrToDate( xZN_DocDate)));
        // тип операции по умолчанию для текущего ЭД
        xXmlDoc.setAttribute( 'OPERTYPE_ID',
                              OperTypeDefaultForClassEx(
                                            xXmlDoc.GetAttribute( 'class')));
        // дата подписания заполняется датой документа
        xXmlDoc.setAttribute( 'SIGN_DATE',
                              xXmlDoc.getAttribute( 'DOC_DATE'));
        // сумма из всех строк
        xXmlDoc.setAttribute( 'AMOUNT',
                              FORMAT( '%0.2f', [ xLines_Amount]));

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

        // Предельная дата исполнения - Не заполняется
        // Обязательство - Не заполняется
        //------------------------------------------------------------------
        // плательщик
        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' , xRec_Xml.getAttribute( 'INN'));
        // КПП контрагента
        xXmlDoc.setAttribute( 'REC_KPP'     , xRec_Xml.getAttribute( 'KPP'));
        // Наименование получателя
        xXmlDoc.setAttribute( 'REC_NAME'    , xRec_Xml.getAttribute( 'ORGDESCR'));
        // ид.организации
        xXmlDoc.setAttribute( 'REC_ID'      , xRec_Xml.getAttribute( 'ID'));
        // подставляем номер счета
        xXmlDoc.setAttribute( 'REC_ACCOUNT' , xRec_Xml.getAttribute( 'ANUM'));
        xXmlDoc.setAttribute( 'REC_ACC_ID'  , xRec_Xml.getAttribute( 'ANUM_ID'));
        // БИК банка получателя
        xXmlDoc.setAttribute( 'REC_BIC'     , xRec_Xml.getAttribute('BIC'));
        // Наименование банка получателя
        xXmlDoc.setAttribute( 'REC_B_NAME'  , xRec_Xml.getAttribute('BANKNAME'));
        // Коррсчет банка Получателя (контрагента) ZR.KS_BIC_RCP
        xXmlDoc.setAttribute( 'REC_CORACCOUNT', xRec_Xml.getAttribute('CORANUM'));
        // Филиал				Не заполняется
        // Орган, осущ. кассовое обслуживание	-			Не заполняется
        // Счет органа, осущ. кассовое обслуживание	-			Не заполняется
        //------------------------------------------------------------------
        // прочее
        WriteLog( 'Заполнение блока прочее.');
        // вид платежа - не заполняется
        // очередность платежа - не заполняется
        // внешний статус - не выгружен
        xXmlDoc.setAttribute( 'EXTSTATUS_ID', '0');
        //Назначение платежа - не заполняется
        // вид операции - не заполняется
        // вид операции по л/с - не заполняется
        // результат проверки - не заполняется
        // комментарий - не заполняется
        //------------------------------------------------------------------
        // блок "чек"
        WriteLog( 'Заполнение блока "чек".');
        // способ получения наличных - карта
        xXmlDoc.setAttribute( 'WAYTOGETCASH', '1');
        // Номер банковской карты	ZN.CARD_NUM
        xXmlDoc.setAttribute( 'CARD_NUMBER', aZN_XML.GetAttribute( 'CARD_NUM'));
{
        // Искать в справочнике карт на статусе 97.
        // Если не найдена, заполнять без ID
        xCardXml := QueryXml(  ' select c.* from debitcards c where c.card_number=?'
                              +' and c.dispstatus_id=97',
                              [ aCardNumber]);
        if (xCardXml.documentElement.ChildNodes.Length = 1)
          then ;
}
        // exchange #2823
        // загрузка поля FAIP из IK.ZN.FAIP_CODE
        if NOT ExchImport_FAIP_Code( aZN_XML.getAttribute( 'FAIP_CODE'),
                                     xXmlDoc,
                                     xDocInfo194)
          then EXIT;

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

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

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

            // вложенный документ
            xXmlDocLine := xXmlDocLines.appendChild(
                                              xXml.createElement('LINE'));
            // Сумма - ZNKBK.SUMMA
            xXmlDocLine.setAttribute(
                          'AMOUNT',
                          xXmlNode.getAttribute( 'SUMMA'));

            // КОСГУ - Последние 3 символа ZSCH2.KBK
            // exchange #2955 + exchange #2952
            // поскольку проверка кбк не выполняется в начале загрузки,
            // проверка переносится сюда.
            // exchange #3081
            // загрузка косгу/квр + новые поля
            FillLineED_AuBu_by3081( aBudgetId,
                              //      xXmlDoc,
                                    xXmlDocLine,
                                    xXmlNode.getAttribute( 'KBK'),
                                    xXmlNode.getAttribute( 'TYPE_KBK'),
                                    '194',
                                    xCheckKES,
                                    xCheckKVR,
                                    0,
                                    xPay_Org_ID);
            // exchange #3081 - доработка заполнения направления
            UpdateLineED_AuBu_by3081_Direction( xXmlDocLine, 0);
(*
            xKBK := xXmlNode.getAttribute( 'KBK');
            if (LENGTH( xKBK) >= 3)
//              then xXmlDocLine.setAttribute( 'KESR_CODE', )
//              else xXmlDocLine.setAttribute( 'KESR_CODE', '000');
              then InsertKES_for_Line_Created_ED(
                                        xXmlDocLine,
                                        'KESR_CODE',
                                        // exchange #3062 - унификация кода
                                        DoEncodeKBK_KES( xKBK),
//                                        COPY( xKBK, LENGTH( xKBK) - 2, 3),
                                        TRUE,
                                        xCheckKES)
              else InsertKES_for_Line_Created_ED(
                                        xXmlDocLine,
                                        'KESR_CODE',
                                        '000',
                                        FALSE,
                                        xCheckKES);
  *)

            // КВФО
            // 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');

            // exchange #2831
            // ФТ-1.2
            // При формировании строки ЭД класса 194 с признаком «Карта» по
            // каждой строке блока ZNKBK, если  ZNKBK.KBK пустое и первые два
            // знака ZN.LS равны «30», то полям строки формируемого ЭД:
            // «КВФО» присвоить значение поля «Номер» строки справочника
            // «Виды финансового обеспечение»  «8», «КОСГУ» присвоить значение
            // поля «Код» «999» справочника «Экономический классификатор» с
            // типом расходы.
            // Заполнение всех остальных реквизитов строки остается без
            // изменения.
            if (LENGTH( xKBK) <= 0) then
              if (POS( '30', xIK_LS_UBP) = 1) then begin

//                xXmlDocLine.setAttribute( 'KESR_CODE', '999');
                // exchange #2952 + exchange #2955
                // вставка кода КОСГУ в строку с учетом проверки КБК
                InsertKES_for_Line_Created_ED( xXmlDocLine,
                                                 'KESR_CODE',
                                                 '999',
                                                 TRUE,
                                                 xCheckKES);
                xXmlDocLine.setAttribute( 'FSR_ID', '8');
              end;

            // проверка косгу. если проверка не успешная - эд не создаем
            // exchange #2952
            // здесь проверяя косгу, если кода в бд нет, то он заменяется на 0,
            // по при этом сбрасываем флаг xCheckKES.
            // это нужно для дальнейшей проверки формирования эд
            // если КОСГУ заменен на 0, то это считается проблемой формирования
            // строки
            // exchange #3062
            // исправлена ошибка с заменой кода на 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;

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

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

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

            // Назначение платежа	Назначение платежа ZNKBK.PURPOSE
            xXmlDocLine.setAttribute(
                  'DESCRIPTION_LINES',
                  TRIM( VarToStr( xXmlNode.getAttribute( 'PURPOSE'))));
            // Примечание	Примечание ZNKBK.NOTE
            xXmlDocLine.setAttribute(
                  'NOTE',
                  TRIM( VarToStr( xXmlNode.getAttribute( 'NOTE'))));
            // Символ кассы - не заполняется
          end;//for//

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

      // exchange #2952
      // если проблем в строках нет, создаем эд как раньше.
      // если проблемы есть, проверяем параметр aCfg_CreateParamAUBU.
      CreateDoc_194_195_by_IK_Ex( aBudgetID,
                                  xXmlDoc,
                                  aCfgCreateDoc5,
                                  xProblemIntoLines2952,
                                  aCfg_CreateParamAUBU);
      //Exec_ChildDoc( aBudgetID, '', , TRUE, aCfgCreateDoc5)
//      WriteLog( 'ЭД Создан на статусе "Черновик".');
      except
        ExceptionLog( 'Сбой Un_ImpIK_2600_ZN.Exch2600_Build194_By_IK_ZN');
    end;

end;

begin
end.
