function Bk_Glava_Ex( BudgetId: String;
                      StatusBar: TStatusBar;
                      ProgressBar: TProgressBar;
                      Ref: Boolean = False;
                      aCfgSelector: integer = 0): Variant;
var
  i, cnt: Integer;
  xsql, Kadm: String;
  xCode: string;
  xNode: Variant;
  xWhereEx: string;
begin

    try
      // exchange #2596
      // если параметр Выгружать только «Утвержден на уровне субъекта
      // (муниципального образования)»» = да, то фильтруем по полю
      // «Утвержден на уровне субъекта (муниципального образования)».
      // допускаются записи у которых значение в этом поле =1.
      // exchange #2927
      // чтобы поправить ошибку и добавить дату в сложный подзапрос,
      // требуется определить дополнительный параметр в выражени where (#2596)
      // и сложный запрос разбить на части.
      if vCfg_2596
        then xWhereEx := ' and C.APPROVED_ENTITY_LEVEL=1 '
        else xWhereEx := '';

//  Kbk := Bk_Kadm(BudgetId, StatusBar, ProgressBar, param_ref);
  if not Ref then
  begin
     // exchange #2927
     // требуется сложный запрос разбить на части, чтобы параметр даты
     // добавился в список параметров в нужном порядке.
     Query.AddStr( BudgetId);
     xSQL := ExchangeQueryLoadEx(
                 ' select'
            //    +' kl.master_id KBK_ID,'
                +' kl.ID LINE_ID,'
                +' 0 TYPE_KBK,'
                +' kl.CAPTION CAPTION,'
                +' kl.DESCRIPTION DESCRIPTION,'
                +' kl.begin_date BEGIN_DATE,'
                +' kl.end_date END_DATE,'
                +' kl.change_date CHANGE_DATE,'
                +' kl.unload_date UNLOAD_DATE,'
                +' C.CODE KADMR_CODE,'
                +' 0 TYPE_KBK,'
                +' 0 LIMITED_FLAG'
            //      'Select C.Kadmr_Code, KL.Description, KL.Caption, KL.Begin_Date,' +
            //      ' KL.Change_Date, KL.End_Date' +
                 +' From ExpBudget B' +
                  ' Join Kadm C On (C.Code = B.Kadmr_Code And C.Budget_Id = B.Budget_Id)' +
                  ' Join Kadm_Lines KL on (KL.Master_Id = C.Id)' +
                  ' Where B.Budget_Id = ?'
                 +'  ~2 ',
                  'KL', '~2', xWhereEx);

     // exchange #2927
     // требуется сложный запрос разбить на части, чтобы параметр даты
     // добавился в список параметров в нужном порядке.
     Query.AddStr( BudgetId);
     xSQL := xSQL
            +ExchangeQueryLoadEx(
                  ' Union'
                 +' SELECT '
            //      ' Select B.Kadmd_Code, KL.Description, KL.Caption, KL.Begin_Date,' +
            //      ' KL.Change_Date, KL.End_Date' +
            //    +' kl.master_id KBK_ID,'
                +' kl.ID LINE_ID,'
                +' 0 TYPE_KBK,'
                +' kl.CAPTION CAPTION,'
                +' kl.DESCRIPTION DESCRIPTION,'
                +' kl.begin_date BEGIN_DATE,'
                +' kl.end_date END_DATE,'
                +' kl.change_date CHANGE_DATE,'
                +' kl.unload_date UNLOAD_DATE,'
                +' C.CODE KADMR_CODE,'
                +' 0 TYPE_KBK,'
                +' 0 LIMITED_FLAG'

                + ' From IncBudget B' +
                  ' Join Kadm c On (c.Code = B.Kadmd_Code And c.Budget_Id = B.Budget_Id)' +
                  ' Join Kadm_Lines KL on (KL.Master_Id = c.Id)' +
                  ' Where B.Budget_Id = ?'
                 +'  ~2 ',
                  'KL', '~2', xWhereEx);

     // exchange #2927
     // требуется сложный запрос разбить на части, чтобы параметр даты
     // добавился в список параметров в нужном порядке.
     Query.AddStr( BudgetId);
     xSQL := xSQL
            +ExchangeQueryLoadEx(
                  ' Union'
                 +' select '
            //    +' kl.master_id KBK_ID,'
                +' kl.ID LINE_ID,'
                +' 0 TYPE_KBK,'
                +' kl.CAPTION CAPTION,'
                +' kl.DESCRIPTION DESCRIPTION,'
                +' kl.begin_date BEGIN_DATE,'
                +' kl.end_date END_DATE,'
                +' kl.change_date CHANGE_DATE,'
                +' kl.unload_date UNLOAD_DATE,'
                +' C.CODE KADMR_CODE,'
                +' 0 TYPE_KBK,'
                +' 0 LIMITED_FLAG'
            //      ' Select B.Kadmi_Code, KL.Description, KL.Caption, KL.Begin_Date,' +
            //      ' KL.Change_Date, KL.End_Date' +
                 +' From SrcBudget B' +
                  ' Join Kadm c On (c.Code = B.Kadmi_Code And c.Budget_Id = B.Budget_Id)' +
                  ' Join Kadm_Lines KL on (KL.Master_Id = c.Id)' +
                  ' Where B.Budget_Id = ?'
                  +'  ~2 ',
                   'KL', '~2', xWhereEx);
  end else begin
     Query.AddStr( BudgetId);
     xSQL := ExchangeQueryLoadEx(
            //      'Select distinct C.Code Kadmr_Code, KL.Description, KL.Caption,' +
            //      ' KL.Begin_Date, KL.Change_Date, KL.End_Date' +
                 'Select distinct '
                +' kl.master_id KBK_ID,'
                +' kl.ID LINE_ID,'
                +' 0 TYPE_KBK,'
                +' kl.CAPTION CAPTION,'
                +' kl.DESCRIPTION DESCRIPTION,'
                +' kl.begin_date BEGIN_DATE,'
                +' kl.end_date END_DATE,'
                +' kl.change_date CHANGE_DATE,'
                +' kl.unload_date UNLOAD_DATE,'
                +' C.CODE KADMR_CODE,'
                +' 0 TYPE_KBK,'
                +' 0 LIMITED_FLAG,'
                +' 0 LINE_VERSION'
                 +' From Kadm C' +
                  ' Join Kadm_Lines KL on (KL.Master_Id = C.Id)' +
                  ' Where C.Budget_Id = ?'
                  +'  ~2 ',
                   'KL', '~2', xWhereEx);
  end;
{
      xSQL := StringReplace( xSQL,
                             '~1',
                             SqlFilterQueryEx( aCfgSelector, 'KL'));
                             }

  // exchange #2927 - выполняем запрос
  Result := ExecuteQueryLoadExBySQL( xSql);
//      Result := ExecuteQueryLoadEx( xSql, 'KL', '~2');
    (*
      if not Ref then
      begin
        sql := 'Select C.Kvr_Code, KL.Description, KL.Caption, KL.Begin_Date,' +
          ' KL.Change_Date, KL.End_Date' +
          ' From ExpBudget C' +
          ' Join Kvr On (Kvr.Code = C.Kvr_Code And Kvr.Budget_Id = ?)' +
          ' Join Kvr_Lines KL on (KL.Master_Id = Kvr.Id and KL.Unapproved = 0)' +
          ' Where C.Budget_Id = ?' +
          ' Group By C.Kvr_Code, KL.Description, KL.Caption, KL.Begin_Date,' +
          ' KL.Change_Date, KL.End_Date';
        Result := QueryXml(Sql, [BudgetId, BudgetId]);
      end
      else begin
        sql := 'Select distinct C.Code Kvr_Code, KL.Description, KL.Caption,' +
          ' KL.Begin_Date, KL.Change_Date, KL.End_Date' +
            ' From Kvr C' +
            ' Join Kvr_Lines KL on (KL.Master_Id = C.Id and KL.Unapproved = 0)' +
            ' Where C.Budget_Id = ?';
        Result := QueryXml(Sql, [BudgetId]);
      end;
      *)
      cnt := Result.documentElement.ChildNodes.Length;
      ProgressBar.Max := cnt;
      for i := 0 to Result.documentElement.ChildNodes.Length - 1 do begin
        xNode := Result.documentElement.ChildNodes.item[i];

        ProgressBar.Position := i + 1;
        StatusBar.SimpleText := 'Приведение КБК в соответсвие с маской. Обработано: ' +
          IntToStr(i + 1) + ' из ' + IntToStr(cnt);

        { доработка заключается в удалении кеша - это не нужно.
          поскольку теперь при форматировании используется кэш более эффективно.
          это связано с тем, что в разных бюджетов маски могут быть разными.
          и потом: иметь один кеш на все коды - не эффективно: много памяти
          потребляется.
          так же добавлено новое поле: CODE_COPY.
          в него заносится исходный код БК, а в поле CODE сохраняем форматированный
          по максе (в отличие от старого кода, где форматирование только по длине).
          это больше похоже на АЦК-Ф, только для линейного списка.}
        xCode := xNode.getAttribute('KADMR_CODE');
{
        Kadm := CacheFormatKbk.Values['Kadm' +
          Result.documentElement.ChildNodes.item[i].getAttribute('KADMR_CODE')];
        if Kadm = '' then
        begin
          Kadm := KadmCodeFormat(
            Result.documentElement.ChildNodes.item[i].getAttribute('KADMR_CODE'),
              BudgetId);
          CacheFormatKbk.Add('Kadm' +
            Result.documentElement.ChildNodes.item[i].getAttribute('KADMR_CODE') +
              '=' + Kadm);
        end;
        Result.documentElement.ChildNodes.item[i].setAttribute('CODE', Kadm);
        }

        xNode.setAttribute('CODE', KadmCodeFormat( xCode, BudgetId, kbkMaskOfChar));
        xNode.setAttribute('CODE_COPY', xCode);
      end;
      ProgressBar.Position := 0;

      except
        ExceptionLog( 'Сбой Un_Kbk6.Bk_Glava_Ex');
    end;

end;

begin
end.
