Как исправить синтаксическую ошибку в пользовательском поле отчета при делении на РазностьДат?

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

При настройке пользовательских и вычисляемых полей в отчетах на базе схемы компоновки данных (СКД) разработчики и аналитики часто сталкиваются с ошибкой Синтаксическая ошибка. Подобные ситуации возникают при расчете удельных показателей, нормализации данных за период или пересчете ставок, когда формула объединяет поля выборки, параметры и числовые коэффициенты. Разберем по шагам, почему возникает эта ошибка и как правильно составить расчетное выражение в СКД.

Причина ошибки: десятичный разделитель в числах

Проанализируем выражение, вызвавшее сбой:

Сумма / [Отработано часов] * [Отработано часов в периоде] / РазностьДат(&[Начало периода], &[Конец периода], "День")*30,41

Главная причина синтаксической ошибки здесь заключается в записи числа с плавающей точкой: 30,41. В языке выражений системы компоновки данных, как и во встроенном языке 1С, в качестве десятичного разделителя в числовых литералах допускается исключительно точка. Запятая воспринимается парсером как разделитель аргументов функций или элементов списка. Встретив запятую посреди арифметического действия, транслятор формул выдает сообщение о синтаксической ошибке.

Для исправления коэффициента заменим запятую на точку: 30.41.

Особенности синтаксиса выражений СКД и обращение к параметрам

Посмотрим на другие элементы формулы, которые могут вызвать проблемы при выполнении или формировании отчета:

  1. Обращение к полям и параметрам: Квадратные скобки [...] в выражениях СКД служат для экранирования имен полей набора данных, если они содержат пробелы. Параметры схемы задаются через знак амперсанда без квадратных скобок (например, &НачалоПериода, &КонецПериода). Имена параметров в СКД не должны содержать пробелов. Если в отчете используется стандартный период, обращение к датам выполняется через точку: &Период.ДатаНачала и &Период.ДатаОкончания.
  2. Синтаксис функции РазностьДат: В языке выражений СКД третий параметр функции РазностьДат передается обязательно как строковый литерал в кавычках (например, "День", "Месяц", "Час"). Если опустить кавычки (как это делается в текстах запросов), система воспримет слово как обращение к полю выборки и сообщит, что поле не найдено. В исходной формуле кавычки расставлены верно.
  3. Порядок дат в функции: Функция рассчитывает интервал по формуле Дата2 - Дата1. Если дата начала передана вторым аргументом, результат будет отрицательным. Первым аргументом всегда указывается начальная граница, а вторым — конечная.
  4. Учет границ периода: Если параметры заданы в пределах одного дня, РазностьДат(&ДатаНачала, &ДатаОкончания, "День") вернет 0. Если требуется рассчитать количество включенных календарных дней, к функции прибавляют единицу: (РазностьДат(&ДатаНачала, &ДатаОкончания, "День") + 1).

Предотвращение ошибки деления на ноль

Даже после исправления синтаксиса отчет может завершиться аварийно в процессе формирования, если один из делителей в знаменателе окажется равен нулю или значению NULL. В формуле присутствуют сразу два потенциальных источника ошибки:

  1. Поле [Отработано часов] может быть не заполнено (равно NULL) или равно нулю для сотрудников без зарегистрированного времени.
  2. Разность дат вернет ноль, если начало и конец периода совпадают.

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


ВЫБОР
    КОГДА ЕстьNull([Отработано часов], 0) = 0
        ИЛИ РазностьДат(&НачалоПериода, &КонецПериода, "День") = 0
    ТОГДА 0
    ИНАЧЕ Сумма / [Отработано часов] * [Отработано часов в периоде] / РазностьДат(&НачалоПериода, &КонецПериода, "День") * 30.41
КОНЕЦ

Альтернативные способы расчета: вычисляемые поля и запросы

Выясним причину, почему пользовательские поля в настройках отчета не всегда подходят для сложных расчетов:

  1. Расчет итогов и группировок: Пользовательское поле вычисляется построчно на уровне детальных записей. При выводе в группировку или в общие итоги СКД по умолчанию просто просуммирует результаты строк, что исказит итоговое среднее или нормализованное значение.
  2. Использование вычисляемых полей схемы: Более надежным подходом является вынос выражения на вкладку Вычисляемые поля в схеме компоновки данных. Это дает возможность настроить формулу агрегации на вкладке Ресурсы, выполняя расчет по итоговым суммам группировок, а не суммируя частные.
  3. Перенос вычислений в запрос: Если параметры отчета предопределены, разность дат и нормализацию показателей рекомендуется выполнять непосредственно в наборе данных «Запрос» с помощью функции РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ). Это повышает общую производительность отчета и исключает ошибки ручного ввода формул пользователями.
← На главную