Ошибка 1С: Деление на ноль в выражении запроса — Способы устранения
- Аварийное прерывание выполнения отчета на СКД или динамического списка:
{(Строка, Колонка)}: Ошибка в выражении: Деление на ноль. - В СУБД MS SQL ошибка транслируется как
Divide by zero error encountered (SQLSTATE 22012). - В PostgreSQL запрос завершается ошибкой:
ERROR: division by zero (SQLSTATE 22012). - Ошибка проявляется при расчете относительных показателей (себестоимость за единицу, процент наценки, средняя цена при нулевом количестве).
1. Безопасное деление через конструкцию ВЫБОР КОГДА
Все операции деления в запросах 1С должны оборачиваться в условную конструкцию, проверяющую знаменатель:
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.СуммаОборот КАК Сумма,
Продажи.КоличествоОборот КАК Количество,
ВЫБОР
КОГДА ЕСТЬNULL(Продажи.КоличествоОборот, 0) = 0 ТОГДА 0
ИНАЧЕ Продажи.СуммаОборот / Продажи.КоличествоОборот
КОНЕЦ КАК СредняяЦена
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи;2. Защита от деления на ноль в вычисляемых полях СКД
На вкладке Вычисляемые поля схемы компоновки данных используйте встроенную функцию Выбор Когда:
Выбор
Когда Количество = 0 Или Количество Есть Null Тогда 0
Иначе Сумма / Количество
Конец3. Обработка пользовательских полей и ресурсов СКД
На вкладке Ресурсы при расчете процента по группировкам используйте выражение с проверкой родительского итога:
Выбор
Когда ВычислитьВыражение("Сумма(СуммаОборот)", "ОбщийИтог") = 0 Тогда 0
Иначе Сумма(СуммаОборот) / ВычислитьВыражение("Сумма(СуммаОборот)", "ОбщийИтог") * 100
Конец Частые вопросы (FAQ)
Почему ЕСТЬNULL(Делитель, 0) не спасает от деления на ноль?
Функция ЕСТЬNULL заменяет только значение Null на указанный литерал (0). Если получен ноль, то операция деления на ноль все равно произойдет. Необходимо проверять условие через ВЫБОР КОГДА ... = 0 ТОГДА 0.
Как ведет себя СУБД, если деление на ноль происходит во вложенном условии?
Оптимизатор запросов SQL (как MS SQL, так и PostgreSQL Cost-Based Optimizer) может изменить порядок вычисления выражений и инициировать деление до фильтрации строк WHERE, что вызовет падение запроса.
Можно ли отключить ошибку деления на ноль на уровне SQL-сервера?
В MS SQL существует директива SET ARITHABORT OFF / SET ANSI_WARNINGS OFF, возвращающая NULL вместо ошибки, однако платформа 1С принудительно инициализирует соединения в строгом режиме ANSI, поэтому настройка на стороне 1С не поддерживается.
Как обработать возможное деление на ноль во встроенном языке?
Используйте тернарный оператор или условие: Результат = ?(Делитель = 0, 0, Делимое / Делитель);