Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

22012 1С:Предприятие и СУБД

Ошибка PostgreSQL 22012 division_by_zero: деление на ноль в запросах

Обновлено: 26.08.2026 · Официальная документация ↗

СУБД возвращает ошибку при попытке выполнения арифметической операции деления на ноль:

ERROR: division by zero
SQLSTATE: 22012

В 1С сбой прерывает формирование отчетов на базе СКД, выполнение регламентных заданий расчета себестоимости и закрытия счетов, где в знаменателе оказывается нулевое количество товара или нулевая база распределения.

1. Безопасное деление в SQL через NULLIF

Функция NULLIF(val1, val2) возвращает NULL, если val1 = val2. В PostgreSQL деление на NULL дает NULL без генерации исключения:

-- Запрос, вызывающий ошибку:
SELECT total_sum / quantity FROM sales;

-- Безопасный запрос с возвратом NULL при quantity = 0:
SELECT total_sum / NULLIF(quantity, 0) FROM sales;

-- Безопасный запрос с подстановкой дефолтного значения 0 через COALESCE:
SELECT COALESCE(total_sum / NULLIF(quantity, 0), 0) FROM sales;

2. Использование конструкции CASE WHEN

SELECT 
  id,
  CASE 
    WHEN quantity IS NULL OR quantity = 0 THEN 0
    ELSE total_sum / quantity
  END AS unit_price
FROM sales;

3. Исправление в отчетах и коде 1С:Предприятие

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

// Запрос 1С
ВЫБРАТЬ
    Продажи.Номенклатура,
    ВЫБОР
        КОГДА Продажи.Количество = 0 ТОГДА 0
        ИНАЧЕ Продажи.Сумма / Продажи.Количество
    КОНЕЦ КАК СредняяЦена
ИЗ
    РегистрНакопления.Продажи КАК Продажи

4. Обработка в схемах компоновки данных (СКД)

В выражениях полей ресурсов СКД применяйте выражение:

Выбор Когда Количество = 0 Тогда 0 Иначе Сумма / Количество Конец
💡 Практика специалистов: При разработке запросов для СУБД PostgreSQL в 1С всегда оборачивайте расчет цен и коэффициентов в конструкцию ВЫБОР ... КОГДА. В отличие от файловой базы, где деление на 0 может возвращать неопределенное значение в некоторых контекстах, PostgreSQL всегда аварийно прерывает транзакцию.

Частые вопросы (FAQ)

Почему PostgreSQL не возвращает Infinity при делении на ноль?

В соответствии со стандартом ANSI SQL деление целых чисел и чисел с фиксированной точкой (numeric) на ноль обязано вызывать исключение SQLSTATE 22012. Значения 'Infinity' и '-Infinity' допустимы только для чисел с плавающей запятой типов float4 / float8 (IEEE 754 standard).

Как глобально заставить PostgreSQL игнорировать division by zero?

В PostgreSQL нет серверной настройки для отключения проверки деления на ноль. Все подобные операции обязаны обрабатываться на уровне кода запроса с помощью NULLIF или CASE.

Что эффективнее по производительности: NULLIF или CASE WHEN?

Конструкция NULLIF(a, 0) транслируется планировщиком в оптимизированное выражение сравнения и выполняется быстрее, чем полная ветка CASE WHEN, при этом делая SQL-код более лаконичным.

Как деление на ноль влияет на общую транзакцию в PostgreSQL?

Любое необработанное деление на ноль переводит текущую транзакцию в статус ERROR. Все последующие запросы внутри этой транзакции будут отклоняться с кодом 25P02 (current transaction is aborted) до выполнения ROLLBACK.

Полезные материалы
Рекомендуем