{~Doc5ByIK_BDPB_Mark2831
    exchange #2831
    пометить ЭД 5го класса для возможного создания 195го класса из 5го
    при линковке но только по условию создания 5го класса из IK.BDPD
    по новому алгоритму, если счет начинается на 30 и КОСГУ=999.
    rxchange #2998
    если по конфигурации создавать эд 195/194 не нужно, то создавать
    эд 195й по эд 5му не нужно (CreateDoc195_ByDoc5_2831 не вызывать).
    вместо этого искать 195й по номеру эд+дата+сумма в бд на 86м статусе
    и линковать его с эд 5м.
    при поиске нужен счет из IK.LS_UBP, поэтому его сохраняем в отдельном
    атрибуте.}
procedure Doc5ByIK_BDPB_Mark2831( aDoc: Variant;
                                  aCfg_CreateAUBU: boolean;
                                  aIK_LS_UBP: string);
begin

    try
      // в атрибуте необходимо указать произвольное значение
      // отличное от пустой строки
      aDoc.SetAttribute( '_2831_Create_195_', '1');
      // если не нужно создавать эд 195й по 5-му из IK.BDPD,
      // выставляем атрибут
      if NOT aCfg_CreateAUBU then begin
        aDoc.SetAttribute( '_2998_Create_195_', '1');
        aDoc.SetAttribute( '_2998_Create_195_LS_', aIK_LS_UBP);
      end;
      except
        ExceptionLog( 'Сбой Doc5ByIK_BDPB_Mark2831');
    end;

end;


{~Check_Doc5ByIK_BDPB_Mark2831
  поверяется атрибут _2831_Create_195_ в документе aDoc
  (см. подпрограмму Doc5ByIK_BDPB_Mark2831).}
function Check_Doc5ByIK_BDPB_Mark2831( aDoc: Variant): boolean;
begin

    try
      Result := (VarToStr( aDoc.GetAttribute( '_2831_Create_195_')) <> '');

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

end;


{~CreateDoc195_ByDoc5_2831
  exchange #2831
    создание ЭД 195го класса по ЭД 5го класса, созданного по новому алгоритму
    из IK.BDPD.
    после создания ЭД 195го класса его необходимо довести но статуса для
    линковки, но это выполняться будет не здесь.

    здесь проверяется создаваемый эд 195й на дубли в бд по:
    номер+дата+счет+(тип документа в ФК=РР) без гуид.
    если найден один эд с пустым гуид - гуид обновляется, а новый эд 195й
    не создается.
    найденный эд возвращается в aFoundDoc195.

    результат:
      =false - ЭД 195го класса не создан
      =true - эд возможно создан и переведен на нужный статус.
              но не факт - может и застрять на каком нибудь статусе.}
function CreateDoc195_ByDoc5_2831( aDoc5: Variant; var aFoundDoc195: Variant): variant;
var
  xXmlDoc195: Variant;
  xDoc195: Variant;
  xPAY_ID: string;
  i,i2: integer;
  xDoc5Lines: Variant;
  xDoc5Line: Variant;
  xDoc195Lines: Variant;
  xDoc195Line: Variant;
  xLinesCount: integer;
  xBudgetID: string;
  xIndustryCodes: TStringList;
  xPAY_ACCOUNT: string;
  xDocInfo: string;
  xDocNum: string;
  xDocDate: string;
  xAmount: string;
  xGUID: string;

  {~SetParamDoc195FromDoc5_
    копирование поля из Doc5 (aParamDoc5) в Doc195 (aParamDoc195).
    отсутствующее поле в Doc5 будет заменено пустой строкой.}
  procedure SetParamDoc195FromDoc5_( aParamDoc195, aParamDoc5: string);
  begin

      try
        xDoc195.SetAttribute( aParamDoc195,
                              VarToStr( aDoc5.GetAttribute( aParamDoc5)));

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

  end;


  {~SetLineDoc195FromDoc5_}
  procedure SetLineDoc195FromDoc5_( aLine195, aLine5: Variant);

    {~DoSearchOtrKod_
      поиск отр.кода в справочнике "правила соответствия классификаторов бу/ау"
      по л/с (маска) и квфо. тип субсидии = "не указан" (=3).
      проблема в том, что в справ. соответствий отр код указывается как маска.
      поэтому, если нашелся отр код в правилах, его нужно проверить: это маска
      или значение ?
        если маска - поискать в справочнике,
        если значение - тоже искать на наличие его в справочнике.
      причем отр.код нужно проверять с привязкой к бюджету создаваемого эд
      195го класса.
      если код не будет найден в правилах, нужно вернуть нулевой код
      с учетом маски.}
    function DoSearch_INDUSTRYCODE_: string;
    var
      xXml: Variant;
      xRootXml: Variant;
      xNodeXml: Variant;
      i,j: integer;
      xFoundCount: integer;
      xIndustryCode: string;
      xIndustryCodeID: string;
      xFoundIndustryCodeID: string;
      xLSMaska: string;
      xIndustryMaska: string;
      xFound: boolean;
    begin

        try
          Result := '';

          // системный отр.код - по умолчанию
          // если код не будет найден - возвращается пустое значение
          xXml :=  QueryXml( ' select g.id from INDUSTRYCODE g'
                            +' where g.budget_id=? and g.code=?',
                             [ xBudgetID,
                               FormatKbk( 'INDUSTRYCODE', '0', xBudgetID)]);
          try
            xRootXml := xXml.documentElement;
            if (xRootXml.childNodes.Length <> 1) then begin
              WriteInfo( FORMAT( 'Не найден нулевой отраслевой код для бюджета %s.',
                                 [ xBudgetID]));
              EXIT;
            end;
            Result := xRootXml.childNodes.Item[0].GetAttribute('ID');
            finally
              xXml.LoadXml( '');
          end;

          xIndustryCodes.Clear;    // еще ничего не нашли

          // здесь "тип субсидии" привязываем к Id=3, а не ищем строку "Не указан"
          // в справочнике "типы субсидий"
          // exchange #2872
          // добавлена привязка к бюджету
          xXml :=  QueryXml( ' Select Accountnumber_Mask, Industrycode_Mask'
                            +' From AubuclassifiersRules'
                            +' where GrantinvestmentType = 3 and Fsr_Id=?'
                            +' and budget_id=?',
                              [ aLine195.GetAttribute( 'FSR_ID'),
                                xBudgetID]);
          try
            xRootXml := xXml.documentElement;
            // здесь ищем все маски отр кодов в соответствии с л/с.
            // причем игнорируем одинаковые маски отр.кодов
            for i := 0 to xRootXml.childNodes.Length - 1 do begin
              xNodeXml      := xRootXml.childNodes.Item[i];
              xLSMaska      := VarToStr( xNodeXml.getAttribute('ACCOUNTNUMBER_MASK'));
              xIndustryMaska:= VarToStr( xNodeXml.getAttribute('INDUSTRYCODE_MASK'));
              // проверяем маску на идентичность счета
              if (xLSMaska = xPAY_ACCOUNT) then begin
  
                if (xIndustryCodes.IndexOf( xIndustryMaska) = -1)
                  then xIndustryCodes.Add( xIndustryMaska);
              end else
                // проверяем л/с на совпадение по маске
                if MatchesMask( xPAY_ACCOUNT, xLSMaska) then begin
  
                  if (xIndustryCodes.IndexOf( xIndustryMaska) = -1)
                    then xIndustryCodes.Add( xIndustryMaska);
                end;
            end;//for//
            finally
              xXml.LoadXml( '');
          end;
  

          // теперь пробуем понять, что из найденных масок есть в справочнике
          // отр. кодов
          if (xIndustryCodes.Count > 0) then begin
            // пока считаем что ничего не нашли
            xFoundCount          := 0;
            xFoundIndustryCodeID := '';
            // получаем список отр.кодов для бюджета из справочника
            xXml :=  QueryXml( ' select g.id, g.code from INDUSTRYCODE g'
                              +' where g.budget_id=?',
                               [ xBudgetID]);
            try
              // пробуем найти отр.код, соответствующий найденным маскам
              // из правил
              xRootXml := xXml.documentElement;
              for i := 0 to xIndustryCodes.Count - 1 do begin
                xIndustryMaska := xIndustryCodes.Strings[i];
                for j := 0 to xRootXml.childNodes.Length - 1 do begin
                  xNodeXml        := xRootXml.childNodes.Item[j];
                  xIndustryCodeID := VarToStr( xNodeXml.GetAttribute('ID'));
                  xIndustryCode   := VarToStr( xNodeXml.GetAttribute('CODE'));

                  // проверяем маску на идентичность отр.кода
                  if (xIndustryMaska = xIndustryCode) then begin
                    xFound := TRUE;
  
                  end else
                    // проверяем отр.код на совпадение по маске
                    if MatchesMask( xIndustryCode, xIndustryMaska) then begin
                      xFound := TRUE;
  
                    end else
                      xFound := FALSE;

                  // здесь проверяем, если это один и тот же отр код,
                  // тогда его за найденный не считаем.
                  // такое может быть, если есть разные маски, которые
                  // удовлетворяют одному и тому же отрг.коду.
                  if xFound then
                    if (xFoundIndustryCodeID <> xIndustryCodeID) then begin
                      INC( xFoundCount);
                      if (xFoundCount > 1) then begin
  
                        // найдено несколько отр кодов - заполняем отр. код нулевым
                        EXIT;
                      end;
                      xFoundIndustryCodeID := xIndustryCodeID;
                    end;
                end;//for//
              end;//for//
              finally
                xXml.LoadXml( '');
            end;
            // если найден единственный код - возвращаем его как результат.
            // проверка нужна на случай если не найдено ни одного отр.кода.
            if (xFoundCount = 1)
              then Result := xFoundIndustryCodeID;
          end;
          except
            ExceptionLog( 'Сбой DoSearch_INDUSTRYCODE_');
        end;

    end;

  var
    xAnalKind: string;
    xFSR_ID: string;
  begin

      try
        // сумма
        aLine195.SetAttribute( 'AMOUNT',
                               VarToStr( aLine5.GetAttribute( 'AMOUNT')));

        // тип строки эд 5го класа
        xAnalKind := VarToStr( aLine5.GetAttribute( 'ANAL_KIND'));
        // КВФО из строки эд 5го класса
        xFSR_ID := VarToStr( aLine5.GetAttribute( 'FSR_ID'));

        // косгу + КВФО
        // в зависимости от типа строки в эд5го класса заполняем поля
        // в эд 195м классе.
        // предполагается что строка эд 5го класса будет расходной,
        // иначе заполняем косгу + КВФО предстановленным значением.
        if ((LENGTH( xFSR_ID) <= 0) OR (xAnalKind <> '0')) then begin
          // КОСГУ берем из строки справочника «Экономические классификаторы»
          // с кодом «999». Если не найдено  - не заполнять (=000)
          if KbkExists( xBudgetId, '999', 'Kes')
            then aLine195.SetAttribute( 'KESR_CODE', '999')
            else aLine195.SetAttribute( 'KESR_CODE',
                                        FormatKbk( 'KES', '0', xBudgetId));
          // КВФО=8
          aLine195.SetAttribute( 'FSR_ID', '8');
        end else begin
          aLine195.SetAttribute( 'FSR_ID',
                                 VarToStr( aLine5.GetAttribute( 'FSR_ID')));
          aLine195.SetAttribute( 'KESR_CODE',
                                 VarToStr( aLine5.GetAttribute( 'KESR_CODE')));
        end;

        // назначение платежа
        aLine195.SetAttribute( 'DESCRIPTION',
                               VarToStr( aLine5.GetAttribute( 'DESCRIPTION')));
        // примечание - не заполняется
        aLine195.SetAttribute( 'NOTE', '');
        // обязательство - не заполняется
        //aLine195.SetAttribute( 'ORG_ID', '');

        // отр.код - всегда после квфо!
        aLine195.SetAttribute( 'INDUSTRYCODE_ID',
                               DoSearch_INDUSTRYCODE_);

        // код субсидии - возвращаем нулевой код
        aLine195.SetAttribute( 'GRANTINVESTMENT_ID',
                               SearchUnicalGrantinvestmentCodeNull( xBudgetID));

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

  end;

var
  xXml: Variant;
  xFound: integer;
begin

    try
      Result := NULL;

      // бюджет берем из ЭД 5го класса
      xBudgetID := VarToStr( aDoc5.GetAttribute( 'F_BUDGET_ID'));

      // счет плательщика
      xPAY_ID       := VarToStr( aDoc5.GetAttribute( 'PAY_ID'));
      xPAY_ACCOUNT  := VarToStr( aDoc5.GetAttribute( 'PAY_ACCOUNT'));
      // описание ЭД
      xDocNum       := TRIM( VarToStr( aDoc5.GetAttribute( 'DOC_NUMBER')));
      xDocDate      := VarToStr( aDoc5.GetAttribute( 'DOC_DATE'));
      xAmount       := VarToStr( aDoc5.GetAttribute( 'AMOUNT'));
      // BDPD.GUID_FK
      xGUID         := VarToStr( aDoc5.GetAttribute( 'FOREIGN_KEY'));

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

      //------------------------------------------------------------------
      // проверяем, есть ли такой ЭД 195го клааса по: номеру эд,
      // дате эд, сумме (из шапки), счету плательщика и BDPD.GUID_FK.
      // это дает проверить, загружен ли такой эд из файла (создан ли
      // уже этой процедурой) или нет.
      // exchange #2998
      // признак "Тип документа в ФК"=PP при поиске дублей эд 195х
      // при поиске не учитываем гуид, а когда найдем эд, проверяем
      // и обновляем гуид.
      // здесь не учитывается статус эд. при этом при линковке с 5м
      // если найденный эд будет не на том статусе - линковка не состоится,
      // но все будет по правилам.
      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.FOREIGN_KEY=?'
                        +' and A.dispstatus_id>-1',
                        [ xBudgetID,
                          xDocNum,
                          // дата описана в хмл как yyyy-mm-dd а нужно dd.mm.yyyy
                          StrToDate( YYYYmMMmDD_to_DDdMMdYYYY( xDocDate)),
                          'PP',              // Тип документа в ФК
                          // есть проблема с передачей значения как число
                          // поэтому передаем строкой
                          xAmount,
                          // счет плательщика
                          xPAY_ACCOUNT{,
                          xGUID}],
                        FALSE);
      xFound := xXML.documentElement.childNodes.Length;
      if (xFound > 0) then begin
        if (xFound > 1) then begin
          WriteLog( FORMAT( 'ЭД %s не обрабатывается - найдено несколько ЭД в БД (%s).',
                             [ xDocInfo,
                               INTTOSTR( xFound)]));
          EXIT;
        end;
        // проверяем и обновляем гуид
        WriteLog( FORMAT( 'ЭД %s не создается - найден в БД.',
                          [ xDocInfo]));
        xXML := xXml.documentElement.childNodes.Item[0];
        if (LENGTH( TRIM( xXML.GetAttribute( 'FOREIGN_KEY'))) <= 0)
          then UpdateDocumentForegnKey( '195', xXML.GetAttribute( 'ID'), xGUID);
        // найденный эд возвращаем как результат поиска, а результат
        // создания эд = NIL.
        aFoundDoc195 := xXml;
        EXIT;
      end;

      WriteLog( FORMAT( 'ЭД %s - создание из ЭД "Приложение к выписке дебетовое".',
                        [ xDocInfo]),
                TRUE);

      //------------------------------------------------------------------
      // создаем ЭД 195го класса
      xXmlDoc195 := CreateOleObject('Microsoft.XmlDom');
      xDoc195 := xXmlDoc195.appendChild(
                                     xXmlDoc195.createElement('DOCUMENT'));
      xDoc195.SetAttribute( 'action', 'insert');
      xDoc195.setAttribute( 'class', '195');
      xDoc195.setAttribute( 'BUDGET_ID', xBudgetID);
      // это поле необходимо для линковки - заполняется при создании ЭД 5го класса
      SetParamDoc195FromDoc5_( 'GUID', 'GUID');
      // признак загрузки из файла IK
      xDoc195.SetAttribute( 'F_ORIGINAL_TYPE', 'IK');
      // бюджет
      xDoc195.SetAttribute( 'F_BUDGET_ID', xBudgetID);
      // из BDPD.GUID_FK
      xDoc195.SetAttribute( 'FOREIGN_KEY', xGUID);
      //SetParamDoc195FromDoc5_( 'GUID', 'GUID');
      // Дата документа
      xDoc195.SetAttribute( 'DOC_DATE', xDocDate);
      // Номер документа
      xDoc195.SetAttribute( 'DOC_NUMBER', xDocNum);
      // Тип операции
      // По-умолчанию заполняется значением, выбранным для 195 класса
      // в справочнике «Типы операций по-умолчанию», а в случае отсутствия
      // настройки, значением «Не указано»
      xDoc195.SetAttribute( 'OPERTYPE_ID',
                            OperTypeDefaultForClassEx( '195'));
      // Сумма	Сумма выписки
      // Сумма по всем строкам документа - ?
      xDoc195.SetAttribute( 'AMOUNT', xAmount);
      // вид платежа
      SetParamDoc195FromDoc5_( 'PAYKIND', 'PAYKIND');

      // вид операции
      SetParamDoc195FromDoc5_( 'BANKOPER_ID', 'BANKOPER_ID');
      // если поле вида операции не заполнено, заполняем значением =1
      // (платежное поручение)
      if (LENGTH( VarToStr( xDoc195.GetAttribute( 'BANKOPER_ID'))) <= 0)
        then xDoc195.SetAttribute( 'BANKOPER_ID', '1');

      // очередность
      SetParamDoc195FromDoc5_( 'QUEUE_KIND', 'QUEUE_KIND');
      // Дата исполнения	- Дата по банку
      SetParamDoc195FromDoc5_( 'CARRY_DATE', 'CARRY_DATE');
      // Дата регистрации - не заполянется
      //SetParamDoc195FromDoc5_( 'REG_DATE', '');
      // Дата подтверждения остатка - не заполянется
      //SetParamDoc195FromDoc5_( 'CONFIRM_DATE', '');
      // Дата списания со счета - Дата по банку
      SetParamDoc195FromDoc5_( 'DEBIT_DATE', 'CARRY_DATE');
      // Код ФАИП
      SetParamDoc195FromDoc5_( 'PL_FAIP_OBJ_ID', 'PL_FAIP_OBJ_ID');
      SetParamDoc195FromDoc5_( 'PL_FAIP_OBJ_CODE', 'PL_FAIP_OBJ_CODE');
      // От ФК. Признак всегда включен.
      xDoc195.SetAttribute( 'FK_FLAG', '1');
      // Предельная дата исполнения	- Дата по банку
      SetParamDoc195FromDoc5_( 'LIMITING_DATE', 'CARRY_DATE');
      // Обязательство - Не заполняется
      //SetParamDoc195FromDoc5_( 'ACCEPTED_OBL_ID', '');
      // Возврат б/права расходования -	Не заполняется
      //SetParamDoc195FromDoc5_( 'WO_SPENDING', '0');
      // Авансовый платеж			Не заполняется
      //SetParamDoc195FromDoc5_( 'ADVANCE_PAYMENT', '0');
      // Вид операции по ЛС			Не заполняется
      //SetParamDoc195FromDoc5_( 'OPERKIND_ID', '');
      // НДС		Нет	значение по умолчанию «0.00»
      xDoc195.SetAttribute( 'VAT', '0.00');
      // Внешний статус	- «Не выгружен» (не выгружается)
      //xDoc195.SetAttribute( 'EXTSTATUS_ID', '0');
      // Вид документа в ФК	- Заполняется значением «Платежное поручение»
      xDoc195.SetAttribute( 'PAYDOC_CODE', 'PP');
      // Результат проверки			Не заполняется
      xDoc195.SetAttribute( 'CHECK_RESULT', '');
      // Комментарий			Не заполняется
      xDoc195.SetAttribute( 'REMARK', '');
      // Назначение платежа -	из Основания в ЭД 5го класса
      SetParamDoc195FromDoc5_( 'DESCRIPTION', 'DESCRIPTION');

      // Учредитель - Автозаполнение из справочника «Организации»
      // по механизму поиска в ЭД - по полю «Код вышестоящего ГРБС»
      // организации – плательщика.
      if (LENGTH( xPAY_ID) > 0) then begin
        xDoc195.SetAttribute(
                    'ORG_ID',
                    QueryField( 'Select o.MANAGER_ID from org o where o.id=?',
                                [ xPAY_ID],
                                'MANAGER_ID'));
        // название учредителя - оф.название орг.
        xDoc195.SetAttribute(
                    'ORG_NAME',
                    QueryField( 'Select o.DESCRIPTION from org o where o.id=?',
                                [ xDoc195.GetAttribute( 'ORG_ID')],
                                'DESCRIPTION'));
      end;

      // Блок «Плательщик»
      // Одноименные реквизиты блока «Плательщик» ЭД класса 5
      SetParamDoc195FromDoc5_( 'PAY_ID', 'PAY_ID');
      // ИНН
      SetParamDoc195FromDoc5_( 'PAY_TAXCODE', 'PAY_TAXCODE');
      // КПП
      SetParamDoc195FromDoc5_( 'PAY_KPP', 'PAY_KPP');
      // Организация
      SetParamDoc195FromDoc5_( 'PAY_NAME', 'PAY_NAME');
      // Счет
      SetParamDoc195FromDoc5_( 'PAY_ACC_ID', 'PAY_ACC_ID');
      SetParamDoc195FromDoc5_( 'PAY_ACCOUNT', 'PAY_ACCOUNT');
      // БИК
      SetParamDoc195FromDoc5_( 'PAY_BIC', 'PAY_BIC');
      // Банк
      SetParamDoc195FromDoc5_( 'PAY_B_NAME', 'PAY_B_NAME');
      // Корсчет
      SetParamDoc195FromDoc5_( 'PAY_CORACCOUNT', 'PAY_CORACCOUNT');
      // УФК
      SetParamDoc195FromDoc5_( 'PAY_UFK_NAME', 'PAY_UFK_NAME');
      // Счет УФК
      SetParamDoc195FromDoc5_( 'PAY_UFK_ACC_ID', 'PAY_UFK_ACC_ID');
      SetParamDoc195FromDoc5_( 'PAY_UFK_ACCOUNT', 'PAY_UFK_ACCOUNT');
      SetParamDoc195FromDoc5_( 'PAY_FILIAL_NAME', 'PAY_FILIAL_NAME');
      SetParamDoc195FromDoc5_( 'PAY_FILIAL_CODE', 'PAY_FILIAL_CODE');

      // скрытые поля из ЭД 5го класса
      // Код клиента (CLIENT_CODE)	PAY_CODE		Скрытые поля
      SetParamDoc195FromDoc5_( 'CLIENT_CODE', 'PAY_CODE');
      // Код ФК (FK_CODE)	PAY_OFK_CODE
      SetParamDoc195FromDoc5_( 'FK_CODE', 'FK_CODE');

      // блок «Получатель»
      // Значением одноименных полей блока «Получатель» ЭД класса 5.
      SetParamDoc195FromDoc5_( 'REC_ID', 'REC_ID');
      // ИНН
      SetParamDoc195FromDoc5_( 'REC_TAXCODE', 'REC_TAXCODE');
      // КПП
      SetParamDoc195FromDoc5_( 'REC_KPP', 'REC_KPP');
      // Организация
      SetParamDoc195FromDoc5_( 'REC_NAME', 'REC_NAME');
      // Счет
      SetParamDoc195FromDoc5_( 'REC_ACC_ID', 'REC_ACC_ID');
      SetParamDoc195FromDoc5_( 'REC_ACCOUNT', 'REC_ACCOUNT');
      // БИК
      SetParamDoc195FromDoc5_( 'REC_BIC', 'REC_BIC');
      // Банк
      SetParamDoc195FromDoc5_( 'REC_B_NAME', 'REC_B_NAME');
      SetParamDoc195FromDoc5_( 'REC_CORACCOUNT', 'REC_CORACCOUNT');

      // exchange #2891
      // если поле REC_CORACCOUNT пустое, то при вставке 5го с пустым полем
      // в АЦК-Ф поле заполнится по карточке банка по REC_BIC,
      // а в 195м такого алгоритма нет. поэтому тут реализуем такой же
      // механизм: ищем описание банка по БИК и заполняем кор счет оттуда

      if (LENGTH( xDoc195.GetAttribute( 'REC_CORACCOUNT')) <= 0)
        then xDoc195.SetAttribute(
                      'REC_CORACCOUNT',
                      QueryField( 'select CORACCOUNT C from bank where bic=?',
                                  [ xDoc195.GetAttribute( 'REC_BIC')],
                                  'C'));

      // УФК
      SetParamDoc195FromDoc5_( 'REC_UFK_NAME', 'REC_UFK_NAME');
      // Счет УФК
      SetParamDoc195FromDoc5_( 'REC_UFK_ACC_ID', 'REC_UFK_ACC_ID');
      SetParamDoc195FromDoc5_( 'REC_UFK_ACCOUNT', 'REC_UFK_ACCOUNT');
      // Доп. офис
      SetParamDoc195FromDoc5_( 'REC_FILIAL_NAME', 'REC_FILIAL_NAME');
      SetParamDoc195FromDoc5_( 'REC_FILIAL_CODE', 'REC_FILIAL_CODE');

      // закладка ГТС ГМП - УИН
      SetParamDoc195FromDoc5_( 'CHARGE_NUMBER', 'UIN');

      // Реквизиты возвращаемого документа - Не заполняется

      // Закладка «Ответственные лица»
      if (LENGTH( xPAY_ID) > 0) then begin
        // Ответственные лица определяются по организации плательщику
        // руководитель: код=-2
        UpdateRespersonM1ByOrgID_IntoXML(
              xDoc195,
              'CHIEF_',
              xPay_ID,
              ' and Rp.appointment_id = -2 and Rp.Actual_flag=1',
              xBudgetID,
              '195',
              '-2');
        // гл.бух: код=-3
        UpdateRespersonM1ByOrgID_IntoXML(
              xDoc195,
              'BUH_',
              xPay_ID,
              ' and Rp.appointment_id = -3 and Rp.Actual_flag=1',
              xBudgetID,
              '195',
              '-3');
      end;
      // Дата подписания - Заполняется датой документа.
      SetParamDoc195FromDoc5_( 'SIGN_DATE', 'DOC_DATE');

      // Поле «Идентификатор платежа» формируется из ЭД класса 5
      CopyDepartmentalInfo( xDoc195, aDoc5);

      // заполнение строк
      // этот список нужен при поиске отр.кодов для строк
      xIndustryCodes:= TStringList.Create;
      try
        // заполнение строк
        xDoc195Lines := xDoc195.appendChild(
                                         xXmlDoc195.createElement('LINES'));
        xLinesCount := 0;
        for i := 0 to aDoc5.childNodes.Length - 1 do
          // в эд 5м строки описываются в узлах PAYORDERLINE.PAYORDERLINE
          // поэтому для совместимости оставлено и LINES.
          if (aDoc5.childNodes.Item[i].NodeName
                                      in ['LINES', 'PAYORDERLINE']) then begin
            xDoc5Lines := aDoc5.childNodes.Item[i];
            for i2 := 0 to xDoc5Lines.childNodes.Length - 1 do begin
              // строка в 5м
              xDoc5Line := xDoc5Lines.childNodes.Item[i2];
              // новая строка в LINES в 195м
              xDoc195Line := xDoc195Lines.appendChild(
                                             xXmlDoc195.createElement('LINE'));
              // заполняем строку

              SetLineDoc195FromDoc5_( xDoc195Line, xDoc5Line);
              INC( xLinesCount);
            end;//for//
          end;
        // если строк нет - копируем описание строки в шапке
        if (xLinesCount <= 0) then begin

          SetLineDoc195FromDoc5_( xDoc195, aDoc5);
        end;
        finally
          xIndustryCodes.Free;
      end;

      // Закладка «Документ-основание» - Не заполнять

      // создаем ЭД и переносим его на нужный статус
      //------------------------------------------------------------------
      // передаем документ на сервер, только если параметр проверки =false.

//      Exec_ChildDoc( xBudgetID, '', xDoc195, TRUE);
//      WriteLog( FORMAT( 'ЭД %s - созданан.', [ xDocInfo]), TRUE);
      Result := xDoc195;
      except
        ExceptionLog( 'Сбой CreateDoc195_ByDoc5_2831');
    end;

end;


{~Check_Doc5ByIK_BDPB_Mark2998
  возвращает =true, если нужно найти эд 195й, который линкуется с 5м,
  при загрузке IK.BDPD}
function Check_Doc5ByIK_BDPB_Mark2998( aED5: Variant): boolean;
begin

    try
      Result := ( GetNodeAttributeEx( aED5, '_2998_Create_195_') = '1');
      except
        ExceptionProc( 'Check_Doc5ByIK_BDPB_Mark2998');
    end;

end;


{~Found195_by_BDPD_2998
  exchange #2998
  поиск эд 195го по номеру+дата+счет плательщика+сумма на 86м статусе
  для линковки с эд 5м по блоку IK.BDPD если параметр конфига
  "создавать эд ау/бу" = нет.
  в этом случае эд предполагается созданы вручную с пустым полем гуид.

  если тип документа PP, то гуида в 195 классе быть не может -
  так как в ZR данного документа не будет.
  поэтому здесь проверяется признак "Тип документа в ФК"=PP

  результат:
    =узел описания эд для линковки: ID, DocumentClass_Id
          - эд найден и если гуид пустой - он будет обновлен по BDPD.GUID_FK.
            при этом при поиске эд для линковки эд будет найден по гуид.
    =NULL - эд не найден. дальнейшая линковка с эд 5м невозможна.}
function Found195_by_BDPD_2998( aDoc: Variant): variant;
var
  xXML: Variant;
  xXMLFound: integer;
  xDocNum: string;
  xDocDate: string;
  xAmount: string;
  xGUID: string;
  xPAY_ACCOUNT: string;
  xDocInfo: string;
begin

    try
      // описание ЭД
      xDocNum       := GetNodeAttributeEx( aDoc, 'DOC_NUMBER');
      xDocDate      := GetNodeAttributeEx( aDoc, 'DOC_DATE');
      xAmount       := GetNodeAttributeEx( aDoc, 'AMOUNT');
      // BDPD.GUID_FK
      xGUID         := GetNodeAttributeEx( aDoc, 'FOREIGN_KEY');
      // счет плательщика из IK.LS_UBP
      xPAY_ACCOUNT  := GetNodeAttributeEx( aDoc, '_2998_Create_195_LS_');
      //------------------------------------------------------------------
      // описание искомого ЭД 195го класса
      // это описание отображается в логах как описание ЭД.
      xDocInfo := FORMAT( '"Заявка БУ/АУ на выплату средств" № %s дата %s '
                             +'сумма в валюте выплаты %s, номер л/с %s',
                              [ xDocNum,
                                xDocDate,
                                xAmount,
                                xPAY_ACCOUNT]);

      WriteLog( FORMAT( 'Поиск ЭД %s для линковки...',
                        [ xDocInfo]));

      //------------------------------------------------------------------
      xXML := QueryXml(  ' Select A.ID, A.FOREIGN_KEY, A.DocumentClass_Id'
                        +' From Document D'
                        +' Left Join aubucashrequest A on A.Document_Id = D.Id'
                        +' Where D.Budget_Id = ? and D.DocumentClass_Id = 195'
                        // возвращает только шапку эд
                        +' and (a.title_id=a.id or a.title_id is null)'
                        +' and LTrim(A.Doc_Number) = ? and A.Doc_Date = ?'
                        +' and A.PAYDOC_CODE = ?'
                        +' and a.amount = ?'
                        +' and A.Pay_Account = ?'
                        +' and A.dispstatus_id = 86',
//                        +' and (A.FOREIGN_KEY='#39#39' or A.FOREIGN_KEY is null)',
                        [ GetNodeAttributeEx( aDoc, 'F_BUDGET_ID'),
                          TRIM( xDocNum),
                          XmlToDateTime( xDocDate),
                          'PP',              // Тип документа в ФК
                          xAmount,
                          xPAY_ACCOUNT],
                        FALSE);
      xXMLFound := xXML.documentElement.childNodes.Length;
      //------------------------------------------------------------------
      case xXMLFound of
        0: begin
              WriteLog( FORMAT( 'ЭД %s не найден и не создается по настройке.',
                                [ xDocInfo]));
              Result := NULL;
            end;

        1: begin
              // Если ЭД однозначно найден, записываем в поле Foreign_key,
              // если еще не заполнено, значением IK.BDPD.GUID_FK.
              WriteLog( FORMAT( 'ЭД %s найден в БД.',
                                [ xDocInfo]));

              Result := xXml.documentElement.childNodes.Item[0];
              if (LENGTH( TRIM( Result.GetAttribute( 'FOREIGN_KEY'))) <= 0)
                then UpdateDocumentForegnKey(
                                        '195',
                                        Result.GetAttribute( 'ID'),
                                        GetNodeAttributeEx( aDoc, 'FOREIGN_KEY'))
                else WriteInfo( 'Поле FOREIGN_KEY в ЭД уже заполнено.');
            end;

       else begin
              WriteLog( FORMAT( 'Найдено несколько подобных ЭД %s - не обрабатывается.',
                                 [ xDocInfo]));
              Result := NULL;
            end;
      end;//case//
      except
        ExceptionProc( 'Found195_by_BDPD_2998');
    end;

end;






begin
end.
