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