При создании отчетов в системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда добавление простых арифметических операций (сложения, вычитания) в вычисляемых полях приводит к пустому результату. Разберем по шагам, почему так происходит, как правильно обрабатывать значения NULL, настраивать условные конструкции и проверять заполненность параметров отчета.
Основная причина, по которой арифметическое выражение возвращает пустоту (значение NULL), заключается в том, что в одном из исходных полей содержится NULL. В языке выражений СКД любая арифметическая операция со значением NULL (например, 14 - NULL или NULL + 3) дает в результате NULL, который при выводе в отчет отображается как пустая ячейка.
Для гарантированного получения числового результата все числовые поля необходимо оборачивать в функцию ЕстьNull() (или ЕСТЬNULL()):
ЕстьNull(Остаток, 0) - ЕстьNull(Остаток1, 0)
Если значение в поле отсутствует или равно NULL, функция заменит его на указанный второй параметр — в данном случае 0, что позволит корректно выполнить математическую операцию.
Рассмотрим частую задачу: необходимо выделить в отдельную колонку только отрицательные результаты разницы двух полей. Посмотрим на типичную ошибку при составлении условного выражения:
// Ошибочный вариант: отсутствует ветка ИНАЧЕ
ВЫБОР
КОГДА (Есть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)
Проанализируем поведение полей в структуре отчета. Важно понимать разницу в расчетах:
Сумма(Поле), СКД сначала рассчитает разность в детальных записях, а затем сложит результаты. Если же требуется посчитать разность итоговых сумм группировок, выражение прописывается на вкладке «Ресурсы» в виде: Сумма(ЕстьNull(Остаток, 0)) - Сумма(ЕстьNull(Остаток1, 0)).Когда требуется выполнять расчет поля только при условии, что пользователь задал определенный параметр отчета, проверка вида &Параметр ЕСТЬ NULL работать не будет. В СКД незаполненный параметр обычно содержит значение Неопределено, пустую ссылку или значение по умолчанию, но не NULL.
Для проверки параметров в языке выражений СКД предусмотрена специализированная функция ЗначениеЗаполнено():
ВЫБОР
КОГДА ЗначениеЗаполнено(&Период)
ТОГДА ЕстьNull(Остаток, 0) - ЕстьNull(Остаток1, 0)
ИНАЧЕ 0
КОНЕЦ
Применение функции ЗначениеЗаполнено() позволяет корректно обрабатывать параметры любых типов (числа, даты, ссылки) без риска получить непредвиденные пустые ячейки в отчете.