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