{ exchange #3036
  здесь собраны функции, которые есть во всех проверках.
  фактически убраны дубли кода и дублирующий код оформлен в подпрограммах.}

{~DoCheckOrg
  проверка орг. в блоке "Получатель из выписки".
  результат:
    =false - проверка не выполнена. требуется прервать дальнейшую проверку.
    =true - проверка выполнена успешно.
  код одинаковый для:
    general
    Челябинска
    Екатеринбурга}
function DoCheckOrg( var aUnclassified: boolean): boolean;
var
  xXml: variant;
  xSQL: string;
begin

    try
      Result := FALSE;



      //определяет Id получателя из выписки
      if CDSListField_Org_Id_Get = '' then begin
        if (CDSListField_Org_TaxCode_Get = '') then begin
          CDSListField_Message(
                      'Не заполнен ИНН в блоке "Получатель из выписки"'
                     +' ЭД "Приложение к выписке кредитовое"');
          EXIT;
        end;

        // при доработке exchange #3036 добавлена группировка по орг.id.
        // такое было только в скрипте рязанской обл.
        xSQL :=  ' Select distinct O.Id From Org O'
                +' Join Orgroles Orl on Orl.Org_Id = O.Id'
                +' Where O.Taxcode = ? and O.Close_Date is null'
                +' and Orl.OrgRole_Id in (18, 19)';


        Query.AddStr( CDSListField_Org_TaxCode_Get{cds.FieldByName('Org_Taxcode').asString});

        if CDSListField_Org_Kpp_Get{cds.FieldByName('Org_Kpp').asString} <> '' then begin
          xSQL := xSQL + ' and O.Kpp = ?';
          Query.AddStr( CDSListField_Org_Kpp_Get);//cds.FieldByName('Org_Kpp').asString);
        end;

        xXml := vXML_Doc;//CreateOleObject('Microsoft.XmlDom');
        xXml.LoadXML( Query.Run( xSQL));
        xXml := xXml.documentElement.childNodes;

        if xXml.Length = 1
          then CDSListField_Org_Id( xXml.items[0].getAttribute('ID'))
          else begin
            CDSListField_Message('Id получателя из выписки в базе не найден');
            aUnclassified := True;
          end;
      end;

      Result := TRUE;
      except
        ExceptionProc( 'DoCheckOrg');
    end;

end;


{~DoSearchOrgAccount
  поиск счета
  режим (aMode) для скриптов:
    =1
       общий
       чел.обл
       екатеринбург
       КОМИ
       красноярский край
       пермский край
    =2
       ряз.обл
    =3
       тольяти

  вариант проверки для скриптов:
    =1
       общий
       КОМИ
    =2
       ряз.обл
    =3
       чел.обл
       екатеринбург
       красноярский край
       пермский край
       тольятти}
function DoSearchOrgAccount( {aXmlTo: Variant; }aMode, aModeResult: integer;
                              var aUnclassified: boolean): boolean;
var
//  xSQL: string;
  xXml: variant;
begin

    try
      Result := FALSE;

      xXml := vXML_Doc;//CreateOleObject('Microsoft.XmlDom');
      case aMode of
        1: begin
            //Определяем список лицевых счетов открытых на б/с счете получателя 24 класса
            Query.AddStr( CDSListField_Org_Id_Get{cds.FieldByName('Org_Id').AsString});
            Query.AddStr( CDSListField_Rec_Acc_Id_Get{cds.FieldByName('Rec_Acc_Id').asString});
            Query.AddStr( CDSListField_Org_Id_Get{cds.FieldByName('Org_Id').AsString});
            Query.AddStr( CDSListField_Rec_Acc_Id_Get{cds.FieldByName('Rec_Acc_Id').asString});
            xXml.LoadXML(
                Query.Run(
                    'Select Ls.Account_Number, Ls.Id'
                   +' From OrgAccount Ls'
                   +' Join Org O on O.Id = Ls.Org_Id'
                   +' Join OrgAccount Bs on Bs.Id = Ls.KeeperAcc_Id'
                   +' Where Ls.Org_Id = ? and Bs.Id = ? and Ls.OrgAccType_Id = 1'
                   +'   and Ls.Close_Date is null and Ls.Budget_Flag = 0'
                   +' Union'
                   +' Select Ls.Account_Number, Ls.Id'
                   +' From OrgAccount Ls'
                   +' Join Org O on O.Id = Ls.Org_Id'
                   +' Join OrgAccount Bs on Bs.Id = Ls.ExecuterAcc_Id'
                   +' Where Ls.Org_Id = ? and Bs.Id = ? and Ls.OrgAccType_Id = 5'
                   +'   and Ls.Close_Date is null and Ls.Budget_Flag = 0'));
          end;

        2: begin
            //Определяем список лицевых счетов открытых на б/с счете получателя 24 класса
            Query.AddStr( CDSListField_Org_Id_Get{cds.FieldByName('Org_Id').AsString});
            Query.AddStr( CDSListField_Rec_Acc_Id_Get{cds.FieldByName('Rec_Acc_Id').asString});
            xXml.LoadXML(
                Query.Run(
                    ' Select Ls.Account_Number, Ls.Id'
                   +' From OrgAccount Ls'
                   +' Join Org O on O.Id = Ls.Org_Id'
                   +' Join OrgAccount Bs on Bs.Id = Ls.ExecuterAcc_Id'
                   +' Where Ls.Org_Id = ? and Bs.Id = ? and Ls.OrgAccType_Id = 5'
                   +'   and Ls.Close_Date is null and Ls.Budget_Flag = 0'));
          end;

        3: begin
            //Определяем список лицевых счетов открытых на б/с счете получателя 24 класса
            Query.AddStr( CDSListField_Org_Id_Get{cds.FieldByName('Org_Id').AsString});
            Query.AddStr( CDSListField_Rec_Acc_Id_Get{cds.FieldByName('Rec_Acc_Id').asString});
            xXml.LoadXML(
                Query.Run(
                    ' Select Ls.Account_Number, Ls.Id'
                   +' From OrgAccount Ls'
                   +' Join Org O on O.Id = Ls.Org_Id'
                   +' Join OrgAccount Bs on Bs.Id = Ls.KeeperAcc_Id'
                   +' Where Ls.Org_Id = ? and Bs.Id = ? and Ls.OrgAccType_Id = 1'
                   +'   and Ls.Close_Date is null and Ls.Budget_Flag = 0'));
          end;

      end;//case//

      // анализируем результат поиска счета
      case aModeResult of
        1:  if not isSearchAccount( xXml) then begin
              CDSListField_Message(
                  'Не удалось получить счет из наименования получателя или'
                 +' назначения платежа');
              aUnclassified := True;
            end;

        2:  if not isSearchAccount( xXml) then begin
              CDSListField_Message(
                  'Не удалось получить счет по наименованию получателя из выписки');
              aUnclassified := True;
            end;

        3:  if (xXml.documentElement.childNodes.Length = 0) then begin
              CDSListField_Message(
                  'Лицевой счет у организации получателя из выписки не найден в базе');
              aUnclassified := True;
            end else
              if not isSearchAccount( xXml) then begin
                CDSListField_Message(
                    'Не удалось получить счет из наименования получателя из выписки');
                aUnclassified := True;
              end;


      end;//case//

      Result := TRUE;
      except
        ExceptionProc( 'DoSearchOrgAccount');
    end;

end;


function DoGetCodesFromSysParams: boolean;
var
  xXml: variant;
begin

    try
      Result := FALSE;

      //получает данные по кодам для неклассифицированных из системных параметров
      xXml := GetValueFromSysparam('aubu.unclassified.rules.' + CDSListField_Budget_Id_Get);
        //cds.FieldByName('Budget_Id').asString);
      if VarIsNull( xXml) then begin
        CDSListField_MessageFormat(
                'Зачисление неклассифицированных, причина: %ResText%. '
               +'Контроль не пройден: Не задана настройка классификации для невыясненных');
        Exit;
      end;

      xXml := xXml.documentElement;
      if ((xXml.getAttribute('KESR_CODE') <> '')
           and (xXml.getAttribute('KSDA_CODE') <> '')
           and (xXml.getAttribute('INDUSTRYCODE_ID') <> '')
           and (xXml.getAttribute('FSR_ID') <> ''))
        then begin
          CDSListField_Kesr_Code( xXml.getAttribute('KESR_CODE'));
          CDSListField_Ksda_Code( xXml.getAttribute('KSDA_CODE'));
          CDSListField_Industrycode_Id( xXml.getAttribute('INDUSTRYCODE_ID'));
          CDSListField_Fsr_Id( xXml.getAttribute('FSR_ID'));
          // exchange #2706 - вместе с ID прописываем и отр.код. по ID
          CDSListField_Industry_Code(
              QueryField( 'Select I.Code N From IndustryCode I Where I.Id = ?',
                          [ xXml.getAttribute('INDUSTRYCODE_ID')],
                          'N'));
      end else begin
        CDSListField_MessageFormat(
                'Зачисление неклассифицированных, причина: %ResText%. '
               +'Контроль не пройден: Не заполнена настройка классификации для невыясненных');
        Exit;
      end;

      Result := TRUE;
      except
        ExceptionProc( 'DoGetCodesFromSysParams');
    end;

end;


{~DoUnclassified
  формирование данных неклассифицированых поступлений.}
function DoUnclassified: boolean;
var
  xXml: variant;
  xFound: boolean;
begin

    try
      Result := FALSE;

      Query.AddStr( CDSListField_Id_Get{cds.FieldByName('Id').asString});
      xXml := vXML_Doc;//CreateOleObject('Microsoft.XmlDom');
      xXml.LoadXML(
          Query.Run(
              'Select O.Id Unclass_Org_Id, O.Taxcode Unclass_Org_Taxcode,'
             +'   O.Kpp Unclass_Org_Kpp, O.Description Unclass_Org_Name,'
             +'   Oa.Id Ls_Id,Oa.Account_Number Ls_Number'
             +' From Payorder P'
             // бухгалтерия/бух.счета/счета бюджета
             +' Join BudgetOrgAccount B on P.Rec_Acc_Id = B.OrgAccount_Id'
             +'   and P.Budget_Id = B.Budget_Id'
             +' Join OrgAccount Oa on Oa.Id = B.Unclassified_Id'
             +' Join Org O on O.Id = Oa.Org_Id'
             +' Where P.Id = ? and B.BudgetOrgAccountType_Id = 1'));

      xFound := FALSE;
      if (xXml.documentElement.childNodes.Length = 1) then begin
        xXml := xXml.documentElement.childNodes.Item[0];
        if (xXml.getAttribute('LS_ID') <> '') then begin
          xFound := TRUE;
          CDSListField_Unclass_Org_Id( xXml.GetAttribute('UNCLASS_ORG_ID'));
          CDSListField_Unclass_Org_Taxcode( xXml.GetAttribute('UNCLASS_ORG_TAXCODE'));
          CDSListField_Unclass_Org_Kpp( xXml.GetAttribute('UNCLASS_ORG_KPP'));
          CDSListField_Unclass_Org_Name( xXml.GetAttribute('UNCLASS_ORG_NAME'));
          CDSListField_LS_Id( xXml.GetAttribute('LS_ID'));
          CDSListField_LS_Number( xXml.GetAttribute('LS_NUMBER'));
        end;
      end;

      if NOT xFound then begin
        CDSListField_MessageFormat(
                'Зачисление неклассифицированных, причина: %ResText%. '
               +'Контроль не пройден: Не заполнен лицевой счет для учета невыясненных');
        Exit;
      end;

      //получает данные по кодам для неклассифицированных из системных параметров
      if NOT DoGetCodesFromSysParams then EXIT;

      // #2362 подставляем описание системного кода субсидии и инвестиции
      DoGrantInvestmentSetSystem;//( cds);

      CDSListField_Enroll( 1);
      CDSListField_Unclassified( 1);

      CDSListField_MessageFormat(
              'Зачисление неклассифицированных, причина: %ResText%');

      Result := TRUE;
      except
        ExceptionProc( 'DoUnclassified');
    end;

end;


procedure DoCheckOk;
begin

    try
      CDSListField_Enroll( 1);
      CDSListField_Unclassified( 0);
      {
      cds.Edit;
      cds.FieldByName('Enroll').AsInteger := 1;
      cds.FieldByName('Unclassified').AsInteger := 0;
      cds.Post;
      }
      CDSListField_Message('Контроль пройден');
      except
        ExceptionProc( 'DoCheckOk');
    end;

end;


{~DoCheckRecAccount_
  выполняется запрос поиска счета с одним параметром: ID.

  результат:
    NULL - счет не найден в бд.
    XML - счет определен

  код совпадает для:
    Тольятти
    Чел.область
    Екатеринбург}
function DoCheckRecAccount_( aSQL: string): boolean;
var
  xXml: variant;
begin

    try
      // один параметр в запросе - ид.эд 24го
      Query.AddStr( CDSListField_ID_Get{cds.FieldByName('Id').asString});

      xXml := vXML_Doc;//CreateOleObject('Microsoft.XmlDom');
      xXml.LoadXML( Query.Run( aSQL));
      if (xXml.documentElement.childNodes.Length = 1) then begin
        xXml := xXml.documentElement.childNodes.Item[0];
        if (xXml.GetAttribute('REC_ACC_ID') <> '') then begin
          CDSListField_Rec_Acc_Id( xXml.GetAttribute('REC_ACC_ID'));
          CDSListField_Rec_Id( xXml.GetAttribute('ORG_ID'));
          {
        cds.Edit;
        cds.FieldByName('Rec_Acc_Id').Value := Xml.Item[0].getAttribute('REC_ACC_ID');
        cds.FieldByName('Rec_Id').Value := Xml.Item[0].getAttribute('ORG_ID');
        cds.Post;
        }
          Result := TRUE;
          EXIT;
        end;
      end;

      CDSListField_Message(
            'Счет не совпадает со счетом для учета операций по БУ, АУ'
           +' или не найден в базе');

  
      Result := FALSE;
(*
  Query.AddStr( CDSListField_ID_Get{cds.FieldByName('Id').asString});
  Xml.LoadXML(Query.Run(sql));
  Xml := Xml.documentElement.childNodes;
  if (Xml.Length = 1) and (Xml.Item[0].getAttribute('REC_ACC_ID') <> '') then begin
    CDSListField_Rec_Acc_Id( Xml.Item[0].getAttribute('REC_ACC_ID'));
    CDSListField_Rec_Id( Xml.Item[0].getAttribute('ORG_ID'));
{
    cds.Edit;
    cds.FieldByName('Rec_Acc_Id').Value := Xml.Item[0].getAttribute('REC_ACC_ID');
    cds.FieldByName('Rec_Id').Value := Xml.Item[0].getAttribute('ORG_ID');
    cds.Post;
    }
  end else begin
    CDSListField_Message('Счет не совпадает со счетом для учета операций по БУ, АУ' +
      ' или не найден в базе');
    Exit;
  end;
*)
      except
        ExceptionProc( 'DoCheckRecAccount_');
    end;

end;


{~DoCheckRecAccount
  проверяются только документы, у которых счет получателя совпал со счетом
  указанным в справочнике Бухгалтерия-Настройка счетов, поле расчетный счет,
  тип счета "Счет для учета операций БУ/АУ".
  результат:
    NULL - счет не найден в бд.
    XML - счет определен

  код совпадает для:
    Тольятти
    Чел.область
    Екатеринбург}
function DoCheckRecAccount: boolean;
begin

    try

      Result := DoCheckRecAccount_(
                    'Select P.Rec_Acc_Id, Oa.Org_Id'
                   +' From Payorder P'
                   +' Join BudgetOrgAccount B on P.Rec_Acc_Id = B.OrgAccount_Id'
                   +'   and P.Budget_Id = B.Budget_Id'
                   +' Join OrgAccount Oa on Oa.Id = B.OrgAccount_Id'
                   +' Where P.Id = ? and B.BudgetOrgAccountType_Id = 1');
  (*
  sql :=  'Select P.Rec_Acc_Id, Oa.Org_Id'
         +' From Payorder P'
         +' Join BudgetOrgAccount B on P.Rec_Acc_Id = B.OrgAccount_Id'
         +'   and P.Budget_Id = B.Budget_Id'
         +' Join OrgAccount Oa on Oa.Id = B.OrgAccount_Id'
         +' Where P.Id = ? and B.BudgetOrgAccountType_Id = 1';
  *)
      except
        ExceptionProc( 'DoCheckRecAccount');
    end;

end;


{~DoCheckRecAccountGeneral
  если версия АЦК-Ф >= 2.26.46.1
    то: проверяются только документы, у которых счет получателя совпал со счетом
        указанным в справочнике Бухгалтерия-Настройка счетов, поле расчетный счет,
        тип счета "Счет для учета операций БУ/АУ"
    иначе:
        проверяются только документы, у которых счет получателя совпал со счетом
        для учета операций по БУ, АУ в справочнике бюджетов.

  результат:
    NULL - счет не найден в бд.
    XML - счет определен

  код совпадает для:
    General
    Рязань}
function DoCheckRecAccountGeneral: boolean;
begin

    try

      // exchange #3036 - оптимизация прверки версиии
      //  if AzkCompareVersion('2.26.46.1') >= 0 then
      if vIsAzkVersion2_26_46_1
        //проверяются только документы, у которых счет получателя совпал со счетом
        //указанным в справочнике Бухгалтерия-Настройка счетов, поле расчетный счет,
        //тип счета "Счет для учета операций БУ/АУ".
        then Result := DoCheckRecAccount_(
                           ' Select P.Rec_Acc_Id, Oa.Org_Id'
                          +' From Payorder P'
                          +' Join BudgetOrgAccount B on P.Rec_Acc_Id = B.OrgAccount_Id'
                          +'   and P.Budget_Id = B.Budget_Id'
                          +' Join OrgAccount Oa on Oa.Id = B.OrgAccount_Id'
                          +' Where P.Id = ? and B.BudgetOrgAccountType_Id = 1')
        //проверяются только документы, у которых счет получателя совпал со счетом
        //для учета операций по БУ, АУ в справочнике бюджетов.
        else Result := DoCheckRecAccount_(
                          ' Select P.Rec_Acc_Id, Oa.Org_Id'
                         +' From Payorder P'
                         +' Join Budget B on P.Rec_Acc_Id = B.AutonomAcc_Id'
                         +'                  and P.Budget_Id = B.Id'
                         +' Join OrgAccount Oa on Oa.Id = B.AutonomAcc_Id'
                         +' Where P.Id = ?');
      except
        ExceptionProc( 'DoCheckRecAccountGeneral');
    end;

end;


{~DoUnclassified_2_26_46_1_General

  режим:
    =1
      общий
      КОМИ
    =2
      рязанская обл.}
function DoUnclassified_2_26_46_1_General( aMode: integer): boolean;
var
  xXml: variant;
begin

    try
      Result := FALSE;

      // exchange #3036
      // добавлен бюджет в запрос
      Query.AddStr( CDSListField_Budget_Id_Get);    // #2872
      xXml := vXML_Doc;//CreateOleObject('Microsoft.XmlDom');
      xXml.LoadXML(
          Query.Run(
                ' Select Accountnumber_Mask Acc, Industrycode_Mask Code, Fsr_Id'
               +' From AubuclassifiersRules Where Unknown_Flag = 1'
                // exchange #2872 - добавлен бюджет в запрос
               +' and BUDGET_ID=?'));

      if (xXml.documentElement.childNodes.Length <> 1) then begin
        CDSListField_MessageFormat(
               'Зачисление неклассифицированных, причина: %ResText%. '
              +'Контроль не пройден: В правилах соответствия классификаторов'
              +' не найдено однозначно правила невыясненных поступлений');
        Exit;
      end;

      xXml := xXml.documentElement.childNodes.Item[0];
      CDSListField_LS_Number( xXml.getAttribute('ACC'));
      CDSListField_Fsr_Id( xXml.getAttribute('FSR_ID'));
      // для общего алгоритма и КОМИ
      if (aMode = 1)
        then CDSListField_Industry_Code( xXml.getAttribute('CODE'));


      //получаем Id лицевого счета
      xXml := vXML_Doc;// CreateOleObject('Microsoft.XmlDom');
      case aMode of
        1: begin
            Query.AddStr( CDSListField_Rec_Id_Get);
            Query.AddStr( CDSListField_Rec_Acc_Id_Get);
            Query.AddStr( CDSListField_LS_Number_Get);
            Query.AddStr( CDSListField_Rec_Id_Get);
            Query.AddStr( CDSListField_Rec_Acc_Id_Get);
            Query.AddStr( CDSListField_LS_Number_Get);
            xXml.LoadXML(
                  Query.Run(
                        'Select Ls.Id Acc_Id From OrgAccount Ls'
                       +' Join Org O on O.Id = Ls.Org_Id'
                       +' Join OrgAccount Bs on Bs.Id = Ls.KeeperAcc_Id'
                       +' Where Ls.Org_Id = ? and Bs.Id = ? and Ls.OrgAccType_Id = 1'
                       +'   and Ls.Close_Date is null and Ls.Budget_Flag = 0'
                       +' and Ls.Account_Number = ?'
                       +' Union'
                       +' Select Ls.Id Acc_Id From OrgAccount Ls'
                       +' Join Org O on O.Id = Ls.Org_Id'
                       +' Join OrgAccount Bs on Bs.Id = Ls.ExecuterAcc_Id'
                       +' Where Ls.Org_Id = ? and Bs.Id = ? and Ls.OrgAccType_Id = 5'
                       +'   and Ls.Close_Date is null and Ls.Budget_Flag = 0'
                       +' and Ls.Account_Number = ?'));
          end;

        2: begin
            //получаем Id лицевого счета
            Query.AddStr( CDSListField_Rec_Id_Get);
            Query.AddStr( CDSListField_Rec_Acc_Id_Get);
            Query.AddStr( CDSListField_LS_Number_Get);
            xXml.LoadXML(
                Query.Run(
                    ' Select Ls.Id Acc_Id From OrgAccount Ls'
                   +' Join Org O on O.Id = Ls.Org_Id'
                   +' Join OrgAccount Bs on Bs.Id = Ls.ExecuterAcc_Id'
                   +' Where Ls.Org_Id = ? and Bs.Id = ? and Ls.OrgAccType_Id = 5'
                   +'   and Ls.Close_Date is null and Ls.Budget_Flag = 0'
                   +' and Ls.Account_Number = ?'));
          end;


      end;//case//

      if (xXml.documentElement.childNodes.Length <> 1) then begin
        CDSListField_MessageFormat(
               'Зачисление неклассифицированных, причина: %ResText%. '
              +'Контроль не пройден: Не найден лс по правилу соответствия для'
              +' невыясненных поступлений');
        Exit;
      end;

      xXml := xXml.documentElement.childNodes.Item[0];
      CDSListField_LS_Id( xXml.getAttribute('ACC_ID'));


      // проверка отраслевого кода на присутсвие в базе
      // для общего алгоритма и КОМИ
      if (aMode = 1) then begin
        Query.AddStr( CDSListField_Budget_Id_Get);
        Query.AddStr( CDSListField_Industry_Code_Get);

        xXml := vXML_Doc;//CreateOleObject('Microsoft.XmlDom');
        xXml.LoadXML(
            Query.Run(
                  'Select I.Id From IndustryCode I'
                 +' Where I.Budget_Id = ? and I.Org_Id = 0 and I.Code = ?'));

        if (xXml.documentElement.childNodes.Length <> 1) then begin
          CDSListField_MessageFormat(
                'Зачисление неклассифицированных, причина: %ResText%. '
               +'Контроль не пройден: Не найден отраслевой код'
               +' по правилу соответствия для невыясненных поступлений');
          Exit;
        end;

        xXml := xXml.documentElement.childNodes.Item[0];
        CDSListField_IndustryCode_Id( xXml.getAttribute('ID'));
      end;


      CDSListField_Enroll( 1);
      CDSListField_Unclassified( 1);
{
      cds.Edit;
      cds.FieldByName('Enroll').AsInteger := 1;
      cds.FieldByName('Unclassified').AsInteger := 1;
      cds.Post;
      }
      CDSListField_MessageFormat(
            'Зачисление неклассифицированных, причина: %ResText%');

      Result := TRUE;
      except
        ExceptionProc( 'DoUnclassified_2_26_46_1_General');
    end;

end;


function SearchIndustrycode_KOMI( aSysIndustryCode: string;
                                  var aUnclassified: boolean): boolean;
var
  xXml: variant;
begin

    try
      Result := FALSE;

      xXml := vXML_Doc;//CreateOleObject('Microsoft.XmlDom');

      // exchange #2706
      // сверяем код с системным. если он не совпадает, то ищется в бд
      // код связанный с орг, так и не связанный.
      // это не совсем верно, поскольку если в бд есть и системный 0й код,
      // и нулевой код, но заведенный как не системный, то такой код будет
      // найден дважды. в основном алгоритме для этого общий запрос (с union)
      // разделяли на два подзапроса.
      if CDSListField_Industry_Code_Get <> aSysIndustryCode then begin
        Query.AddStr( CDSListField_Budget_Id_Get);
        Query.AddStr( CDSListField_Org_Id_Get);
        Query.AddStr( CDSListField_Industry_Code_Get);
        Query.AddStr( CDSListField_Budget_Id_Get);
        Query.AddStr( CDSListField_Industry_Code_Get);
        xXml.LoadXML(
              Query.Run(
                  ' Select I.Id From IndustryCode I'
                 +' Join Org O on O.Manager_Id = I.Org_id'
                 +' Where I.Budget_Id = ? and O.Id = ? and I.Code = ?'
                 +' Union'
                 +' Select I.Id From IndustryCode I'
                 +' Where I.Budget_Id = ? and I.Org_Id = 0 and I.Code = ?'));
      end else begin
        Query.AddStr( CDSListField_Budget_Id_Get{cds.FieldByName('Budget_Id').AsString});
        Query.AddStr( CDSListField_Industry_Code_Get{cds.FieldByName('Industry_Code').AsString});
        xXml.LoadXML(
              Query.Run(
                  ' Select I.Id From IndustryCode I'
                 +' Where I.Budget_Id = ? and I.Org_Id = 0 and I.Code = ?'));
      end;

      if xXml.documentElement.childNodes.Length = 1
        then CDSListField_Industrycode_Id(
                    xXml.documentElement.childNodes.Item[0].getAttribute('ID'))
        else
          // exchange #2706
          // проверяем индустр. код ЭД с системным
          if (CDSListField_Industry_Code_Get <> aSysIndustryCode) then begin
            CDSListField_Industry_Code( aSysIndustryCode);

            Query.AddStr( CDSListField_Budget_Id_Get);
            Query.AddStr( CDSListField_Industry_Code_Get);

            xXml := vXML_Doc;//CreateOleObject('Microsoft.XmlDom');
            xXml.LoadXML(
                Query.Run(
                    ' Select I.Id From IndustryCode I'
                   +' Where I.Budget_Id = ? and I.Org_Id = 0 and I.Code = ?'));

            if (xXml.documentElement.childNodes.Length = 1)
              then CDSListField_Industrycode_Id(
                      xXml.documentElement.childNodes.Item[0].getAttribute('ID'))
              else begin
                CDSListField_Message('Не найден ID системного отраслевого кода с нулевым значением');
                aUnclassified := True;
              end;
          end else begin
            CDSListField_Message('Не найден ID системного отраслевого кода с нулевым значением');
            aUnclassified := True;
          end;

      Result := TRUE;
      except
        ExceptionProc( 'SearchIndustrycode_KOMI');
    end;

end;


begin
end.
