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

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

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

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

PostgreSQL 22003: Error numeric field overflow при работе с 1С (Деление на ноль)

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

Типизация чисел в PostgreSQL и трансляция запросов 1С

Ошибка PostgreSQL 22003 (numeric_value_out_of_range или Error numeric field overflow) возникает, когда результат математического вычисления, агрегатной функции (СУММА) или явного приведения типов превышает допустимую размерность (precision/scale), выделенную для этого поля в таблице СУБД. В платформе 1С:Предприятие эта ошибка обычно всплывает при выполнении сложных аналитических отчетов (СКД) или при записи документов с неадекватными значениями цен/количеств. Бизнес-риски: невозможность провести закрытие месяца из-за копеечных погрешностей в расчетах себестоимости, которые вызывают переполнение разрядности.

Топология причин переполнения в 1С (22003)

Действие в коде 1СЧто происходит в PostgreSQLРезультат / Код ошибки
Деление на очень маленькое число (почти 0)Генерация числа с огромной дробной или целой частью, не влезающего в тип NUMERIC(15,2).22003 numeric field overflow
Агрегация (СУММА) огромных чиселПереполнение типа аккумулятора агрегатной функции (например, попытка сложить триллионы рублей в поле 15.2).22003 numeric_value_out_of_range
Функция ВЫРАЗИТЬ(Число КАК Число(10,2))Округление или отсечение, если исходное число было 9999999999.99.Транслятор 1С вызовет ошибку СУБД.

Устранение ошибки переполнения в запросах 1С

Сценарий 1: Безопасное деление и защита от нуля (Запросы 1С)

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

 ОПАСНО (Вызовет переполнение или Division by zero):
ВЫБРАТЬ (Выручка / Себестоимость) КАК Рентабельность

 БЕЗОПАСНО (Использование конструкции ВЫБОР):
ВЫБРАТЬ 
    ВЫБОР 
        КОГДА ЕСТЬNULL(Себестоимость, 0) = 0 ТОГДА 0 
        ИНАЧЕ Выручка / Себестоимость 
    КОНЕЦ КАК Рентабельность

Сценарий 2: Использование явного приведения типов (ВЫРАЗИТЬ)

Если в процессе расчетов появляются числа с бесконечными дробями (например, при распределении затрат 100 рублей на 3 базы), промежуточные результаты нужно жестко ограничивать.

 В запросе 1С принудительно ограничиваем разрядность (как в метаданных):
ВЫБРАТЬ
    ВЫРАЗИТЬ((СуммаЗатрат / 3) КАК Число(15, 2)) КАК СуммаРаспределенная
ИЗ ...

Сценарий 3: Проверка метаданных конфигурации

Если ошибка возникает при записи документа (а не при чтении запросом):

  1. Откройте Конфигуратор и найдите проблемный реквизит документа или ресурс регистра.
  2. Проверьте его свойства: Длина и Точность. По умолчанию 1С часто ставит Длина: 10, Точность: 0. Для финансовых показателей стандартами являются Длина: 15, Точность: 2.
  3. Увеличьте длину реквизита до необходимой (например, 15.2 или 19.3 для весовых товаров).

Типовые ошибки администраторов

  • Попытка изменить тип столбца напрямую в PostgreSQL (ALTER TABLE): Это приведет к несовпадению физической структуры СУБД с логическим кэшем метаданных сервера 1С. В результате 1С перестанет загружаться или выдаст критическую ошибку структуры БД. Меняйте типы только через Конфигуратор.
Расчет себестоимости в 1С:ERP падает с ошибками SQL?
Транслятор запросов 1С в PostgreSQL имеет свои нюансы при работе с типами NUMERIC. Аналитики и DBA ITSTM проведут рефакторинг алгоритмов закрытия месяца, устранят циклические ссылки при распределении затрат (СЛУ), избавив вашу базу от математических переполнений.
💡 Практика специалистов: Практика ITSTM: При построении отчетов в СКД, где используется вычисляемое поле, содержащее деление, разработчики часто забывают обработать нули. Для СКД лучшее решение — написать функцию в Общем модуле (например, 'БезопасноеДеление(Числитель, Знаменатель) Экспорт') и вызывать её прямо из выражений вычисляемых полей СКД.

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

Как тип 'Число' из 1С транслируется в PostgreSQL?

Поле типа 'Число(Длина, Точность)' транслируется в PostgreSQL как тип NUMERIC(Длина, Точность). Например, Число(15,2) станет NUMERIC(15, 2), что позволяет хранить числа до 9 999 999 999 999.99.

Почему в файловой базе 1С запрос работал, а на PostgreSQL падает с 22003?

Встроенная файловая СУБД 1С (1Cv8.1CD) более терпимо относится к динамическому изменению типов в промежуточных результатах вычислений. PostgreSQL строго типизирован. Если результат агрегации не влезает во внутренний буфер типа данных, PG немедленно прерывает транзакцию.

Что делать, если при выгрузке базы (.dt) в PostgreSQL возникает ошибка 22003?

Это означает, что в файловой базе или старой версии MS SQL хранились 'грязные данные', размерность которых превышает лимиты, заданные в метаданных (например, из-за прямых инъекций SQL). Перед переходом на PostgreSQL необходимо очистить базу от аномальных чисел (написав скрипт поиска по регистрам).

Поможет ли ВЫРАЗИТЬ(... КАК Число(32, 4))?

Да, максимальная точность числа в 1С (а следовательно и в трансляции NUMERIC) составляет 38 знаков. Использование больших аккумуляторов (32,4) для промежуточных расчетов спасет от переполнения (overflow).

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