function Bk_Ksdi_Ex1(BudgetId: String; StatusBar: TStatusBar;
  ProgressBar: TProgressBar;
  Ref: Boolean;
  aCfgSelector: integer): Variant;
var
  i, cnt: Integer;
  sql, Ksd, Ksi: String;
  Xml: Variant;
  xCode: string;
  xNode: Variant;
begin

    try
        if Ref then
        begin
          //получаем подвиды доходов.
          sql :=
            'Select C.Code Ksd_Code, KL.Description, KL.Caption,' +
            ' KL.Begin_Date, KL.Change_Date, KL.End_Date,'
    +' kl.ID LINE_ID,'
    +' kl.master_id KBK_ID,'
    +' kl.unload_date UNLOAD_DATE,'
    +' 0 TYPE_KBK,'
//    +' '#39 + cnPrefixID_KSD + #39' PREFIXID,'
    +GetSQLPrefixID( cnPrefixID_KSD)
    +' 0 LIMITED_FLAG'
    +
            ' From Ksd C' +
            ' Join Ksd_Lines KL on (KL.Master_Id = C.Id)' +
            ' Where C.Budget_Id = ?'

            +'  ~2 ';
//          Result := QueryXml(sql, [BudgetId]);
      Query.AddStr( BudgetId);
      {
      sql := StringReplace( sql,
                             '~1',
                             SqlFilterQueryEx( aCfgSelector, 'KL'));
                             }
  // exchange #2596
  // если параметр Выгружать только «Утвержден на уровне субъекта
  // (муниципального образования)»» = да, то фильтруем по полю
  // «Утвержден на уровне субъекта (муниципального образования)».
  // допускаются записи у которых значение в этом поле =1.
  if vCfg_2596
    then Result := ExecuteQueryLoadEx( Sql, 'KL', '~2', ' and C.APPROVED_ENTITY_LEVEL=1 ')
    else Result := ExecuteQueryLoadEx( Sql, 'KL', '~2');
//      Result := ExecuteQueryLoadEx( sql, 'KL', '~2');
      vExportListID_Action := cnExportActionUndefined;//'?';

          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('KSD_CODE');
            {
            Ksd := CacheFormatKbk.Values['Ksd' +
              Result.documentElement.ChildNodes.item[i].getAttribute('KSD_CODE')];
            if Ksd = '' then
            begin
              Ksd := KsdCodeFormat(
                Result.documentElement.ChildNodes.item[i].getAttribute('KSD_CODE'),
                  BudgetId);
              CacheFormatKbk.Add('Ksd' +
                Result.documentElement.ChildNodes.item[i].getAttribute('KSD_CODE') +
                  '=' + Ksd);
             end;
            Result.documentElement.ChildNodes.item[i].setAttribute('CODE', Ksd);
}
            xNode.setAttribute('CODE', KsdCodeFormat( xCode, BudgetId, kbkMaskOfChar));
            xNode.setAttribute('CODE_COPY', xCode);
          end;
          ProgressBar.Position := 0;
          //получаем коды видов источников, которые не пересеклись с кодами
          //подвидов доходов
          sql :=
          'Select C.Code Ksi_Code, KL.Description, KL.Caption,' +
            ' KL.Begin_Date, KL.Change_Date, KL.End_Date,'
    +' kl.ID LINE_ID,'
    +' kl.master_id KBK_ID,'
    +' kl.unload_date UNLOAD_DATE,'
    +' 1 TYPE_KBK,'
    +GetSQLPrefixID( cnPrefixID_KSI)
    +' 0 LIMITED_FLAG'
    +
            ' From Ksi C' +
            ' Join Ksi_Lines KL on (KL.Master_Id = C.Id)' +
            ' Where C.Budget_Id = ? and ' +
            '   not exists (Select 1 From Ksd Where C.code = Ksd.code'
            // exchange #2596
            // тут ошибка в том, что нужно было проверять бюджет кодов доходов.
            // если этого не делать то код доходов проверялся для любых бюджетов,
            // и в каком нибудь находилось совпадение, а это неверно.
            +'  and KSD.budget_id=c.budget_id)'
            +'  ~2 ';
      Query.AddStr( BudgetId);
      {
      sql := StringReplace( sql,
                             '~1',
                             SqlFilterQueryEx( aCfgSelector, 'KL'));
                             }
  if vCfg_2596
    then Xml := ExecuteQueryLoadEx( Sql, 'KL', '~2', ' and C.APPROVED_ENTITY_LEVEL=1 ')
    else Xml := ExecuteQueryLoadEx( Sql, 'KL', '~2');
//      Xml := ExecuteQueryLoadEx( sql, 'KL', '~2');
      vExportListID_Action := cnExportActionUndefined;
//      vExportListID_Action := 'ksi';
//          Xml := QueryXml(sql, [BudgetId]);

          cnt := Xml.documentElement.ChildNodes.Length;
          ProgressBar.Max := cnt;
          for i := 0 to Xml.documentElement.ChildNodes.Length - 1 do begin
            xNode := Xml.documentElement.ChildNodes.item[i];

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

            { доработка заключается в удалении кеша - это не нужно.
              поскольку теперь при форматировании используется кэш более эффективно.
              это связано с тем, что в разных бюджетов маски могут быть разными.
              и потом: иметь один кеш на все коды - не эффективно: много памяти
              потребляется.
              так же добавлено новое поле: CODE_COPY.
              в него заносится исходный код БК, а в поле CODE сохраняем форматированный
              по максе (в отличие от старого кода, где форматирование только по длине).
              это больше похоже на АЦК-Ф, только для линейного списка.}
            xCode := xNode.getAttribute('KSI_CODE');
            {
            Ksi := CacheFormatKbk.Values['Ksi' +
              Xml.documentElement.ChildNodes.item[i].getAttribute('KSI_CODE')];
            if Ksi = '' then
            begin
              Ksi := KsiCodeFormat(
                Xml.documentElement.ChildNodes.item[i].getAttribute('KSI_CODE'),
                  BudgetId);
              CacheFormatKbk.Add('Ksi' +
                Xml.documentElement.ChildNodes.item[i].getAttribute('KSI_CODE') +
                  '=' + Ksi);
            end;
            Xml.documentElement.ChildNodes.item[i].setAttribute('CODE', Ksi);
              }
            xNode.setAttribute('CODE', KsiCodeFormat( xCode, BudgetId, kbkMaskOfChar));
            xNode.setAttribute('CODE_COPY', xCode);
          end;
          ProgressBar.Position := 0;
          //добавляем коды видов источников в выборку подвидов доходов
          for i := 0 to Xml.documentElement.ChildNodes.Length - 1 do
            Result.documentElement.appendChild(Xml.documentElement.childNodes.Item[i].CloneNode(False));
        end
        else begin
          //получаем подвиды доходов из ДЧБ
          sql := ' Select Ksd.Code Ksd_Code, KL.Description, KL.Caption, KL.Begin_Date,' +
            ' KL.Change_Date, KL.End_Date,'
    +' kl.ID LINE_ID,'
//    +' kl.master_id KBK_ID,'
    +' kl.unload_date UNLOAD_DATE,'
    +' 1 TYPE_KBK,'
    +GetSQLPrefixID( cnPrefixID_KSD)
    +' 0 LIMITED_FLAG'
    +
            ' From IncBudget C' +
            ' Join Kd On (Kd.Code = C.Kd_Code And Kd.Budget_Id = C.Budget_Id)' +
            ' Join Ksd On (Ksd.Code = Kd.Ksd_code and Ksd.Budget_id = C.Budget_Id)' +
            ' Join Ksd_Lines KL on (KL.Master_Id = Ksd.Id)' +
            ' Where C.Budget_Id = ?'

            +'  ~2 '
            +

            ' Group By Ksd.Code, KL.Description, KL.Caption, KL.Begin_Date,' +
            '   KL.Change_Date, KL.End_Date,'
    +' kl.ID,'
//    +' kl.master_id KBK_ID,'
    +' kl.unload_date';
      Query.AddStr( BudgetId);
      {
      sql := StringReplace( sql,
                             '~1',
                             SqlFilterQueryEx( aCfgSelector, 'KL'));
                             }
  // exchange #2596
  // если параметр Выгружать только «Утвержден на уровне субъекта
  // (муниципального образования)»» = да, то фильтруем по полю
  // «Утвержден на уровне субъекта (муниципального образования)».
  // допускаются записи у которых значение в этом поле =1.
  if vCfg_2596
    then Result := ExecuteQueryLoadEx( Sql, 'KL', '~2', ' and Ksd.APPROVED_ENTITY_LEVEL=1 ')
    else Result := ExecuteQueryLoadEx( Sql, 'KL', '~2');
//      Result := ExecuteQueryLoadEx( sql, 'KL', '~2');
      vExportListID_Action := cnExportActionUndefined;
//            vExportListID_Action := 'ksd';
//          Result := QueryXml(sql, [BudgetId, BudgetId, BudgetId]);

          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('KSD_CODE');
            {
            Ksd := CacheFormatKbk.Values['Ksd' +
              Result.documentElement.ChildNodes.item[i].getAttribute('KSD_CODE')];
            if Ksd = '' then
            begin
              Ksd := KsdCodeFormat(
                Result.documentElement.ChildNodes.item[i].getAttribute('KSD_CODE'),
                  BudgetId);
              CacheFormatKbk.Add('Ksd' +
                Result.documentElement.ChildNodes.item[i].getAttribute('KSD_CODE') +
                  '=' + Ksd);
             end;
            Result.documentElement.ChildNodes.item[i].setAttribute('CODE', Ksd);
              }

            xNode.setAttribute('CODE', KsdCodeFormat( xCode, BudgetId, kbkMaskOfChar));
            xNode.setAttribute('CODE_COPY', xCode);
          end;
          ProgressBar.Position := 0;
          //получаем коды видов источников из ИБ, которые не пересеклись с кодами
          //подвидов доходов из ДЧБ
          sql := 'Select Ksi.Code Ksi_Code, KL.Description, KL.Caption, KL.Begin_Date,' +
            ' KL.Change_Date, KL.End_Date,'
    +' kl.ID LINE_ID,'
//    +' kl.master_id KBK_ID,'
    +' kl.unload_date UNLOAD_DATE,'
    +' 1 TYPE_KBK,'
    +GetSQLPrefixID( cnPrefixID_KSI)
    +' 0 LIMITED_FLAG'
    +
            ' From SrcBudget C' +
            ' Join Ki On (Ki.Code = C.Ki_Code And Ki.Budget_Id = C.Budget_Id)' +
            ' Join Ksi On (Ksi.Code = Ki.Ksi_code and Ksi.Budget_id = C.Budget_Id)' +
            ' Join Ksi_Lines KL on (KL.Master_Id = Ksi.Id)' +
            ' Where C.Budget_Id = ? and not exists' +
            '   (Select 1 ' +
            '   From IncBudget Ib' +
            '   Join Kd on (Kd.Code = Ib.Kd_Code and Kd.Budget_Id = Ib.Budget_Id)' +
            '   Join Ksd on Kd.Ksd_Code = Ksd.Code and Ksd.Budget_Id = Ib.Budget_Id' +
            '   Where Ib.Budget_Id=? and Ksd.Code = Ksi.Code)'

            +'  ~2 '
            +

            ' Group By Ksi.Code, KL.Description, KL.Caption, KL.Begin_Date,' +
            ' KL.Change_Date, KL.End_Date,'
    +' kl.ID,'
//    +' kl.master_id KBK_ID,'
    +' kl.unload_date';
      Query.AddStr( BudgetId);
      Query.AddStr( BudgetId);
      {
      sql := StringReplace( sql,
                             '~1',
                             SqlFilterQueryEx( aCfgSelector, 'KL'));
                             }

  // exchange #2596
  // если параметр Выгружать только «Утвержден на уровне субъекта
  // (муниципального образования)»» = да, то фильтруем по полю
  // «Утвержден на уровне субъекта (муниципального образования)».
  // допускаются записи у которых значение в этом поле =1.
  if vCfg_2596
    then Xml := ExecuteQueryLoadEx( Sql, 'KL', '~2', ' and Ksi.APPROVED_ENTITY_LEVEL=1 ')
    else Xml := ExecuteQueryLoadEx( Sql, 'KL', '~2');
//      Xml := ExecuteQueryLoadEx( sql, 'KL', '~2');

      vExportListID_Action := cnExportActionUndefined;
//            vExportListID_Action := 'ksi';

//          Xml := QueryXml(sql, [BudgetId, BudgetId, BudgetId, BudgetId, BudgetId]);
          cnt := Xml.documentElement.ChildNodes.Length;
          ProgressBar.Max := cnt;
          for i := 0 to Xml.documentElement.ChildNodes.Length - 1 do begin
            xNode := Xml.documentElement.ChildNodes.item[i];

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

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

            xNode.setAttribute('CODE', KsiCodeFormat( xCode, BudgetId, kbkMaskOfChar));
            xNode.setAttribute('CODE_COPY', xCode);
          end;
          ProgressBar.Position := 0;
          //добавляем коды видов источников в выборку подвидов доходов
          for i := 0 to Xml.documentElement.ChildNodes.Length - 1 do
            Result.documentElement.appendChild(Xml.documentElement.childNodes.Item[i].CloneNode(False));
        end;
      except
        ExceptionLog( 'Сбой Un_Kbk36.Bk_Ksdi_Ex1');
    end;

end;


function Bk_Ksdi_Ex2(BudgetId: String; StatusBar: TStatusBar;
  ProgressBar: TProgressBar;
  Ref: Boolean;
  aCfgSelector: integer): Variant;
var
  i, cnt: Integer;
  sql, Ksd, Ksi: String;
  Xml: Variant;
  xCode: string;
  xNode: Variant;
begin

    try
        if Ref then
        begin
          sql := 'Select C.Code Ksd_Code, KL.Description, KL.Caption,' +
            ' KL.Begin_Date, KL.Change_Date, KL.End_Date,'
    +' kl.ID LINE_ID,'
//    +' kl.master_id KBK_ID,'
    +' kl.unload_date UNLOAD_DATE,'
    +' 1 TYPE_KBK,'
    +' 0 LIMITED_FLAG'
    +
            ' From Ksd C' +
            ' Join Ksd_Lines KL on (KL.Master_Id = C.Id)' +
            ' Where C.Budget_Id = ?'
            +'  ~2 ';
//          Result := QueryXml(sql, [BudgetId]);
      Query.AddStr( BudgetId);
      {
      sql := StringReplace( sql,
                             '~1',
                             SqlFilterQueryEx( aCfgSelector, 'KL'));
                             }
  // exchange #2596
  // если параметр Выгружать только «Утвержден на уровне субъекта
  // (муниципального образования)»» = да, то фильтруем по полю
  // «Утвержден на уровне субъекта (муниципального образования)».
  // допускаются записи у которых значение в этом поле =1.
  if vCfg_2596
    then Result := ExecuteQueryLoadEx( Sql, 'KL', '~2', ' and C.APPROVED_ENTITY_LEVEL=1 ')
    else Result := ExecuteQueryLoadEx( Sql, 'KL', '~2');
//      Result := ExecuteQueryLoadEx( sql, 'KL', '~2');
            vExportListID_Action := 'ksd';
        end
        else begin
          sql := ' Select Ksd.Code Ksd_Code, KL.Description, KL.Caption, KL.Begin_Date,' +
            ' KL.Change_Date, KL.End_Date,'
    +' kl.ID LINE_ID,'
//    +' kl.master_id KBK_ID,'
    +' kl.unload_date UNLOAD_DATE,'
    +' 1 TYPE_KBK,'
    +' 0 LIMITED_FLAG'
    +
            ' From IncBudget C' +
            ' Join Kd On (Kd.Code = C.Kd_Code And Kd.Budget_Id = C.Budget_Id)' +
            ' Join Ksd On (Ksd.Code = Kd.Ksd_code and Ksd.Budget_id = C.Budget_Id)' +
            ' Join Ksd_Lines KL on (KL.Master_Id = Ksd.Id)' +
            ' Where C.Budget_Id = ?'

            +'  ~2 '
            +

            ' Group By Ksd.Code, KL.Description, KL.Caption, KL.Begin_Date,' +
            '   KL.Change_Date, KL.End_Date,'
    +' kl.ID,'
//    +' kl.master_id KBK_ID,'
    +' kl.unload_date';
//          Result := QueryXml(sql, [BudgetId, BudgetId, BudgetId]);
      Query.AddStr( BudgetId);
      {
      sql := StringReplace( sql,
                             '~1',
                             SqlFilterQueryEx( aCfgSelector, 'KL'));
                             }
  // exchange #2596
  // если параметр Выгружать только «Утвержден на уровне субъекта
  // (муниципального образования)»» = да, то фильтруем по полю
  // «Утвержден на уровне субъекта (муниципального образования)».
  // допускаются записи у которых значение в этом поле =1.
  if vCfg_2596
    then Result := ExecuteQueryLoadEx( Sql, 'KL', '~2', ' and Ksd.APPROVED_ENTITY_LEVEL=1 ')
    else Result := ExecuteQueryLoadEx( Sql, 'KL', '~2');
//      Result := ExecuteQueryLoadEx( sql, 'KL', '~2');
            vExportListID_Action := 'ksd';
        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('KSD_CODE');
            {
          Ksd := CacheFormatKbk.Values['Ksd' +
            Result.documentElement.ChildNodes.item[i].getAttribute('KSD_CODE')];
          if Ksd = '' then
          begin
            Ksd := KsdCodeFormat(
              Result.documentElement.ChildNodes.item[i].getAttribute('KSD_CODE'),
                BudgetId);
            CacheFormatKbk.Add('Ksd' +
              Result.documentElement.ChildNodes.item[i].getAttribute('KSD_CODE') +
                '=' + Ksd);
          end;
          Result.documentElement.ChildNodes.item[i].setAttribute('CODE', Ksd);
          }

          xNode.setAttribute('CODE', KsdCodeFormat( xCode, BudgetId, kbkMaskOfChar));
          xNode.setAttribute('CODE_COPY', xCode);
        end;
        ProgressBar.Position := 0;
      except
        ExceptionLog( 'Сбой Un_Kbk36.Bk_Ksdi_Ex2');
    end;

end;


function Bk_Ksdi_Ex3(BudgetId: String; StatusBar: TStatusBar;
  ProgressBar: TProgressBar;
  Ref: Boolean;
  aCfgSelector: integer): Variant;
var
  i, cnt: Integer;
  sql, Ksd, Ksi: String;
  Xml: Variant;
  xCode: string;
  xNode: Variant;
begin

    try
        if Ref then
        begin
          sql := 'Select C.Code Ksi_Code, KL.Description, KL.Caption,' +
            ' KL.Begin_Date, KL.Change_Date, KL.End_Date,'
    +' kl.ID LINE_ID,'
//    +' kl.master_id KBK_ID,'
    +' kl.unload_date UNLOAD_DATE,'
    +' 1 TYPE_KBK,'
    +' 0 LIMITED_FLAG'
    +
            ' From Ksi C' +
            ' Join Ksi_Lines KL on (KL.Master_Id = C.Id and KL.Unapproved = 0)' +
            ' Where C.Budget_Id = ?'
            +' ~2 ';
//           Result := QueryXml(sql, [BudgetId]);
      Query.AddStr( BudgetId);
      {
      sql := StringReplace( sql,
                             '~1',
                             SqlFilterQueryEx( aCfgSelector, 'KL'));
                             }
  // exchange #2596
  // если параметр Выгружать только «Утвержден на уровне субъекта
  // (муниципального образования)»» = да, то фильтруем по полю
  // «Утвержден на уровне субъекта (муниципального образования)».
  // допускаются записи у которых значение в этом поле =1.
  if vCfg_2596
    then Result := ExecuteQueryLoadEx( Sql, 'KL', '~2', ' and C.APPROVED_ENTITY_LEVEL=1 ')
    else Result := ExecuteQueryLoadEx( Sql, 'KL', '~2');
//      Result := ExecuteQueryLoadEx( sql, 'KL', '~2');
            vExportListID_Action := 'ksi';
        end
        else begin
          sql := 'Select Ksi.Code Ksi_Code, KL.Description, KL.Caption,' +
            ' KL.Begin_Date, KL.Change_Date, KL.End_Date,'
    +' kl.ID LINE_ID,'
//    +' kl.master_id KBK_ID,'
    +' kl.unload_date UNLOAD_DATE,'
    +' 1 TYPE_KBK,'
    +' 0 LIMITED_FLAG'
    +
            ' From SrcBudget C ' +
            ' Join Ki On (Ki.Code = C.Ki_Code And Ki.Budget_Id = C.Budget_Id)' +
            ' Join Ksi On (Ksi.Code = Ki.Ksi_Code and Ksi.Budget_id = C.Budget_Id)' +
            ' Join Ksi_Lines KL on (KL.Master_Id = Ksi.Id and KL.Unapproved = 0)' +
            ' Where C.Budget_Id = ?'

            +' ~2 '
            +

            ' Group By Ksi.Code, KL.Description, KL.Caption, KL.Begin_Date,' +
            '   KL.Change_Date, KL.End_Date,'
    +' kl.ID,'
//    +' kl.master_id KBK_ID,'
    +' kl.unload_date';
//          Result := QueryXml(sql, [BudgetId, BudgetId, BudgetId]);
      Query.AddStr( BudgetId);
      {
      sql := StringReplace( sql,
                             '~1',
                             SqlFilterQueryEx( aCfgSelector, 'KL'));
                             }
  // exchange #2596
  // если параметр Выгружать только «Утвержден на уровне субъекта
  // (муниципального образования)»» = да, то фильтруем по полю
  // «Утвержден на уровне субъекта (муниципального образования)».
  // допускаются записи у которых значение в этом поле =1.
  if vCfg_2596
    then Result := ExecuteQueryLoadEx( Sql, 'KL', '~2', ' and Ksi.APPROVED_ENTITY_LEVEL=1 ')
    else Result := ExecuteQueryLoadEx( Sql, 'KL', '~2');
//      Result := ExecuteQueryLoadEx( sql, 'KL', '~2');
            vExportListID_Action := 'ksi';

        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('KSI_CODE');
            {
          Ksi := CacheFormatKbk.Values['Ksi' +
            Result.documentElement.ChildNodes.item[i].getAttribute('KSI_CODE')];
          if Ksi = '' then
          begin
            Ksi := KsiCodeFormat(
              Result.documentElement.ChildNodes.item[i].getAttribute('KSI_CODE'),
                BudgetId);
            CacheFormatKbk.Add('Ksi' +
              Result.documentElement.ChildNodes.item[i].getAttribute('KSI_CODE') +
                '=' + Ksi);
          end;
          Result.documentElement.ChildNodes.item[i].setAttribute('CODE', Ksi);
          }

          xNode.setAttribute('CODE', KsiCodeFormat( xCode, BudgetId, kbkMaskOfChar));
          xNode.setAttribute('CODE_COPY', xCode);
        end;
        ProgressBar.Position := 0;
      except
        ExceptionLog( 'Сбой Un_Kbk36.Bk_Ksdi_Ex3');
    end;

end;

begin
end.
