Ошибка PostgreSQL 22003 numeric_value_out_of_range: переполнение чисел
СУБД прерывает выполнение операции при попытке записать числовое значение, выходящее за границы допустимого диапазона типа данных:
ERROR: integer out of range
-- либо:
ERROR: numeric field overflow
DETAIL: A field with precision 10, scale 2 must round to an absolute value less than 10^8.
SQLSTATE: 22003В информационных базах 1С ошибка часто возникает при расчете себестоимости, проведении закрытия месяца, вычислении остатков регистра накопления или переполнении последовательности нумераторов.
1. Анализ диапазона типов данных в PostgreSQL
| Тип данных | Хранение | Минимальное значение | Максимальное значение |
|---|---|---|---|
smallint | 2 байта | -32,768 | +32,767 |
integer | 4 байта | -2,147,483,648 | +2,147,483,647 |
bigint | 8 байт | -9,223,372,036,854,775,808 | +9,223,372,036,854,775,807 |
numeric(p, s) | переменная | Определяется точностью (p) и масштабом (s) | |
2. Проверка последовательностей (Sequences) на исчерпание пула ID
SELECT sequencename, last_value, max_value, is_cycled
FROM pg_sequences
WHERE last_value >= max_value - 10000;3. Миграция поля с INTEGER на BIGINT
-- Изменение типа колонки первичного ключа
ALTER TABLE "my_table" ALTER COLUMN "id" TYPE bigint;
-- Изменение последовательности автоинкремента
ALTER SEQUENCE my_table_id_seq AS bigint MAXVALUE 9223372036854775807;4. Исправление переполнения точности Numeric в 1С:Предприятие
- Найдите соответствующий ресурс регистра или реквизит документа в метаданных 1С.
- Увеличьте параметр Длина (общая точность) с сохранением нужной Точности (количество знаков после запятой).
- Если ошибка возникает внутри запроса СКД/расчета, используйте явное округление или приведение типов:
CAST(Выражение КАК ЧИСЛО(18, 2)).
Частые вопросы (FAQ)
Что делать, если исчерпался serial (int4) первичного ключа крупной таблицы?
Необходимо изменить тип на bigint. Для больших production-таблиц во избежание многочасовой эксклюзивной блокировки миграцию производят созданием новой таблицы с переливом данных через логическую репликацию или утилиту pg_repack.
Почему при делении чисел с плавающей точкой возникает ошибка 22003?
Если результат промежуточного умножения перед делением превышает разрядность целевого NUMERIC(P,S), PostgreSQL вызывает numeric field overflow. Необходимо явно расширять разрядность промежуточных вычислений с помощью CAST(... AS numeric(30, 10)).
Как предотвратить падение сервисов при приближении sequences к максимуму?
Настройте мониторинг в Prometheus/Zabbix через запрос к представлению pg_sequences: percent_used = (last_value::float / max_value::float) * 100 и установите алерт на пороге 85%.
Какова максимальная точность (precision) для типа NUMERIC в PostgreSQL?
В PostgreSQL тип numeric может хранить числа с точностью до 1000 десятичных знаков. Ограничения обычно диктуются клиентским приложением (в 1С максимальная разрядность чисел ограничена 38 знаками).