При разработке алгоритмов расчета заработной платы и начислений в платформе 1С:Предприятие разработчики часто обращаются к виртуальным таблицам регистров расчета, таким как ДанныеГрафика или БазаОсновныеНачисления. Нередко при попытке выполнить арифметические вычисления (деление, умножение, вычитание) платформа выдает синтаксическую ошибку вида:
{(...)}: Неверные параметры "/" ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия (или с указанием другого математического оператора "-", "+", "*").
Рассмотрим подробно, почему возникает такое поведение, как диагностировать проблему и как правильно настроить объекты конфигурации и текст запроса.
Разберем типичный пример расчетного запроса, в котором проявляется данная ошибка:
ВЫБРАТЬ
ВЫБОР
КОГДА ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия = 0
ТОГДА 0
ИНАЧЕ ОсновныеНачисленияДанныеГрафика.Размер / ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия * ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия
КОНЕЦ КАК Результат,
ОсновныеНачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
ИЗ
РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(
ВидРасчета = &Оклад
И Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика
На первый взгляд кажется, что в запросе предусмотрена защита от деления на ноль с помощью конструкции ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ. Однако платформа все равно прерывает выполнение с ошибкой неверных параметров. Более того, при попытке открыть такой текст в Конструкторе запросов платформа сразу выдает сообщение об ошибке и не позволяет визуально редактировать запрос.
Выясним главную причину: ошибка «Неверные параметры» генерируется синтаксическим анализатором 1С на этапе трансляции и компиляции запроса, а не в момент получения фактических строк из СУБД. Это означает, что один из операндов операции деления (или вычитания) в дереве метаданных конфигурации имеет нечисловой тип (например, Строка, СправочникСсылка или составной тип).
Проанализируем простую проверку: если в выражении ОсновныеНачисленияДанныеГрафика.Размер поле выводится без арифметики, запрос работает. Но как только мы пишем ОсновныеНачисленияДанныеГрафика.Размер - 1 или ... / ..., парсер определяет, что тип поля в метаданных — Строка, и запрещает операцию.
Откроем дерево метаданных в конфигураторе, найдем нужный регистр расчета (например, РегистрРасчета.ОсновныеНачисления) и проверим ветку Реквизиты. Убедимся, что реквизит Размер (или тарифная ставка) имеет тип Число с необходимой точностью (например, Длина 15, Точность 2). При создании новых объектов платформа по умолчанию подставляет тип Строка(10), если разработчик забыл переключить тип данных.
Поля ЗначениеПериодДействия и ЗначениеФактическийПериодДействия формируются на основе ресурсов связанного регистра сведений (графика работы). Откроем регистр сведений графика и проверим тип ресурса (например, Часы или Дни). Он обязательно должен быть числовым.
Если поле в регистре или таблице источника имеет составной тип данных, анализатор запроса не сможет выполнить арифметику без явного сужения типа. В этом случае используем конструкцию ВЫРАЗИТЬ():
ВЫРАЗИТЬ(ОсновныеНачисленияДанныеГрафика.Размер КАК Число(15, 2))
Когда типы данных в метаданных исправлены, необходимо обеспечить устойчивость запроса к отсутствию строк в графике (когда виртуальная таблица возвращает NULL). Применим функцию ЕСТЬNULL() для всех операндов:
ВЫБРАТЬ
ВЫБОР
КОГДА ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) = 0
ТОГДА 0
ИНАЧЕ ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.Размер, 0)
/ ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия
* ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0)
КОНЕЦ КАК Результат,
ОсновныеНачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
ИЗ
РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(
ВидРасчета = &Оклад
И Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика
Если запрос безупречно выполнялся в одной базе (например, в рабочей), но перестал работать после переноса в тестовую копию или новую базу, проанализируем следующие моменты:
График, Связь с графиком и Период действия.Таким образом, своевременная проверка описания типов в дереве метаданных и корректное использование числовых полей полностью устраняют ошибку «Неверные параметры» при выполнении расчетных запросов.