    {~QueryInc_
      поиск строки дчб
      результат - количество записей в ДЧБ.}
    function QueryInc_( aBudgetID: string;
                        aDocLine: Variant;
                        aTO_KOD_UBP: string;
                        var aINC: Variant;
                        aOKATO: string): string;
    var
      xSQL: string;
      xSQL_Territory: string;
      xKADMD_CODE: string;
      xKD_CODE: string;
      xKESD_CODE: string;
      xPurpgrID: string;
      xINC: Variant;
      xTerritory_id: string;
      i: integer;

      procedure DoResult1_;
      begin
        // возвращаем единственный результат
        if (xINC.documentElement.childNodes.length <> 1)
          then Result := INTTOSTR( xINC.documentElement.childNodes.length)
          else begin
            Result := '1';
            aINC := xINC.documentElement.childNodes.item[ 0];
          end;
      end;

    begin

        try
          aINC := NULL;
          xKADMD_CODE := GetNodeAttributeEx( aDocLine, 'KADMD_CODE');
          xKD_CODE := GetNodeAttributeEx( aDocLine, 'KD_CODE');
          xKESD_CODE := GetNodeAttributeEx( aDocLine, 'KESD_CODE');
          xPurpgrID := GetNodeAttributeEx( aDocLine, 'PURPOSEFULGRANTD_ID');

          xSQL_Territory := '';
          xSQL := ' From IncBudget'
                         +' Where Budget_Id = ?'
                         +' and KADMD_CODE = ?'
                         +' and KD_CODE = ?'
                         // exchange #3062
//                         +' and KESD_CODE = ?'
                         +' and PURPOSEFULGRANTD_ID = ?';

          Result := QueryField( ' Select count( * ) N ' + xSQL,
                                [ aBudgetID,
                                  xKADMD_CODE,
                                  xKD_CODE,
  //                                xKESD_CODE,
                                  xPurpgrID],
                                'N');
          if (Result = '0') then EXIT;
          if (Result = '1')
            then xINC := QueryXml( ' Select * ' + xSQL,
                                    [ aBudgetID,
                                      xKADMD_CODE,
                                      xKD_CODE,
                                      xPurpgrID])
            else begin
              WriteInfo( FORMAT( 'Поиск в ДЧБ с учетом кода организации %s...',
                                  [ aTO_KOD_UBP]));
              xSQL := ' From IncBudget i'
                     +' join receiver r on r.id= I.RECEIVER_ID'
                     +' join org o on o.id=r.org_id'
                     +' Where i.Budget_Id = ?'
                     +' and i.KADMD_CODE = ?'
                     +' and i.KD_CODE = ?'
                     // exchange #3062
//                     +' and i.KESD_CODE = ?'
                     +' and i.PURPOSEFULGRANTD_ID = ?'
                     // проверить наличие aTO_KOD_UBP в дополнительно у орг o
                     +' and (exists( select d.* from orgbudgetdet d'
                     +' where d.budget_id=? and d.org_id=o.id'
                     +' and d.code_fk=?) or (o.name=?))';

              Result := QueryField( ' Select count( * ) N ' + xSQL,
                              [ aBudgetID,
                                xKADMD_CODE,
                                xKD_CODE,
//                                xKESD_CODE,
                                xPurpgrID,
                                aBudgetID,
                                aTO_KOD_UBP,
                                aTO_KOD_UBP],
                              'N');
              { здесь не рассматривается случай, когда есть строка
                с орг=не указана и орг=не_равная_TO.KOD_UBP.
                т.е. в этом случае не будет найдена орг с TO.KOD_UBP
                то не ищется в дчб строка с орг="не указана".}
              if (Result = '0') then EXIT;
              if (Result <> '1') then begin
                WriteInfo( FORMAT( 'Поиск в ДЧБ с учетом кода организации %s и территории по ОКТМО/ОКАТО %s...',
                                    [ aTO_KOD_UBP,
                                      aOKATO]));
                { exchange #3001
                  этот вариант если в дчб есть несколько строк в орг=TO.KOD_UBP.
                  При поиске строки в ДЧБ увеличить фильтр - добавляем ID
                  на территорию, определяемую из справочника территорий
                  по полям ОКТМО,
                  если значение UFPP.OKATO имеет длину 11 знаков,
                  либо ОКАТО, если значение  UFPP.OKATO имеет длину 8 знаков.
                  Если  UFPP.OKATO пусто, то ищем строку
                  с территорией = "Не указана".
                  по согласованию с АО ищем на совпадение с любым полем,
                  поэтому одним запросом ищем либо совпадение ОКТМО либо ОКАТО.}
                xSQL_Territory :=  ' from territory t where t.okato= ? or t.oktmo=?';
                if (QueryField( 'select count( * ) N' + xSQL_Territory,
                                [ aOKATO, aOKATO],
                                'N') = '1')
                  then xTerritory_id := QueryField( 'select t.id N' + xSQL_Territory,
                                                    [ aOKATO, aOKATO],
                                                    'N')
                  else begin
                    xTerritory_id := '0';
                    WriteInfo( FORMAT( 'Территория по ОКТМО/ОКАТО %s не определена - в ДЧБ ищется территория = "Не указана"...',
                                        [ aOKATO]));
                  end;

                // пробуем найти строку в дчб с учетом территории
                xSQL := xSQL + ' and i.TERRITORY_ID=?';
                Result := QueryField( ' Select count( * ) N ' + xSQL,
                                      [ aBudgetID,
                                        xKADMD_CODE,
                                        xKD_CODE,
//                                        xKESD_CODE,
                                        xPurpgrID,
                                        aBudgetID,
                                        aTO_KOD_UBP,
                                        aTO_KOD_UBP,
                                        xTerritory_id],
                                      'N');
                if (Result = '0') then EXIT;
                // если нашли несколько - ищем среди них строку с полем
                // тип доходы = доходы либо =не указано.
                if (Result <> '1') then begin
                  xINC := QueryXml( ' Select I.* ' + xSQL,
                                    [ aBudgetID,
                                      xKADMD_CODE,
                                      xKD_CODE,
//                                      xKESD_CODE,
                                      xPurpgrID,
                                      aBudgetID,
                                      aTO_KOD_UBP,
                                      aTO_KOD_UBP,
                                      xTerritory_id]);
                  // ищем в результате запроса с типом = доходы
                  for i := 0 to xINC.documentElement.childNodes.length - 1 do
                    if GetNodeAttributeEx( xINC.documentElement.childNodes.item[ i],
                                           'KDT_CODE') = '1' then begin
                      Result := '1';
                      aINC := xINC.documentElement.childNodes.item[ i];
                      WriteLog( FORMAT( 'В ДЧБ найдена строка с учетом кода организации %s и территории по ОКТМО/ОКАТО %s с типом дохода = "доходы".',
                                        [ aTO_KOD_UBP,
                                          aOKATO]));
                      EXIT;
                    end;
                  // ищем в результате запроса с типом = не указано
                  for i := 0 to xINC.documentElement.childNodes.length - 1 do
                    if GetNodeAttributeEx( xINC.documentElement.childNodes.item[ i],
                                           'KDT_CODE') = '0' then begin
                      Result := '1';
                      aINC := xINC.documentElement.childNodes.item[ i];
                      WriteLog( FORMAT( 'В ДЧБ найдена строка с учетом кода организации %s и территории по ОКТМО/ОКАТО %s с типом дохода = "не указана".',
                                        [ aTO_KOD_UBP,
                                          aOKATO]));
                      EXIT;
                    end;
                  // не нашли ни того ни другого - значит не нашли в дчб
                  WriteInfo( FORMAT( 'В ДЧБ не найдена строка с учетом кода организации %s и территории по ОКТМО/ОКАТО %s с типом дохода = "доходы" или "не указана".',
                                    [ aTO_KOD_UBP,
                                      aOKATO]));
                  Result := '0';
                  EXIT;
                end;
                // нашли единстченную строку в дчб с учетом территории
                xINC := QueryXml( ' Select I.* ' + xSQL,
                                  [ aBudgetID,
                                    xKADMD_CODE,
                                    xKD_CODE,
//                                    xKESD_CODE,
                                    xPurpgrID,
                                    aBudgetID,
                                    aTO_KOD_UBP,
                                    aTO_KOD_UBP,
                                    xTerritory_id]);
                DoResult1_;
                EXIT;
              end;

              // нашли единстченную строку в дчб с учетом организации.
              // здесь в select важно указать I.* поскольку в составном
              // запросе, таблица org тоже содержит територию и в результате
              // будут перепутаны поля, откуда берется територия.
              // какое поле первое придет, оттуда и возъмется.
              xINC := QueryXml( ' Select I.* ' + xSQL,
                                [ aBudgetID,
                                  xKADMD_CODE,
                                  xKD_CODE,
  //                                xKESD_CODE,
                                  xPurpgrID,
                                  aBudgetID,
                                  aTO_KOD_UBP,
                                  aTO_KOD_UBP]);
                                          {
                else begin
                  xSQL := ' From IncBudget i'
                         +' join org o on o.id=i.RECEIVER_ID'
                         +' Where i.Budget_Id = ?'
                         +' and i.KADMD_CODE = ?'
                         +' and i.KD_CODE = ?'
                         +' and i.KESD_CODE = ?'
                         +' and i.PURPOSEFULGRANTD_ID = ?'
                         // проверить наличие aTO_KOD_UBP в коде орг
                         +' and o.NAME=?';

                  Result := QueryField( ' Select count( * ) N ' + xSQL,
                                  [ aBudgetID,
                                    xKADMD_CODE,
                                    xKD_CODE,
                                    xKESD_CODE,
                                    xPurpgrID,
                                    aTO_KOD_UBP],
                                  'N');
                  if (Result <> '1') then EXIT;
                  xINC := QueryXml( ' Select * ' + xSQL,
                                    [ aBudgetID,
                                      xKADMD_CODE,
                                      xKD_CODE,
                                      xKESD_CODE,
                                      xPurpgrID,
                                      aTO_KOD_UBP]);
                end;}
            end;

          DoResult1_;
          except
            ExceptionLog( 'Сбой QueryInc_');
        end;

    end;

    {~QuerySrc_
      поиск строки ичб}
    function QuerySrc_( aBudgetID: string;
                         aDocLine: Variant;
                         var aSRC: Variant): boolean;
    var
      xKADMI_CODE: string;
      xKI_CODE: string;
      xKESI_CODE: string;
      xPurpgrID: string;
      xSrc: Variant;
    begin

        try
          Result := FALSE;
          aSrc := NULL;

          xKADMI_CODE := GetNodeAttributeEx( aDocLine, 'KADMI_CODE');
          xKI_CODE := GetNodeAttributeEx( aDocLine, 'KI_CODE');
          xKESI_CODE := GetNodeAttributeEx( aDocLine, 'KESI_CODE');
          xPurpgrID := GetNodeAttributeEx( aDocLine, 'PURPOSEFULGRANTI_ID');

          if (QueryField( ' Select count( * ) N From SrcBudget'
                         +' Where Budget_Id = ?'
                         +' and KADMI_CODE = ?'
                         +' and KI_CODE = ?'
                         // exchange #3062
//                         +' and KESI_CODE = ?'
                         +' and PURPOSEFULGRANTI_ID = ?',
                          [ aBudgetID,
                            xKADMI_CODE,
                            xKI_CODE,
  //                          xKESI_CODE,
                            xPurpgrID],
                          'N') <> '1')
            then EXIT;

          xSrc := QueryXml( ' Select * From SrcBudget'
                           +' Where Budget_Id = ?'
                           +' and KADMI_CODE = ?'
                           +' and KI_CODE = ?'
                           // exchange #3062
//                           +' and KESI_CODE = ?'
                           +' and PURPOSEFULGRANTI_ID = ?',
                            [ aBudgetID,
                              xKADMI_CODE,
                              xKI_CODE,
  //                            xKESI_CODE,
                              xPurpgrID]);

          if (xSrc.documentElement.childNodes.length = 1) then begin
            aSrc := xSrc.documentElement.childNodes.item[ 0];
            Result := TRUE;
          end;

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

    end;

    (*
    {~QueryExp_
      поиск строки дчб
      результат - количество записей в ДЧБ.}
    function QueryExp_( aBudgetID: string;
                        aDocLine: Variant;
                        var aToXml: Variant): string;
    var
      xSQL: string;
      xPurpgrID: string;
      xXml: Variant;
      xKFSR_CODE: string;
      xKVR_CODE: string;
      xKESR_CODE: string;
      xKCSR_CODE: string;
      xKADMR_CODE: string;
    begin

        try
          aToXml := NULL;
          xKFSR_CODE := GetNodeAttributeEx( aDocLine, 'KFSR_CODE', );
          xKCSR_CODE := GetNodeAttributeEx( aDocLine, 'KCSR_CODE', );
          xKVR_CODE := GetNodeAttributeEx( aDocLine, 'KVR_CODE', );
          xKESR_CODE := GetNodeAttributeEx( aDocLine, 'KESR_CODE', );
          xKADMR_CODE := GetNodeAttributeEx( aDocLine, 'KADMR_CODE', );
          xPurpgrID := GetNodeAttributeEx( aDocLine, 'PURPOSEFULGRANT_ID');

          xSQL := ' From Expbudget E'
                       +' Where E.Budget_Id = ?'
                       +'  and E.Kfsr_Code = ?'
                       +'  and E.Kvr_Code = ?'
                       +'  and E.Kesr_Code = ?'
                       +'  and E.Kcsr_Code = ?'
                       +'  and E.Kadmr_Code = ?'
                       +'  and E.PURPOSEFULGRANT_ID=?';

          Result := QueryField( ' Select count( * ) N ' + xSQL,
                                [ aBudgetID,
                                  xKFSR_CODE,
                          xKVR_CODE,
                          xKESR_CODE,
                          xKCSR_CODE,
                          xKADMR_CODE,
                                  xPurpgrID],
                                'N');
          if (Result <> '1') then EXIT;

          xXml := QueryXml( ' Select * ' + xSQL,
                                    [ aBudgetID,
                                      xKFSR_CODE,
                          xKVR_CODE,
                          xKESR_CODE,
                          xKCSR_CODE,
                          xKADMR_CODE,
                                      xPurpgrID]);

          Result := INTTOSTR( xXml.documentElement.childNodes.length);
          if (Result = '1') then begin
            aToXml := xXml.documentElement.childNodes.item[ 0];
            Result := TRUE;
          end;

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

    end;
    *)

    {~QueryOrg20_By_Receiver_
      определение получателя для доходов }
    function QueryOrg20_By_Receiver_( aReceiverID, aSelect: string): string;
    begin

        try
          Result := QueryField( ' select ' + aSelect + ' Z from RECEIVER r'
                               +' where r.ISACTUAL = 1 and r.id=?',
                                [ aReceiverID],
                                'Z');
{
          Result := QueryField( ' select ' + aSelect + ' from RECEIVER r'
                               +' where r.ISACTUAL = 1 and r.org_id=?',
                                [ xOrgID],
                                aField);
                                }
          except
            ExceptionLog( 'Сбой QueryOrg20_By_Receiver_');
        end;

    end;


{~QueryLS_20_
  поиск счета:
  результат - заполнение описания номера счета и его описания
  счет ищется для орг aOrgID 5го типа если роль = 4
  или 8го типа,если роль = 9.
  счет считается найденным если находится один такой счет.}
function QueryLS_20_( aOrgID: string;
                       var aAccNum: string;
                       var aAccXml: Variant): boolean;
var
  xSQL: string;
begin

    try
      aAccNum := '';
      aAccXml := NULL;
      xSQL :=  ' from ORGACCOUNT a '
{
                   // здесь проверяется галка "актуальная" у организации
                  +' Join Contractor C on C.Org_Id = ooo.Id'
                  +' Join Budget Obd on Obd.Org_Id = C.Inspector_Id'
                  +' where Obd.ID=?'
}
                  // у счета не должно быть даты закрытия
                  +' where a.org_id=? and a.Close_Date is null'

                  // наличие счет у орг 5го (или другово типа) типа
                  +' and (( a.orgacctype_id=5'
                  // с признаком "бюджетный" и "распорядительный"
                  +' and a.budget_flag=1 and a.distributive_flag=1'
                  // наличие оргроли орг 4
                  +' and exists ( select * from orgroles r where'
                  +'   r.orgrole_id=4 and r.org_id=a.org_id))'

                  // наличие счет у орг 8го (или другово типа) типа
                  +' or ( a.orgacctype_id=8'
                  // наличие оргроли орг 9
                  +' and exists ( select * from orgroles r where'
                  +'   r.orgrole_id=9 and r.org_id=a.org_id)))';

      Result := (QueryField( ' Select count( * ) N ' + xSQL,
                             [ aOrgID],
                             'N') = '1');
      if Result then begin
        aAccXml := QueryXml( ' Select * ' + xSQL, [ aOrgID]);
        Result := (aAccXml.documentElement.childNodes.length = 1);
        if Result then begin
          aAccXml := aAccXml.documentElement.childNodes.item[ 0];
          aAccNum := GetNodeAttributeEx( aAccXml, 'ACCOUNT_NUMBER');
        end;
      end;

      except
        ExceptionProc( 'QueryLS_20_');
    end;

end;


    {~QueryOrg31_
      поиск организации для источников:
      Если значение реквизита  UFPP_N.LS_UBP (BH.LS) есть среди счетов
      организации.}
    function QueryOrg31_( aBudgetID, aAccNum, aSelect: string): string;
    begin

        try
          Result := QueryField(  'select ' + aSelect + ' Z from org o'
                                // актуальность орг.
                                +' Join Contractor C on C.Org_Id = O.Id'
                                +' Left Join Budget B on B.Org_Id = C.Inspector_Id'
                                +' where b.id=?'
//                                +' and (o.CLOSE_DATE is null or o.close_date>?)'
                                +' and o.CLOSE_DATE is null'
                                +' and exists (select * from orgaccount oa'
                                +'   where oa.org_id=o.id'
                                +'   and oa.account_number=?'
                                +'   and oa.close_date is null)',
//                                +'   and (oa.close_date is null or oa.close_date>?))',
                                 [ aBudgetID,
//                                   Work_Date,
                                   aAccNum{,
                                   Work_Date}],
                                 'Z');
          except
            ExceptionLog( 'Сбой QueryOrg31_');
        end;

    end;



{~FillLine10_ED_2953
  exchange #2957

  1.	Среди строк найденных бланков ищем строку по КБК+Код цели (с учетом,
      что если в файле пришло пустое поле для КЦ, для поиска в базе считаем КЦ=0).

  a)  Если строка нашлась единственная, то подставляем в ЭД ее реквизиты:
    Бюджетополучатель, КБК, Код цели, КВФО, доп.коды.
      Если таких строк не нашлось вообще, заполняем в ЭД КБК,
    Код цели из файла, КВФО =1, доп.коды = нули,
    Бюджетополучатель определяется в зависимости от наличия признака
    «Межбюджетные трансферты» в найденном бланке:
      если признак не установлен, то ставим Бюджетополучатель=Организация-оператор
        бланка расходов,
      если признак установлен, то Бюджетополучатель = Контрагент (Контрагента
        определяем так:
          ищем в справочнике организаций организацию по
    ИНН= IK.ZR.INN_RSP, актуальную, а если не нашли, то по ИНН+КПП
    (у четом «Дополнительных КПП»), равным соответственно IK.ZR.INN_RSP,
    IK.ZR.KPP_RCP, актуальную.
          Если найдена однозначно, устанавливаем в Бюджетополучателя.
          Если не найдена или найдена не однозначно, то в Бюджетополучателя
    устанавливаем «Не указана».
      При поиске Контрагента осуществляем
    дополнительную проверку, если организация Контрагента найдена однозначно
    и имеет роль «Бюджетное учреждение» или «Автономное учреждение», проверяем,
    чтобы в списке ее счетов организаций был счет 5 типа с номером,
    равным ZR.LS_UBP_RCP. Если такой счет присутствует, то организацию
    в поле Бюджетополучатель проставляем, если нет, то в Бюджетополучателя
    ставим «Не указана»).

b)	Если найденных строк несколько, продолжаем поиск строки РЧБ.
1.1.	Если среди строк найденных бланков по КБК+Код цели
(с учетом, что если в файле пришло пустое поле для КЦ, для поиска в базе
считаем КЦ=0) нашлось несколько строк, ищем среди них строку с учетом
Бюджетополучателя=Контрагенту:
  Контрагента определяем так: ищем в справочнике организаций организацию
  по ИНН= IK.ZR.INN_RSP, актуальную, а если не нашли, то по ИНН+КПП
  (с учетом «Дополнительных КПП»), равным соответственно IK.ZR.INN_RSP,
  IK.ZR.KPP_RCP, актуальную. Если найдена однозначно, ищем строку по
  Бланк+КБК+КЦ+Бюджетополучатель.

a)	Если строка нашлась единственная, то подставляем в ЭД ее реквизиты:
  Бюджетополучатель, КБК, Код цели, КВФО, доп.коды.
b)	Если не найдена или найдена не однозначно, то в Бюджетополучателя
  устанавливаем «Не указана», заполняем в ЭД КБК, Код цели из файла, КВФО =1,
  доп.коды = нули.
При поиске с учетом Контрагента также осуществляем дополнительную проверку:
  если организация Контрагент найдена однозначно и имеет роль
  «Бюджетное учреждение» или «Автономное учреждение», проверяем,
  чтобы в списке ее счетов организаций был счет 5 типа с номером,
  равным ZR.LS_UBP_RCP. Если такой счет присутствует,
  то ищем строку в РЧБ с учетом Бюджетополучателя и далее действуем по
  пунктам a) и b), если нет, то не ищем с учетом Бюджетополучателя,
  ставим в ЭД в Бюджетополучателя = «Не указана», заполняем в ЭД КБК,
  Код цели из файла, КВФО =1, доп.коды = нули.

  aEDLine - строка в создаваемом эд (11,195)
  aXmlZRST - исходная строка файла ZRST}
function FillLine10_ED_2953( aBudgetId: string;
                                aESTIMATE_ID: string;
                                aINN: string;
                                aKPP: string;
                                aLS: string;
                               aEDLine, aXmlZRST: Variant;
                               aLSType: string = '5';
                               aRECIPIENT_ID_Ex: string = ''): boolean;
var
  xXml: Variant;
  xPURPOSEFULGRANT_ID: string;
  xKFSR_CODE: string;
  xKVR_CODE: string;
  xKESR_CODE: string;
  xKCSR_CODE: string;
  xKADMR_CODE: string;
  xFound: string;
  xRECIPIENT_ID: string;
  xOrgID: string;
//  xSQLParams: Variant;
//  xFound: string;
//  xZR_INN_RCP: string;
//  xZR_KPP_RCP: string;
//  xZR_LS_UBP_RCP: string;

  {~DoLineFillDefault_
    заполнение строки по умолчанию: КВФО =1, доп.коды = нули,
    бюджетополучатель="не указан"}
  procedure DoLineFillDefault_;
  begin

      try
        aEDLine.setAttribute( 'KDF_CODE', FormatKbk( 'KDF', '0', aBudgetId));
        aEDLine.setAttribute( 'KDE_CODE', FormatKbk( 'KDE', '0', aBudgetId));
        aEDLine.setAttribute( 'KDR_CODE', FormatKbk( 'KDR', '0', aBudgetId));
        aEDLine.SetAttribute( 'FSR_ID', '1');
        aEDLine.SetAttribute( 'RECIPIENT_ID', '0');
        except
          ExceptionProc( 'DoLineFillDefault_');
      end;

  end;

  {~DoLineFill_ExpBudget_
    заполняем доп коды и КВФО из строки РЧБ.
      если параметр aReceipientID не будет указан, то поиск в рчб осуществляем
    без него, а в строке заполняем бюджетополучателя из строки РЧБ.
      если параметр aReceipientID будет указан, то при поиске в РЧБ учитываем
    этот параметр как бюджетополучателя, а в строке бюджетополучателя не
    заполняем.}
  procedure DoLineFill_ExpBudget_( aReceipientID: string = '');
  var
    xExpBudget: Variant;
  begin

      try
        if (LENGTH( aReceipientID) <= 0)
          then xExpBudget := QueryXml(  ' Select E.KDF_CODE, E.KDE_CODE, E.KDR_CODE,'
                                       +'  E.FSR_ID, E.RECIPIENT_ID,E.KESR_CODE'
                                       +' From Expbudget E'
                                       +' Where E.Budget_Id = ?'
                                       +'  and E.Estimate_Id = ?'
                                       +'  and E.Kfsr_Code = ?'
                                       +'  and E.Kvr_Code = ?'
                                       // exchange #3062
//                                       +'  and E.Kesr_Code = ?'
                                       +'  and E.Kcsr_Code = ?'
                                       +'  and E.Kadmr_Code = ?'
                                       +'  and E.PURPOSEFULGRANT_ID=?',
                                        [ aBudgetId,
                                          aESTIMATE_ID,
                                          xKFSR_CODE,
                                          xKVR_CODE,
  //                                        xKESR_CODE,
                                          xKCSR_CODE,
                                          xKADMR_CODE,
                                          xPURPOSEFULGRANT_ID])
          else xExpBudget := QueryXml(  ' Select E.KDF_CODE, E.KDE_CODE, E.KDR_CODE,'
                                       +'  E.FSR_ID,E.RECIPIENT_ID,E.KESR_CODE'
                                       +' From Expbudget E'
                                       +' Where E.Budget_Id = ?'
                                       +'  and E.Estimate_Id = ?'
                                       +'  and E.Kfsr_Code = ?'
                                       +'  and E.Kvr_Code = ?'
                                       // exchange #3062
//                                       +'  and E.Kesr_Code = ?'
                                       +'  and E.Kcsr_Code = ?'
                                       +'  and E.Kadmr_Code = ?'
                                       +'  and E.PURPOSEFULGRANT_ID=?'
                                       +'  and E.RECIPIENT_ID=?',
                                        [ aBudgetId,
                                          aESTIMATE_ID,
                                          xKFSR_CODE,
                                          xKVR_CODE,
  //                                        xKESR_CODE,
                                          xKCSR_CODE,
                                          xKADMR_CODE,
                                          xPURPOSEFULGRANT_ID,
                                          aReceipientID]);
        // на всякий случай проверяем результат запроса
        if (xExpBudget.documentElement.childNodes.Length <> 1) then begin
          WriteInfo( 'Найдено несколько строк в РЧБ - строка заполняется по умолчанию.');
          DoLineFillDefault_;
          EXIT;
        end;
        xExpBudget := xExpBudget.documentElement.childNodes.item[0];

        aEDLine.SetAttribute( 'KDF_CODE',
                                GetNodeAttributeEx( xExpBudget, 'KDF_CODE'));
        aEDLine.SetAttribute( 'KDE_CODE',
                                GetNodeAttributeEx( xExpBudget, 'KDE_CODE'));
        aEDLine.SetAttribute( 'KDR_CODE',
                                GetNodeAttributeEx( xExpBudget, 'KDR_CODE'));
        aEDLine.SetAttribute( 'FSR_ID',
                                GetNodeAttributeEx( xExpBudget, 'FSR_ID'));

        // exchange #3111 - косгу тоже переносится из рчб
        aEDLine.SetAttribute( 'KESR_CODE',
                                GetNodeAttributeEx( xExpBudget, 'KESR_CODE'));

        // заполняем бюджетополучателя в строке ЭД 11го
       { if (LENGTH( aReceipientID) > 0)
          then} aEDLine.SetAttribute( 'RECIPIENT_ID',
                                       GetNodeAttributeEx( xExpBudget,
                                                           'RECIPIENT_ID'));
        except
          ExceptionProc( 'DoLineFill_ExpBudget_');
      end;

  end;


  {~QueryOrgReceipient_
    запрос поиска контрагента.
    описываем запрос без select.
      это дает зделать два запроса:
      первый - количество записей, второй - конкретную выборку.
    альтернатива - использовать константу.}
  function QueryOrgReceipient_: string;
{  var
    xQueryAllAccount: string;}
  begin

      try
        // если счет не указан, то вместо того чтобы его исключить из запроса
        // и чтобы не увеличивать код, добавляем в запрос подзапрос проверки
        // наличия любого незакрытого счета у организации.
{        if ( LENGTH( aLS) <= 0)
          then xQueryAllAccount := ' or OA.ACCOUNT_NUMBER is not null '
          else xQueryAllAccount := '';}
        Result :=  ' from ORG ooo '
                   // здесь проверяется галка "актуальная" у организации
                  +' Join Contractor C on C.Org_Id = ooo.Id'
                  +' Join Budget Obd on Obd.Org_Id = C.Inspector_Id'
                  +' where Obd.ID=?'
                  // у орг не должно быть даты закрытия
                  +' and ooo.Close_Date is null'
                  // инн+(кпп или среди дополнительных кпп)
                  +' and ooo.TAXCODE=?';
        if (LENGTH( aKPP) > 0)
          then Result := Result
                  +' and (ooo.KPP=? or exists(select * from orgkpp ok'
                                 +' where ok.org_id=ooo.id and ok.kpp=?))'
          else Result := Result
                  +' and (ooo.KPP = '#39#39' or ooo.KPP is null)';
                                 {
                  // наличие счет у орг 5го (или другово типа) типа
                  +' and exists ( select * from  ORGACCOUNT OA'
                  +'     where OA.ORG_ID = OOO.ID'
                  +'  and OA.CLOSE_DATE is null'
                  +'  and ((OA.ACCOUNT_NUMBER=? and oa.orgacctype_id in ('
                  +aLSType + '))'
                  +xQueryAllAccount
                  +'))';          }
        except
          ExceptionProc( 'QueryOrgReceipient_');
      end;

  end;


  {~QueryExpBudget2_
    запрос поиска строки в РЧБ с бюджетополучателем, равным контрагенту,
    который определяется подзапросом QueryOrgReceipient_.
    возвращает значение запроса в поле aResultFieldName.
    aSelect - подзапрос select...
    например:
      select count( * ) N
      или
      select e.receipient ID }
  function QueryExpBudget2_( aSelect, aRecipientID: string): string;
  var
    xXml: Variant;
  begin

      try
//        if (LENGTH( aResultFieldName) > 0)
//          then
        Result := QueryField( aSelect
                             +' X From Expbudget E'
                             +' Where E.Budget_Id = ?'
                             +'  and E.Estimate_Id = ?'
                             +'  and E.Kfsr_Code = ?'
                             +'  and E.Kvr_Code = ?'
                             // exchange #3062
//                             +'  and E.Kesr_Code = ?'
                             +'  and E.Kcsr_Code = ?'
                             +'  and E.Kadmr_Code = ?'
                             +'  and E.PURPOSEFULGRANT_ID=?'
                             +'  and E.RECIPIENT_ID=?',
//                              in (select ooo.ID ID '
  //                           +QueryOrgReceipient_ + ')',
                              [ aBudgetId,
                                aESTIMATE_ID,
                                xKFSR_CODE,
                                xKVR_CODE,
//                                xKESR_CODE,
                                xKCSR_CODE,
                                xKADMR_CODE,
                                xPURPOSEFULGRANT_ID,
                                aRecipientID {
                                aBudgetId,
                                aINN,//xZR_INN_RCP,
                                aKPP,//xZR_KPP_RCP,
                                aKPP,//xZR_KPP_RCP,
                                aLS}],//xZR_LS_UBP_RCP],
                              'X');
                              (*
        else begin
          xXml := QueryXml( aSelect
                             +' From Expbudget E'
                             +' Where E.Budget_Id = ?'
                             +'  and E.Estimate_Id = ?'
                             +'  and E.Kfsr_Code = ?'
                             +'  and E.Kvr_Code = ?'
                             +'  and E.Kesr_Code = ?'
                             +'  and E.Kcsr_Code = ?'
                             +'  and E.Kadmr_Code = ?'
                             +'  and E.PURPOSEFULGRANT_ID=?'
                             +'  and E.RECIPIENT_ID=?',
                             // in (select ooo.ID ID '
//                             +QueryOrgReceipient_ + ')',
                              [ aBudgetId,
                                aESTIMATE_ID,
                                xKFSR_CODE,
                                xKVR_CODE,
                                xKESR_CODE,
                                xKCSR_CODE,
                                xKADMR_CODE,
                                xPURPOSEFULGRANT_ID,
                                aRecipientID{,
                                aBudgetId,
                                aINN,
                                aKPP,
                                aKPP,
                                aLS}]);
          Result := INTTOSTR( xXml.documentElement.childNodes.Length);
        end;
        *)
        except
          ExceptionProc( 'QueryExpBudget2_');
      end;

  end;

  {~QueryExpBudget1_
    запрос поиска строки в РЧБ без бюджетополучателя.
    возвращает значение запроса в поле aResultFieldName.
    aSelect - подзапрос select...
    например:
      select count( * ) N
      или
      select e.receipient ID }
  function QueryExpBudget1_{( aSelect, aResultFieldName: string)}: integer;
//  var
//    xXml: Variant;
  begin

      try
{        if (LENGTH( aResultFieldName) > 0)
          then
        Result := QueryField( aSelect
                             +' From Expbudget E'
                             +' Where E.Budget_Id = ?'
                             +'  and E.Estimate_Id = ?'
                             +'  and E.Kfsr_Code = ?'
                             +'  and E.Kvr_Code = ?'
                             +'  and E.Kesr_Code = ?'
                             +'  and E.Kcsr_Code = ?'
                             +'  and E.Kadmr_Code = ?'
                             +'  and E.PURPOSEFULGRANT_ID=?',
                              [ aBudgetId,
                                aESTIMATE_ID,
                                xKFSR_CODE,
                                xKVR_CODE,
                                xKESR_CODE,
                                xKCSR_CODE,
                                xKADMR_CODE,
                                xPURPOSEFULGRANT_ID],
                              aResultFieldName)
        else begin}
          xXml := QueryXml(
                              ' Select distinct E.RECIPIENT_ID ID'
                             +' From Expbudget E'
                             +' Where E.Budget_Id = ?'
                             +'  and E.Estimate_Id = ?'
                             +'  and E.Kfsr_Code = ?'
                             +'  and E.Kvr_Code = ?'
                             // exchange #3062
//                             +'  and E.Kesr_Code = ?'
                             +'  and E.Kcsr_Code = ?'
                             +'  and E.Kadmr_Code = ?'
                             +'  and E.PURPOSEFULGRANT_ID=?',
                              [ aBudgetId,
                                aESTIMATE_ID,
                                xKFSR_CODE,
                                xKVR_CODE,
  //                              xKESR_CODE,
                                xKCSR_CODE,
                                xKADMR_CODE,
                                xPURPOSEFULGRANT_ID]);
          Result := xXml.documentElement.childNodes.Length;
          if (Result = 1)
            then xXml := xXml.documentElement.childNodes.item[0];
//        end;
        except
          ExceptionProc( 'QueryExpBudget1_');
      end;

  end;

(*
  {~DoGetFieldsFromZR_
    заполнение переменных из раздела ZR.}
  procedure DoGetFieldsFromZR_;
  begin

      try
        xZR_INN_RCP    := GetNodeAttributeEx( aXmlZR, 'INN_RCP');
        xZR_KPP_RCP    := GetNodeAttributeEx( aXmlZR, 'KPP_RCP');
        xZR_LS_UBP_RCP := GetNodeAttributeEx( aXmlZR, 'LS_UBP_RCP');
        except
          ExceptionProc( 'DoGetFieldsFromZR_');
      end;

  end;
  *)


begin

    try
//      aESTIMATE_ID  := GetNodeAttributeEx( aED11, 'ESTIMATE_ID');
//      aBudgetId     := GetNodeAttributeEx( aED11, 'BUDGET_ID');

      // использование кода цели при поиске бланка расходов
      // если цод цели в файле пустой - заменяем его на системный 0
      xPURPOSEFULGRANT_ID := GetNodeAttributeEx( aXmlZRST, 'PURPOSEFULGRANT_ID');
      if (xPURPOSEFULGRANT_ID = '')
        then xPURPOSEFULGRANT_ID := GetPurposeFulgrantId( aBudgetId, '0');

      // переносим параметры КБК в локальные переменные
      // это несколько ускорит работу и уменьшит размер скомп.скрипта
      xKFSR_CODE  := GetNodeAttributeEx( aXmlZRST, 'KFSR_CODE');
      xKVR_CODE   := GetNodeAttributeEx( aXmlZRST, 'KVR_CODE');
      xKESR_CODE  := GetNodeAttributeEx( aXmlZRST, 'KESR_CODE');
      xKCSR_CODE  := GetNodeAttributeEx( aXmlZRST, 'KCSR_CODE');
      xKADMR_CODE := GetNodeAttributeEx( aXmlZRST, 'KADMR_CODE');

      // проверяем, сколько есть строк в РЧБ с учетом райденного бланка расходов
      // и кбк+код цели текущей строки ZRST
      if (LENGTH( aRECIPIENT_ID_Ex) > 0)
        then
        xFound := QueryField( ' Select count( * ) N From Expbudget E'
                           +' Where E.Budget_Id = ?'
                           +'  and E.Estimate_Id = ?'
                           +'  and E.Kfsr_Code = ?'
                           +'  and E.Kvr_Code = ?'
                           // exchange #3062
//                           +'  and E.Kesr_Code = ?'
                           +'  and E.Kcsr_Code = ?'
                           +'  and E.Kadmr_Code = ?'
                           +'  and E.PURPOSEFULGRANT_ID=?'
                           +' and E.RECIPIENT_ID=?',
                            [ aBudgetId,
                              aESTIMATE_ID,
                              xKFSR_CODE,
                              xKVR_CODE,
//                              xKESR_CODE,
                              xKCSR_CODE,
                              xKADMR_CODE,
                              xPURPOSEFULGRANT_ID,
                              aRECIPIENT_ID_Ex],
                            'N')
        else
      xFound := QueryField( ' Select count( * ) N From Expbudget E'
                           +' Where E.Budget_Id = ?'
                           +'  and E.Estimate_Id = ?'
                           +'  and E.Kfsr_Code = ?'
                           +'  and E.Kvr_Code = ?'
                           // exchange #3062
//                           +'  and E.Kesr_Code = ?'
                           +'  and E.Kcsr_Code = ?'
                           +'  and E.Kadmr_Code = ?'
                           +'  and E.PURPOSEFULGRANT_ID=?',
                            [ aBudgetId,
                              aESTIMATE_ID,
                              xKFSR_CODE,
                              xKVR_CODE,
//                              xKESR_CODE,
                              xKCSR_CODE,
                              xKADMR_CODE,
                              xPURPOSEFULGRANT_ID],
                            'N');
      case xFound of
        '0': begin
              DoLineFillDefault_;
              // в рчб не нашли
              Result := FALSE;
              EXIT;
            end;

        '1': begin
              // п.1 а) если в РЧБ найдена одна строка
              // заполняем доп коды из строки РЧБ
              DoLineFill_ExpBudget_( aRECIPIENT_ID_Ex);
              Result := TRUE;
              EXIT;
            end;
      end;//case//

      if (LENGTH( aRECIPIENT_ID_Ex) > 0) then begin
              DoLineFillDefault_;
              // в рчб не нашли
              Result := FALSE;
              EXIT;
      end;

      // описание бланка расходов в справочнике
      xXml := QueryXml( ' Select INTER_BUDG_TRANS_FLAG MBT, ORG_ID'
                       +' From Estimate Where Id = ?',
                        [ aESTIMATE_ID]);
      xXml := xXml.documentElement.childNodes.item[0];
      // проверяем признак МБТ

      if (GetNodeAttributeEx( xXml, 'MBT') = '0')
        then xRECIPIENT_ID := GetNodeAttributeEx( xXml, 'ORG_ID')
        else begin
          // берем поля для поиска контрагента
          //DoLineFillDefault_;
          // если ИНН не заполнено, то орг считаем не найденной.
          if (LENGTH( aINN) <= 0)
            then begin
              xFound := '0';   // в этом случае не делаем лишний запрос к бд.

            end else
          // поиск контрагента
          if (LENGTH( aKPP) > 0)
            then xFound := QueryField( 'select count( * ) N ' + QueryOrgReceipient_,
                          [ aBudgetId,
                            aINN,
                            aKPP,
                            aKPP{,
                            aLS}],
                          'N')
            else xFound := QueryField( 'select count( * ) N ' + QueryOrgReceipient_,
                          [ aBudgetId,
                            aINN],
                          'N');
          if (xFound <> '1')
            then begin
             // если не нашли орг - бюджетополучатель = "не указан"
              //xRECIPIENT_ID := '0';
              Result := FALSE;
              DoLineFillDefault_;
              EXIT;
            end;

          if (LENGTH( aKPP) > 0)
            then xRECIPIENT_ID :=
                  QueryField(
                        'select ooo.ID ID ' + QueryOrgReceipient_,
                        [ aBudgetId,
                          aINN,
                          aKPP,
                          aKPP{,
                          aLS}],
                        'ID')
            else xRECIPIENT_ID :=
                  QueryField(
                        'select ooo.ID ID ' + QueryOrgReceipient_,
                        [ aBudgetId,
                          aINN],
                        'ID');
              //Result := TRUE;
        end;
              // заполняем бюджетополучателя в строке ЭД 11го
//              aEDLine.SetAttribute( 'RECIPIENT_ID', xRECIPIENT_ID);
  //            EXIT;
//            end;

      // берем поля из ZR для поиска контрагента
//      DoGetFieldsFromZR_;

(*
      // проверяем, сколько есть строк в РЧБ с учетом райденного бланка расходов
      // и кбк+код цели текущей строки ZRST
      // а бюджетополучатель определяем как контрагент
      // проверяем, если контрагент найден один, то ищем строку в РЧБ
      // с бюджетополучателем=контрагент, если контрагент не найден или
      // найдено несколько - ищем в РЧБ строку без бюджетополучателя
      if (QueryField( 'select count( * ) N ' + QueryOrgReceipient_,
                      [ aBudgetId,
                        aINN,
                        aKPP,
                        aKPP{,
                        aLS}],
                      'N') = '1')
        then begin
          xOrgID := QueryField( 'select ooo.ID ID ' + QueryOrgReceipient_,
                      [ aBudgetId,
                        aINN,
                        aKPP,
                        aKPP{,
                        aLS}],
                      'ID');
  *)
          case QueryExpBudget2_( 'Select count( * ) ', xRECIPIENT_ID) of
            '0': begin
                    DoLineFillDefault_;       // заполнение строки по умолчанию
//                    aEDLine.SetAttribute( 'RECIPIENT_ID', '0');
                    Result := FALSE;
                  end;

            '1': begin
                    DoLineFill_ExpBudget_( xRECIPIENT_ID);
                    Result := TRUE;
                  end;

             else begin
                    DoLineFillDefault_;       // заполнение строки по умолчанию
                    aEDLine.SetAttribute( 'RECIPIENT_ID', xRECIPIENT_ID);
                    Result := FALSE;
                  end;
          end;//case//
          (*
        end else begin
          // проверяем, сколько есть строк с одинаковым кбк+КЦ+БР в рчб,
          // и сколько в них разных бюджетополучателей.
          if (QueryExpBudget1_{( 'Select distinct E.RECIPIENT_ID ID ', '')} = 1) then begin
            // если бюджетополучатель один, проверяем, сколько строк в РЧБ
            // с найденным бюджетополучателем
            xOrgID := GetNodeAttributeEx( xXml, 'ID');
            case QueryExpBudget2_( 'Select count( * ) N', 'N', xOrgID) of
              '0': begin
              	     DoLineFillDefault_;       // заполнение строки по умолчанию
              	     Result := FALSE;
              	   end;
              '1': begin
                      DoLineFillDefault_;       // заполнение строки по умолчанию
                      aEDLine.SetAttribute( 'RECIPIENT_ID', xOrgID);
                      Result := TRUE;
                    end;
              else begin
        //              xRECIPIENT_ID := xOrgID;//QueryExpBudget2_( 'select e.RECIPIENT_ID ID', 'ID', xOrgID);
                      aEDLine.SetAttribute( 'RECIPIENT_ID', xOrgID);//xRECIPIENT_ID);
                      DoLineFill_ExpBudget_( xOrgID);//xRECIPIENT_ID);
                      // здесь найдено несколько строк в РЧБ содним бюджетополучателем
                      // но разными значениями в других полях
                      Result := FALSE;
                    end;
            end;//case//
          end else begin
            DoLineFillDefault_;       // заполнение строки по умолчанию
            Result := FALSE;
          end;
          {
            if (QueryExpBudget1_( 'Select count( * ) N', 'N') <> '1')
              then DoLineFillDefault_       // заполнение строки по умолчанию
              else begin
                xRECIPIENT_ID := QueryExpBudget1_( 'select e.RECIPIENT_ID ID', 'ID');
                aEDLine.SetAttribute( 'RECIPIENT_ID', xRECIPIENT_ID);
                DoLineFill_ExpBudget_( xRECIPIENT_ID);
              end;}
        end;
        *)
      except
        ExceptionProc( 'FillLine10_ED_2953');
    end;

end;


    function DoSearchOrg10_( aBudgetID, aAcc: string;
                             var aOrgID: string;
                             var aOrgXML: Variant;
                             var aLsXML: Variant): boolean;
    var
      xSQL: string;
      xLsXML: Variant;
      xOrgXML: Variant;
      xOrgID: string;
    begin

        try
          xOrgID := '';
          xOrgXML := NULL;
          aLsXML := NULL;
          xSQL := ' from orgaccount oa'
                  // орг. владелец счета
                 +' join org o on o.id=oa.org_id'
                  // галка актуальности орг
                 +' Join Contractor C on C.Org_Id = O.Id'
                 +' Join Budget B on B.Org_Id = C.Inspector_Id'
                  // проверка только номера счета
                 +' where oa.account_number=?'
                  // тип счета 5
                 +' and OA.ORGACCTYPE_ID = 5'
                 +' and b.id=?'
                 +' and oa.close_date is null'
                 +' and o.close_date is null'
                  // роли орг = 0
                 +' and exists(select r.* from OrgRoles r'
                 +'  where r.org_id=oa.org_id'
                 +'  and r.OrgRole_Id in (0))';

          if (QueryField( ' select count( * ) N ' + xSQL,
                                [ aAcc,
                                  aBudgetID],
                                'N') <> '1')
            then Result := FALSE
            else begin
              xLsXML := QueryXml( 'select oa.* ' + xSQL,
                                [ aAcc,
                                  aBudgetID]);
              if (xLsXML.documentElement.childNodes.length <> 1)
                then Result := FALSE
                else begin
                  xLsXML := xLsXML.documentElement.childNodes.item[ 0];
                  // описание орг владельца счета
                  xOrgID := GetNodeAttributeEx( xLsXML, 'ORG_ID');
                  xOrgXML := QueryXml( 'select * from org where id=?', [ xOrgID]);
                  if (xOrgXML.documentElement.childNodes.length <> 1)
                    then Result := FALSE
                    else begin
                      Result := TRUE;
                      aOrgID := xOrgID;
                      aOrgXML := xOrgXML.documentElement.childNodes.item[ 0];
                      aLsXML := xLsXML;
                    end;
                end;
            end;
            {

              xOrgID := QueryXml( 'select oa.org_id ID ' + xSQL,
                                [ aIK_LS_UBP,
                                  aBudgetID],
                                'ID');
              xOrgXML := QueryXml( 'select * from org where id=?', [ xOrgID]);
              if (xOrgXML.documentElement.childNodes.length <> 1)
                then Result := FALSE
                else begin
                  Result := TRUE;
                  xOrgXML := xOrgXML.documentElement.childNodes.item[ 0];
                end;
            end;
            }

          except
            ExceptionProc( 'DoSearchOrg10_');
        end;

    end;


  {~DoFillLS_
    заполнение орг., счета, ТоУФК, УФК по описанию орг xOrgXml и счета xLSXml}
  procedure DoFillLS_(
                             aLS: string;
                             aLSXml: variant;
                             aDocLine: Variant);
  var
    xLS_KEEPER_ID: string;
    xLS_EXECUTER_ID: string;
    xLS_EXECUTERACC_ID: string;
  begin

      try
        // лицевой счет
        aDocLine.SetAttribute( 'ORG_ACCOUNT', aLS);

        // если описание счета не определено, реквизиты счета не заполняем
        if NOT VarIsNULL( aLSXml) then begin
          aDocLine.SetAttribute( 'ORGACCOUNT_ID',
                                  aLSXml.GetAttribute( 'ID'));

          xLS_KEEPER_ID := aLSXml.GetAttribute( 'KEEPER_ID');
          xLS_EXECUTER_ID := aLSXml.GetAttribute( 'EXECUTER_ID');

          // ТОФК - Значение поля «ТОФК» карточки лицевого счета.
          // Если ТОФК=УФК, то не заполнять.
          if (LENGTH( xLS_KEEPER_ID) > 0) then
            if ( xLS_KEEPER_ID <> xLS_EXECUTER_ID)
              then aDocLine.SetAttribute(
                          'ORG_OFK_NAME',
                          QueryField( ' select CAPTION from org'
                                     +' where id=?',
                                      [ xLS_KEEPER_ID],
                                      'CAPTION'));
          // УФК из счета
          if (LENGTH( xLS_EXECUTER_ID) > 0) then begin

            // УФК - Значение поля «УФК» карточки лицевого счета.
            aDocLine.SetAttribute(
                          'ORG_UFK_NAME',
                          QueryField( ' select DESCRIPTION from org'
                                     +' where id=?',
                                      [ xLS_EXECUTER_ID],
                                      'DESCRIPTION'));
            // Счет УФК, если УФК заполнено
            xLS_EXECUTERACC_ID := aLSXml.GetAttribute( 'EXECUTERACC_ID');

            aDocLine.SetAttribute(
                          'ORG_UFK_ACC_ID',
                          xLS_EXECUTERACC_ID);
            if (LENGTH( xLS_EXECUTERACC_ID) > 0) then begin

              // Счет УФК	- Значение поля «Единый счет бюджета»
              aDocLine.SetAttribute(
                          'ORG_UFK_ACCOUNT',
                          QueryField( ' select ACCOUNT_NUMBER'
                                     +' from orgaccount where id=?',
                                      [ xLS_EXECUTERACC_ID],
                                      'ACCOUNT_NUMBER'));
              // БИК - Значение одноименных полей карточки счета
              // «Единый счет бюджета»
              aDocLine.SetAttribute(
                          'ORG_BIC',
                          QueryField( ' select b.BIC, b.DESCRIPTION'
                                     +' from orgaccount oa'
                                     +' join BANK b on b.id=oa.BANK_ID'
                                     +' where oa.id=?',
                                      [ xLS_EXECUTERACC_ID],
                                      'BIC'));
              // БАНК - Значение одноименных полей карточки счета
              // «Единый счет бюджета»
              aDocLine.SetAttribute(
                          'ORG_B_NAME',
                          QueryField( ' select b.BIC, b.DESCRIPTION'
                                     +' from orgaccount oa'
                                     +' join BANK b on b.id=oa.BANK_ID'
                                     +' where oa.id=?',
                                      [ xLS_EXECUTERACC_ID],
                                      'DESCRIPTION'));
            end;
          end;
        end;

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

  end;



  {~DoFillOrgAndLS_
    заполнение орг., счета, ТоУФК, УФК по описанию орг xOrgXml и счета xLSXml}
  procedure DoFillOrgAndLS_( aOrgID: string;
                             aOrgXml: variant;
                             aLS: string;
                             aLSXml: variant;
                             aDocLine: Variant);
{  var
    xLS_KEEPER_ID: string;
    xLS_EXECUTER_ID: string;
    xLS_EXECUTERACC_ID: string;}
  begin

      try
        if NOT VarIsNULL( aOrgXml) then begin
          aDocLine.SetAttribute( 'ORG_ID',
                                  aOrgID);
          aDocLine.SetAttribute( 'ORG_TAXCODE',
                                  aOrgXml.GetAttribute( 'TAXCODE'));
          aDocLine.SetAttribute( 'ORG_KPP',
                                  aOrgXml.GetAttribute( 'KPP'));
          aDocLine.SetAttribute( 'ORG_NAME',
                                  aOrgXml.GetAttribute( 'DESCRIPTION'));

          // описание счета
          DoFillLS_( aLS, aLSXml, aDocLine);
          (*
          aDocLine.SetAttribute( 'ORG_ACCOUNT', );

          // если описание счета не определено, реквизиты счета не заполняем
          if NOT VarIsNULL( aLSXml) then begin
            aDocLine.SetAttribute( 'ORGACCOUNT_ID',
                                    aLSXml.GetAttribute( 'ID'));

            xLS_KEEPER_ID := aLSXml.GetAttribute( 'KEEPER_ID');
            xLS_EXECUTER_ID := aLSXml.GetAttribute( 'EXECUTER_ID');

            // ТОФК - Значение поля «ТОФК» карточки лицевого счета.
            // Если ТОФК=УФК, то не заполнять.
            if (LENGTH( xLS_KEEPER_ID) > 0) then
              if ( xLS_KEEPER_ID <> xLS_EXECUTER_ID)
                then aDocLine.SetAttribute(
                            'ORG_OFK_NAME',
                            QueryField( ' select CAPTION from org'
                                       +' where id=?',
                                        [ xLS_KEEPER_ID],
                                        'CAPTION'));
            // УФК из счета
            if (LENGTH( xLS_EXECUTER_ID) > 0) then begin

              // УФК - Значение поля «УФК» карточки лицевого счета.
              aDocLine.SetAttribute(
                            'ORG_UFK_NAME',
                            QueryField( ' select DESCRIPTION from org'
                                       +' where id=?',
                                        [ xLS_EXECUTER_ID],
                                        'DESCRIPTION'));
              // Счет УФК, если УФК заполнено
              xLS_EXECUTERACC_ID := aLSXml.GetAttribute( 'EXECUTERACC_ID');

              aDocLine.SetAttribute(
                            'ORG_UFK_ACC_ID',
                            xLS_EXECUTERACC_ID);
              if (LENGTH( xLS_EXECUTERACC_ID) > 0) then begin

                // Счет УФК	- Значение поля «Единый счет бюджета»
                aDocLine.SetAttribute(
                            'ORG_UFK_ACCOUNT',
                            QueryField( ' select ACCOUNT_NUMBER'
                                       +' from orgaccount where id=?',
                                        [ xLS_EXECUTERACC_ID],
                                        'ACCOUNT_NUMBER'));
                // БИК - Значение одноименных полей карточки счета
                // «Единый счет бюджета»
                aDocLine.SetAttribute(
                            'ORG_BIC',
                            QueryField( ' select b.BIC, b.DESCRIPTION'
                                       +' from orgaccount oa'
                                       +' join BANK b on b.id=oa.BANK_ID'
                                       +' where oa.id=?',
                                        [ xLS_EXECUTERACC_ID],
                                        'BIC'));
                // БАНК - Значение одноименных полей карточки счета
                // «Единый счет бюджета»
                aDocLine.SetAttribute(
                            'ORG_B_NAME',
                            QueryField( ' select b.BIC, b.DESCRIPTION'
                                       +' from orgaccount oa'
                                       +' join BANK b on b.id=oa.BANK_ID'
                                       +' where oa.id=?',
                                        [ xLS_EXECUTERACC_ID],
                                        'DESCRIPTION'));
              end;
            end;
          end;
            *)

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

  end;


  {~DoSearchLS_by_ID_
    возвращает узел с описанием счета по ID }
function DoSearchLS_by_ID_( aAccID: string;
                             var aLSNumber: string;
                             var aLSXml: variant): boolean;
var
  xXML: variant;
begin

    try
      xXML := QueryXml( 'select * from orgaccount where id=?', [ aAccID]);
      if (xXML.documentElement.childNodes.length <> 1) then begin
        Result := FALSE;
        aLSXml := NULL;
        aLSNumber := '';
      end else begin
        Result := TRUE;
        aLSXml := xXML.documentElement.childNodes.item[ 0];
        aLSNumber := GetNodeAttributeEx( aLSXml, 'ACCOUNT_NUMBER');
      end;

      except
        ExceptionProc( 'DoSearchLS_by_ID_');
    end;

end;


  (*
{==============================================================================
  CreateDocED215_
  подпрограмма отправляет на сервер сформированный ЭД "справка по внебанковским
  операциям". при этом формируется такой ЭД в БД.
  помимо этого выполняется логирование XML описания этого ЭД до отправки на
  сервер и после операции - получение ответа.

  aValidate - проверка данных без создания ЭД.
    если параметр =true, никаких ЭД не создается, поэтому сразу выходим,
    даже не описывая логов.

  после выполнения операции XML xDocXml будет содержать ответ сервера, а не
  исходный документ!}
function CreateDocED215_( var xDocXml: Variant;
                          var xDoc: Variant;
                          aValidate: boolean): boolean;
begin

    try
      Result := FALSE;
      if aValidate then EXIT;
      InfoDoc215_BH( xDoc, 'Сохранение сформированного');
      xDoc.setAttribute('action', 'insert');
      xDoc.setAttribute('class', '215');
      // Вставка и обработка.
      // после вставки документ переводится на статус "отложен"
      try
        xDocXml.loadXml( ExecXml( xDocXml.xml));

        Result := TRUE;
        except
          WriteInfo( FORMAT( 'Сбой создания ЭД - %s',
                              [ LastException.Message]));
      end;

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

end;
*)

begin
end.
