Как исправить ошибку «Деление на 0» в отчете «Выручка» в 1С:Розница 2.3 при выборе произвольного периода?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

При работе с типовыми и доработанными отчетами в конфигурации 1С:Розница 2.3 пользователи часто сталкиваются с критической ошибкой: Ошибка в отчёте: Деление на 0. Значение типа Numeric. Характерной особенностью этой проблемы является то, что отчет может прекрасно формироваться с группировкой по месяцам или дням, но выдает ошибку при попытке указать произвольный период (например, с середины одного дня по середину другого) или при определенных фильтрах по номенклатуре.

В данной статье мы подробно разберем, почему возникает эта ситуация, проанализируем механизмы работы системы компоновки данных (СКД) и выясним, как внести исправления, чтобы отчет работал корректно в любых условиях.

Выясним причину возникновения ошибки

Рассмотрим природу ошибки. Сообщение Деление на 0 в контексте 1С означает, что в одном из математических выражений отчета знаменатель принял нулевое значение. В отчете «Выручка» (или «Продажи») такими выражениями обычно являются расчеты следующих показателей:

Проанализируем ситуацию, когда отчет работает «по месяцам», но падает при выборе «любой даты». При стандартных группировках (месяц, год) система агрегирует данные, и итоговое количество проданного товара практически всегда больше нуля. Однако, если мы выбираем произвольный период, в него могут попасть специфические документы, такие как «Возврат товаров от покупателя», по которым в текущем периоде еще не было совершено продаж. В этом случае в итоговой строке или в одной из группировок Количество становится равным нулю или даже отрицательным. Как только система пытается вычислить среднюю цену, происходит деление на ноль, и отчет «вылетает».

Способ 1: Быстрое решение для пользователя (без программирования)

Если проблему нужно решить «здесь и сейчас», а доступа к конфигуратору нет, разберем действия пользователя. Попробуем исключить поля, вызывающие ошибку, из настроек отчета.

  1. Откроем отчет «Выручка» и перейдем в меню Настройки (или Еще -> Изменить вариант).
  2. Переключимся в Расширенный режим настроек.
  3. Перейдем на закладку Поля.
  4. Найдем в списке показателей поля: Средняя цена, Рентабельность (%), Эффективность или любые другие поля, подразумевающие деление.
  5. Снимем с них галочки (отключим их отображение).
  6. Нажмем Завершить редактирование и попробуем сформировать отчет снова.

Если отчет сформировался без ошибок, значит, мы верно диагностировали проблемное поле. Однако этот способ лишь скрывает симптомы, не устраняя причину.

Способ 2: Исправление формул в Системе компоновки данных (СКД)

Для радикального решения проблемы нам потребуется изменить схему компоновки данных отчета. Рассмотрим, как правильно прописать проверку на ноль в формулах ресурсов или вычисляемых полей. Проанализируем стандартную конструкцию языка выражений СКД.

Вместо прямой формулы деления необходимо использовать условный оператор ВЫБОР. Рассмотрим пример для показателя Средняя цена.

Неправильно:

СуммаВыручкиОборот / КоличествоОборот

Правильно (безопасное деление):


ВЫБОР 
    КОГДА КоличествоОборот <> 0 
    ТОГДА СуммаВыручкиОборот / КоличествоОборот 
    ИНАЧЕ 0 
КОНЕЦ

Разберем по шагам, где именно вносить эти правки:

  1. Откроем отчет в Конфигураторе (или через внешнюю форму, если отчет внешний).
  2. Перейдем на закладку Ресурсы. Именно здесь чаще всего прописываются итоговые формулы.
  3. Найдем поле, вызывающее ошибку (например, СредняяЦена).
  4. В колонке Выражение заменим текущую формулу на конструкцию с ВЫБОР КОГДА, как показано в примере выше.
  5. Если в отчете используются Вычисляемые поля, проверим аналогичные формулы на соответствующей закладке.

Особенности работы с агрегатными функциями в ресурсах

Важно помнить, что в СКД на закладке «Ресурсы» выражения должны содержать агрегатные функции, такие как СУММА(). Посмотрим на пример корректного ресурса для расчета рентабельности:


ВЫБОР 
    КОГДА СУММА(Продажи.Выручка) <> 0 
    ТОГДА (СУММА(Продажи.Выручка) - СУММА(Продажи.Себестоимость)) / СУММА(Продажи.Выручка) * 100 
    ИНАЧЕ 0 
КОНЕЦ

В данном случае мы гарантируем, что даже если в группировке (например, по конкретному чеку или товару) сумма выручки окажется нулевой, система не попытается выполнить деление, а просто выведет 0.

Почему это актуально для «Розницы 2.3»?

Проанализируем специфику релизов. В версиях 2.3.4 и 2.3.5 «1С:Розница» наблюдался баг в типовой схеме отчета «Продажи» и «Выручка», где разработчики в некоторых полях забыли добавить проверку на вхождение нулевых значений. Это особенно часто проявлялось при оформлении чеков на возврат в день, отличный от дня продажи, или при использовании бонусных программ, когда товар мог иметь нулевую стоимость в определенных разрезах аналитики.

Совет: Если вы столкнулись с этой ошибкой, рекомендуется также проверить актуальность вашей конфигурации. В более поздних патчах и релизах (начиная с 2.3.10) большинство этих формул было переписано с учетом защиты от деления на ноль. Если обновление невозможно, воспользуйтесь описанным выше методом ручной правки СКД.

Итоги

Мы проанализировали проблему деления на ноль в отчетах «1С:Розница 2.3» и выяснили, что основной причиной является отсутствие проверки делителя на равенство нулю в выражениях ресурсов СКД. Для исправления ситуации необходимо:

Соблюдение этих правил позволит вашим отчетам работать стабильно при выборе любых периодов и настроек группировки.

← На главную