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