//Exchange #2291
function CheckPayOrder_ChelObl: Boolean;
var
  Unclassified: Boolean;
  xKESR: string;
  xPi_Budget_Code: string;
begin

    try
      Result := False;

      if NOT vIsAzkVersion2_26_46_11 then begin
        CDSListField_Message('Модуль проверки работает начиная с версии АЦК-Финансы 2.26.46.11');
        Exit;
      end;

      //проверяются только документы, у которых счет получателя совпал со счетом
      //указанным в справочнике Бухгалтерия-Настройка счетов, поле расчетный счет,
      //тип счета "Счет для учета операций БУ/АУ".
      if NOT DoCheckRecAccountGeneral then EXIT;

      CDSListField_Enroll( NULL);

      //устанавливаем флаг неклассифицированных поступлений
      Unclassified := False;

      //определяет Id получателя из выписки
      if NOT DoCheckOrg( Unclassified) then EXIT;

      //лс
      if (not Unclassified) then
        //Определяем список лицевых счетов открытых на б/с счете получателя 24 класса
        if NOT DoSearchOrgAccount( 1, 3, Unclassified)
          then EXIT;

      //инициализирует значения косгу и кода субсидии
      CDSListField_Kesr_Code( '');
//      CDSListField_GrantInvestment_Code( '');

      // сброс полей описания кода субсидии
      DoResetGrantInvestment;//( cds);

      //получает КОСГУ
      // exchange #2474
      // убираем определение косгу из идентификатора платежа - искать нужно
      // только в назначении.
      // exchange #2766
      // восстановлено получение косгу из назначения платежа (поле 104)
      xKESR := '';
      if (not Unclassified) then begin
        xPi_Budget_Code := CDSListField_Pi_Budget_Code_Get;
        // если в назначении платежа указан только один нуль,
        // то считаем что строка назначения платежа не заполнена.
        if (xPi_Budget_Code = '0') then xPi_Budget_Code := '';
        // если строка назначения платежа содержит >=18 символов, берем последние
        // три символа, начиная с 18го. концевые пробелы не считаем.
        // считается, что строка назначения платежа может содержать произвольное
        // число символов: от 0 до 20 символов.
        if (LENGTH( xPi_Budget_Code) >= 18) then begin
          xKESR := TRIM( Copy(xPi_Budget_Code, 18, LENGTH( xPi_Budget_Code) - 17));
          // дополняем строку до 3х символов нулями справа
          while (LENGTH( xKESR) < 3) do xKESR := xKESR + '0';
          // если все символы содержат символ "0" тогда код КОСГУ считается
          // не указанным
          if (LENGTH( StringReplace( xKESR, '0', '')) <= 0)
            then xKESR := '';
          // если КОСГУ выделен из назначения платежа, то сохраняем его в ЭД
          if (LENGTH( xKESR) > 0) then begin
            CDSListField_Kesr_Code( xKESR);
          end;
        end;
      end;

      // exchange #2766
      // только в случае, если в назначении платежа получить не удалось,
      // ищем косгу в назначении.
      if (not Unclassified) then
        if (LENGTH( xKESR) <= 0) then
          if (not isParceDescription_ChelObl( 'косгу')) then begin
            CDSListField_Message('Не удалось получить КОСГУ из назначения платежа');
            Unclassified := True;
          end;

      //проверяет полученный косгу
      // exchange #2627 - расширенная проверка КОСГУ с учетом символьных КБК
      // если косгу не указан, он будет заменен на системный код 0.
      if not Unclassified then
        if NOT CheckKES//( cds)
          then Unclassified := TRUE;

      //получает код субсидии
      if (not Unclassified) then begin
        if (Copy(CDSListField_LS_Number_Get, 3, 1) in ['4', '5', '6']) then begin
          if not isParceDescription_ChelObl( 'код субсидии') then begin
            CDSListField_Message('Не удалось получить код субсидии из назначения платежа');
            Unclassified := True;
          end else begin
            if StringReplace(CDSListField_GrantInvestment_Code_Get, '0', '') = '' then begin
              CDSListField_Message('В назначении платежа указан нулевой код субсидии');
              Unclassified := True;
            end;
          end;
        end else begin
          // exchange #2367 получает Id системного(0-го) кода субсидии и инвестиции
          DoGrantInvestmentSetSystem;//( cds);
        end;
      end;

      //проверка кода субсидии
      if (not Unclassified) then
        if DoGrantInvestmentValidate( FALSE)
          then Unclassified := True;

      //КВФО
      if (not Unclassified) then
        // Exchange #2367
        if DoSearchMatchLS_ChelObl//( cds)
          then Unclassified := TRUE;

      //формирование данных неклассифицированых поступлений
      if Unclassified then begin
        if NOT DoUnclassified then EXIT;
        Result := True;
      end else begin
        DoCheckOk;
        Result := True;
      end;
      except
        ExceptionProc( 'CheckPayOrder_ChelObl');
    end;

end;
{------------------------------------------------------------------------------}
{~isParceDescription_ChelObl
//разбирает основание платежа.
//параметры:
//cds - набор данных
//keyword - ключевое слово
//MustBeSpace - должен быть пробел между ключевым словом и значением
//если в основании платежа не встречаются ключевые слова или встречаются более
//одного раза то False. В зависимости от ключевого слова заполняются поля в наборе
//данных}
function isParceDescription_ChelObl( aKeyword: String;
                                     aMustBeSpace: Boolean = True): Boolean;
begin

    try
      Result := ParceDescriptionCDS( aKeyword, aMustBeSpace);
      except
        ExceptionProc( 'isParceDescription_ChelObl');
    end;

end;
{------------------------------------------------------------------------------}
{~DoSearchMatchLS_ChelObl
  возвращает =true, если л/с не найден по маске.
  в этом случае ЭД нужно ставить на невыясненный.}
function DoSearchMatchLS_ChelObl: boolean;
  {----------------------------------------------------------------------------}
  function DoSearchMatchLS_( aSQLResult: string): boolean;
  var
    xXml: Variant;
    xRootXml: Variant;
    xNodeXml: Variant;
    i: integer;
  begin

      try
        Result := FALSE;
        xXml := vXML_Doc;//CreateOleObject('Microsoft.XmlDom');
        xXml.LoadXML( aSQLResult);
        xRootXml := xXml.documentElement;
        for i := 0 to xRootXml.childNodes.Length - 1 do begin
          xNodeXml := xRootXml.childNodes.Item[i];
          if (MatchesMask( CDSListField_LS_Number_Get,
                           xNodeXml.getAttribute('ACCOUNTNUMBER_MASK'))) then
            if not Result then begin
              Result := True;
              CDSListField_Fsr_Id( xNodeXml.getAttribute('FSR_ID'));
            end else begin
              Result := False;
              CDSListField_Message(
                 'Маска счета не совпадает с правилом соответствия классификаторов');
              Break;
            end;
        end;//for//
        except
          ExceptionProc( 'DoSearchMatchLS_');
      end;

  end;
  {----------------------------------------------------------------------------}
var
  sql: string;
  xFlag: boolean;
  isOneMask: boolean;
begin

    try
      //проверяем найденные счет и отраслевой код подпадает под маски
      sql := ' Select Accountnumber_Mask, Industrycode_Mask, Fsr_Id'
            +' From AubuclassifiersRules'
            // exchange #2872 - добавлен бюджет в запрос
            +' where BUDGET_ID=? ';

    //  if AzkCompareVersion('2.26.46.1') < 0
      if NOT vIsAzkVersion2_26_46_1
        then sql := sql + ' and Unknown_Flag = 0 ';

      { Exchange #2364
        Если код субсидии для строки  заполняется  значением, отличным от
        системного 0 «Не указан» (Код «0», наименование «Не указан»,
        Учредитель «Не указан», тип «Не указан»)}
      xFlag := FALSE;   // алгоритм 2
      if NOT DoGrantInvestmentCodeIsSystem{( cds)} then
        { если в поле «Тип субсидии» (GRANTINVESTMENTTYPE) которых указан тип,
          отличный от «Не указан» (3) - алгоритм 1}
        if (CDSListField_Grantinvestment_Type_Get <> '3')
          then xFlag := TRUE;   // алгоритм 1

      if xFlag then begin
        // алгоритм 1
        Query.AddStr( CDSListField_Budget_Id_Get);    // #2872
        Query.AddStr( CDSListField_Grantinvestment_Type_Get);
        isOneMask := DoSearchMatchLS_(
                          Query.Run(sql + ' and GrantinvestmentType = ?'));
      end else begin
        { алгоритм 2
          1)	Выбираются все правила, у которых в поле «Тип субсидии»
          (GRANTINVESTMENTTYPE) указан код с типом 3 «Не указан»}
        Query.AddStr( CDSListField_Budget_Id_Get);    // #2872
        isOneMask := DoSearchMatchLS_(
                          Query.Run(sql + ' and GrantinvestmentType = 3'));
        { 4)	Если, в результате выполнения пунктов 1-3 Алгоритма2 не было
          найдено подходящее правило, то пункты 2 и 3 Алгоритма2 выполняются
          для правил, у которых в поле «Тип субсидии» (GRANTINVESTMENTTYPE)
          указаны коды с типами 0, 1, 2.}
        if NOT isOneMask then begin
          Query.AddStr( CDSListField_Budget_Id_Get);    // #2872
          isOneMask := DoSearchMatchLS_(
                          Query.Run(sql + ' and GrantinvestmentType in (0,1,2)'));
        end;
      end;

      // если подходящего л/с не нашли - ПП не линкуется
      if isOneMask
        then Result := FALSE
        else begin
          if NOT DoGrantInvestmentCodeIsSystem{( cds)} then
            CDSListField_Message( 'Не найдены правила соответствия классификаторов' +
              ' по типу Кода субсидии или маска счета не совпадает с полученными' +
              ' правилами')
          else
            CDSListField_Message( 'Не найдены правила соответствия классификаторов' +
              ' или маска счета не совпадает с полученными правилами');
          Result := TRUE;
        end;
      except
        ExceptionProc( 'DoSearchMatchLS_ChelObl');
    end;

end;

begin
end.
