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