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