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