Почему в запросе 1С возникает ошибка «Неверные параметры "/"» и как её исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При разработке алгоритмов расчета заработной платы и начислений в платформе 1С:Предприятие разработчики часто обращаются к виртуальным таблицам регистров расчета, таким как ДанныеГрафика или БазаОсновныеНачисления. Нередко при попытке выполнить арифметические вычисления (деление, умножение, вычитание) платформа выдает синтаксическую ошибку вида:

{(...)}: Неверные параметры "/" ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия (или с указанием другого математического оператора "-", "+", "*").

Рассмотрим подробно, почему возникает такое поведение, как диагностировать проблему и как правильно настроить объекты конфигурации и текст запроса.

Анализ проблемы и поведение синтаксического анализатора

Разберем типичный пример расчетного запроса, в котором проявляется данная ошибка:


ВЫБРАТЬ
    ВЫБОР
        КОГДА ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия = 0
            ТОГДА 0
        ИНАЧЕ ОсновныеНачисленияДанныеГрафика.Размер / ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия * ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия
    КОНЕЦ КАК Результат,
    ОсновныеНачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
ИЗ
    РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(
        ВидРасчета = &Оклад
            И Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика

На первый взгляд кажется, что в запросе предусмотрена защита от деления на ноль с помощью конструкции ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Однако платформа все равно прерывает выполнение с ошибкой неверных параметров. Более того, при попытке открыть такой текст в Конструкторе запросов платформа сразу выдает сообщение об ошибке и не позволяет визуально редактировать запрос.

Выясним главную причину: ошибка «Неверные параметры» генерируется синтаксическим анализатором 1С на этапе трансляции и компиляции запроса, а не в момент получения фактических строк из СУБД. Это означает, что один из операндов операции деления (или вычитания) в дереве метаданных конфигурации имеет нечисловой тип (например, Строка, СправочникСсылка или составной тип).

Проанализируем простую проверку: если в выражении ОсновныеНачисленияДанныеГрафика.Размер поле выводится без арифметики, запрос работает. Но как только мы пишем ОсновныеНачисленияДанныеГрафика.Размер - 1 или ... / ..., парсер определяет, что тип поля в метаданных — Строка, и запрещает операцию.

Пошаговый алгоритм устранения ошибки

  1. Проверяем типы реквизитов регистра расчета:

    Откроем дерево метаданных в конфигураторе, найдем нужный регистр расчета (например, РегистрРасчета.ОсновныеНачисления) и проверим ветку Реквизиты. Убедимся, что реквизит Размер (или тарифная ставка) имеет тип Число с необходимой точностью (например, Длина 15, Точность 2). При создании новых объектов платформа по умолчанию подставляет тип Строка(10), если разработчик забыл переключить тип данных.

  2. Проверяем типы ресурсов регистра графика:

    Поля ЗначениеПериодДействия и ЗначениеФактическийПериодДействия формируются на основе ресурсов связанного регистра сведений (графика работы). Откроем регистр сведений графика и проверим тип ресурса (например, Часы или Дни). Он обязательно должен быть числовым.

  3. Явное приведение типов с помощью функции ВЫРАЗИТЬ:

    Если поле в регистре или таблице источника имеет составной тип данных, анализатор запроса не сможет выполнить арифметику без явного сужения типа. В этом случае используем конструкцию ВЫРАЗИТЬ():

    ВЫРАЗИТЬ(ОсновныеНачисленияДанныеГрафика.Размер КАК Число(15, 2))
  4. Комплексная защита от NULL и деления на 0:

    Когда типы данных в метаданных исправлены, необходимо обеспечить устойчивость запроса к отсутствию строк в графике (когда виртуальная таблица возвращает NULL). Применим функцию ЕСТЬNULL() для всех операндов:

    
    ВЫБРАТЬ
        ВЫБОР
            КОГДА ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) = 0
                ТОГДА 0
            ИНАЧЕ ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.Размер, 0) 
                / ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия 
                * ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0)
        КОНЕЦ КАК Результат,
        ОсновныеНачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
    ИЗ
        РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(
            ВидРасчета = &Оклад
                И Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика
    

Важные нюансы при переносе кода между конфигурациями

Если запрос безупречно выполнялся в одной базе (например, в рабочей), но перестал работать после переноса в тестовую копию или новую базу, проанализируем следующие моменты:

  1. Неполный перенос метаданных: при ручном создании структуры регистров тип реквизита мог остаться строковым по умолчанию.
  2. Связь с графиком: проверьте свойства регистра расчета на закладке Основные — корректно ли указан График, Связь с графиком и Период действия.
  3. Индикатор ошибки: помните, что если запрос не открывается в Конструкторе запросов — проблема кроется исключительно в метаданных или именах полей, а не в записанных в базу значениях.

Таким образом, своевременная проверка описания типов в дереве метаданных и корректное использование числовых полей полностью устраняют ошибку «Неверные параметры» при выполнении расчетных запросов.

← На главную