Как правильно использовать арифметические операции и условия в вычисляемых полях СКД

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

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

Причина 1: Неявное значение NULL в исходных полях

Основная причина, по которой арифметическое выражение возвращает пустоту (значение NULL), заключается в том, что в одном из исходных полей содержится NULL. В языке выражений СКД любая арифметическая операция со значением NULL (например, 14 - NULL или NULL + 3) дает в результате NULL, который при выводе в отчет отображается как пустая ячейка.

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

ЕстьNull(Остаток, 0) - ЕстьNull(Остаток1, 0)

Если значение в поле отсутствует или равно NULL, функция заменит его на указанный второй параметр — в данном случае 0, что позволит корректно выполнить математическую операцию.

Причина 2: Пропуск секции ИНАЧЕ в конструкции ВЫБОР КОГДА

Рассмотрим частую задачу: необходимо выделить в отдельную колонку только отрицательные результаты разницы двух полей. Посмотрим на типичную ошибку при составлении условного выражения:


// Ошибочный вариант: отсутствует ветка ИНАЧЕ
ВЫБОР 
    КОГДА (ЕстьNull(Остаток, 0) - ЕстьNull(Остаток1, 0)) < 0 
    ТОГДА ЕстьNull(Остаток, 0) - ЕстьNull(Остаток1, 0)
КОНЕЦ

Если условие после КОГДА не выполняется (разность больше либо равна нулю), а блок ИНАЧЕ опущен, СКД по умолчанию возвращает значение NULL. В результате в строках с положительным остатком вместо нуля будет пустота, что также может искажать расчет итогов по группировкам.

Правильный синтаксис требует обязательного указания значения по умолчанию:


ВЫБОР 
    КОГДА ЕстьNull(Остаток, 0) < ЕстьNull(Остаток1, 0) 
    ТОГДА ЕстьNull(Остаток, 0) - ЕстьNull(Остаток1, 0) 
    ИНАЧЕ 0 
КОНЕЦ

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

Min(ЕстьNull(Остаток, 0) - ЕстьNull(Остаток1, 0), 0)

Аналогично, если требуется отобрать только положительные значения, применима функция Max:

Max(ЕстьNull(Остаток, 0) - ЕстьNull(Остаток1, 0), 0)

Причина 3: Особенности вычисления на вкладках «Вычисляемые поля» и «Ресурсы»

Проанализируем поведение полей в структуре отчета. Важно понимать разницу в расчетах:

  1. Уровень детальных записей (вкладка «Вычисляемые поля»): выражение вычисляется для каждой строки выборки индивидуально.
  2. Уровень группировок (вкладка «Ресурсы»): если поле добавлено в ресурсы с выражением Сумма(Поле), СКД сначала рассчитает разность в детальных записях, а затем сложит результаты. Если же требуется посчитать разность итоговых сумм группировок, выражение прописывается на вкладке «Ресурсы» в виде: Сумма(ЕстьNull(Остаток, 0)) - Сумма(ЕстьNull(Остаток1, 0)).
  3. Если вычисляемое поле не добавлено на вкладку «Ресурсы», но выводится в группировках без детальных записей, оно будет отображаться пустым.

Проверка заполненности параметров отчета в выражениях

Когда требуется выполнять расчет поля только при условии, что пользователь задал определенный параметр отчета, проверка вида &Параметр ЕСТЬ NULL работать не будет. В СКД незаполненный параметр обычно содержит значение Неопределено, пустую ссылку или значение по умолчанию, но не NULL.

Для проверки параметров в языке выражений СКД предусмотрена специализированная функция ЗначениеЗаполнено():


ВЫБОР 
    КОГДА ЗначениеЗаполнено(&Период) 
    ТОГДА ЕстьNull(Остаток, 0) - ЕстьNull(Остаток1, 0) 
    ИНАЧЕ 0 
КОНЕЦ

Применение функции ЗначениеЗаполнено() позволяет корректно обрабатывать параметры любых типов (числа, даты, ссылки) без риска получить непредвиденные пустые ячейки в отчете.

← На главную