function CheckPayOrder_RyazanObl: Boolean;
var
  sql: String;
  Xml: Variant;
  i: Integer;
  Unclassified, isOneMask: Boolean;
begin

    try
      Result := False;

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

      if NOT DoCheckRecAccountGeneral then EXIT;

      CDSListField_Enroll( NULL);

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

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

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

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

      //отраслевой код всегда 0
      // exchange #3036
      //поиск и подстановка нулевого отр.кода.
      SetNullIndustryCode;

      if (not Unclassified) and (CDSListField_Pi_Budget_Code_Get <> '') then begin
        //получает код субсидии из основания платежа, должен быть в скобках,
        //допустимо в любом месте назначения
        if not isParceDescription_RyazanObl then begin
          CDSListField_Message(
                  'Не удалось получить Код субсидии по основанию платежа');
          Unclassified := True;
        end;
        CDSListField_Kesr_Code( Copy( CDSListField_Pi_Budget_Code_Get, 18, 3));
      end else
        //104 поле не заполнено
        if (not Unclassified) and (CDSListField_Pi_Budget_Code_Get = '')
          then begin
            Unclassified := True;
            CDSListField_Message('Не заполнен идентификатор платежа');
          end else begin
            Unclassified := True;
          end;

      //проверяем полученные коды
      // exchange #2627 - расширенная проверка КОСГУ с учетом символьных КБК
      if not Unclassified then
        if NOT CheckKES//( cds)
          then Unclassified := TRUE
          else
            // в данном случае нулевой код КОСГУ не прокатит
            if (CDSListField_Kesr_Code_Get
                          = FormatKbk( 'KES', '0', CDSListField_Budget_Id_Get))
              then begin
                Unclassified := True;
                CDSListField_Message('КОСГУ равен 0');
              end;

      //Код субсидии
      if (not Unclassified) and (Trim(CDSListField_Grantinvestment_Code_Get) <> '')
        then begin
          if (CDSListField_Grantinvestment_Code_Get = '0') then begin
            // #2368 подставляем описание системного кода субсидии и инвестиции
            DoGrantInvestmentSetSystem;//( cds);
          end else begin
            // exchange #2368
            // получаем код субсидии из справочника
            if (DoSearchGrantInvestmentCode( FALSE) = 1)
              then DoUpdateGrantInvestmentType//( cds)
              else begin
                Unclassified := True;
                CDSListField_Message(
                    'Id кода субсидии ' + CDSListField_Grantinvestment_Code_Get
                   +', у организации-учредителя получателя из выписки,'
                   +' не найден в базе данных');
              end;
          end;
        end else
          if (not Unclassified) and (Trim(CDSListField_Grantinvestment_Code_Get) = '')
            then begin
              Unclassified := True;
              CDSListField_Message('Не удалось получить код субсидии');
            end;
        (*
        else Unclassified := True;
        *)

      //КВФО
      if not Unclassified then begin
        //проверяем найденные счет подпадает под маску
        sql := 'Select Accountnumber_Mask, Fsr_Id'
              +' From AubuclassifiersRules'
              +' Where GrantinvestmentType = ?'
               // exchange #2872 - добавлен бюджет в запрос
              +' and BUDGET_ID=? ';
        Query.AddStr( CDSListField_Grantinvestment_Type_Get);
        Query.AddStr( CDSListField_Budget_Id_Get);    // #2872

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

        Xml := vXML_Doc;// CreateOleObject('Microsoft.XmlDom');
        Xml.LoadXML(Query.Run(sql));

        Xml := Xml.documentElement;
        isOneMask := False;
        for i := 0 to Xml.childNodes.Length - 1 do begin
          Xml := Xml.childNodes.Item[i];
          if (MatchesMask( CDSListField_LS_Number_Get,
                           Xml.getAttribute('ACCOUNTNUMBER_MASK'))) then
            if not isOneMask then begin
              isOneMask := True;
              CDSListField_Fsr_Id( Xml.getAttribute('FSR_ID'));
            end else begin
              isOneMask := False;
              Break;
            end;
          Xml := Xml.parentNode;
        end;//for//
        Unclassified := not isOneMask;
        if Unclassified
          then CDSListField_Message(
                      'Не найдены правила соответствия классификаторов'
                     +' по типу Кода субсидии или маска счета не совпадает'
                     +' с полученными правилами');
      end;

      if Unclassified then begin
        if NOT vIsAzkVersion2_26_46_1 then begin
          if NOT DoUnclassified_2_26_46_1_General( 2)
            then EXIT;
          Result := True;
        end
        else begin
          // версия системы выше чем 2.26.46.1
          if NOT DoUnclassified then EXIT;
          Result := True;
        end;
      end else begin
        DoCheckOk;
        Result := True;
      end;
      except
        ExceptionProc( 'CheckPayOrder_RyazanObl');
    end;

end; {End CheckPayOrder}
{------------------------------------------------------------------------------}
//разбирает основание платежа, ищет код субсидии в скобках основания платежа.
//если скобки не встречаются или встречаются более одного раза то False
function isParceDescription_RyazanObl: Boolean;
var
  i, DescLength: Integer;
  Description: String;
  GrantInvestment_Code: String;
begin

    try
      Result := False;

      //Exchange #2253 если значение 1, во 2 разряде номера счета,
      //то ищем код субсидии, во всех остальных случаях не ищем, т.е. ставим 0
      if (Copy( CDSListField_Ls_Number_Get, 2, 1) <> '1') then begin
        // exchange #2368 системный код
        DoGrantInvestmentSetSystem;//( cds);
        (*
        cds.Edit;
        cds.FieldByName('GrantInvestment_Code').asString := '0';
        cds.Post;
        *)
        Result := True;
        Exit;
      end;

      GrantInvestment_Code := '';
      Description := CDSListField_Description_Get;//cds.FieldByName('Description').asString;
      DescLength := Length(Description);
      i := Pos('(', Description);

      if (i > 0) and (Pos('(', Copy(Description, i + 1, DescLength - i)) > 0)
        then Exit;         //дубль

      if (i > 0) then begin
        //увеличиваем индекс на 1, нужен следующие за скобкой символы
        Inc(i);
        if (i <= DescLength) and (Description[i - 1] = '(') then
          while (i <= DescLength) and (Description[i] <> ')') do begin
            GrantInvestment_Code := GrantInvestment_Code + Description[i];
            //проверка присутсвия закрывающей скобки в конце
            if (i = DescLength) and (Description[i] <> ')')
              then GrantInvestment_Code := '';
            inc(i);
          end;//while//
      end;

      Result := (Trim(GrantInvestment_Code) <> '');
      if Result
        then DoSetGrantInvestmentCode( GrantInvestment_Code)
        else CDSListField_Message(
                   'Не удалось получить код субсидии из назначения платежа');
      except
        ExceptionProc( 'isParceDescription_RyazanObl');
    end;

end;

begin
end.
