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