Ошибка PostgreSQL 22001 string_data_right_truncation: переполнение строки
СУБД возвращает ошибку при попытке записать текстовые данные, длина которых превышает объявленную размерность поля таблицы:
ERROR: value too long for type character varying(50)
SQLSTATE: 22001В платформе 1С:Предприятие сбой проявляется при проведении документов, загрузке данных через универсальный обмен XML/JSON или вызове методов Записать() справочников, когда длина реквизита в конфигурации меньше фактического размера строки.
1. Идентификация целевого поля и фактической длины
Определите таблицу и колонку, вызвавшую исключение, анализируя лог PostgreSQL (/var/log/postgresql/postgresql-*.log). Выполните проверку структуры таблицы:
SELECT table_name, column_name, character_maximum_length, udt_name
FROM information_schema.columns
WHERE table_name = 'target_table'
AND column_name = 'target_column';2. Корректировка длины поля на стороне PostgreSQL (для прямых баз)
-- Расширение длины строки без эксклюзивной блокировки всей таблицы (начиная с PostgreSQL 9.2+)
ALTER TABLE "target_table" ALTER COLUMN "target_column" TYPE varchar(255);3. Исправление в среде 1С:Предприятие
- Откройте Конфигуратор 1С.
- Найдите объект метаданных (справочник, документ или регистр), на котором происходит сбой.
- Увеличьте свойство реквизита Длина до требуемого значения (либо переключите в режим «Неограниченная длина», что переведет поле в тип
textв PostgreSQL). - Выполните обновление конфигурации базы данных (
F7).
4. Превентивная обрезка строк в коде 1С / SQL
Если расширение структуры невозможно, используйте функцию безопасного усечения:
-- SQL-запрос
INSERT INTO target_table (code, descr)
VALUES ('001', LEFT('Слишком длинная строка ...', 50)); Частые вопросы (FAQ)
Блокирует ли ALTER TABLE ... TYPE varchar(N) таблицу для читающих запросов?
В современных версиях PostgreSQL (9.2+) увеличение размера varchar(N) до большего значения или перевод в text не требует перезаписи таблицы (heap rewrite) и выполняется почти мгновенно, требуя лишь кратковременную блокировку AccessExclusiveLock для обновления метаданных.
Как переполнение строки обрабатывается в коде на платформе 1С?
Платформа 1С:Предприятие на уровне встроенного языка обычно автоматически обрезает строки до длины реквизита при присвоении. Ошибка 22001 возникает при прямых SQL-запросах, загрузке через внешние источники данных или сбоях сериализации платформы.
Почему ошибка 22001 может проявляться из-за многобайтовых символов UTF-8?
В PostgreSQL тип varchar(N) измеряется в символах, а не в байтах. Однако если сторонний драйвер или промежуточный шлюз транслирует данные с явным приведением к байтовым массивам, многобайтовые символы (кириллица, emoji) могут приводить к несовпадению расчетного размера буфера.
В чем отличие влияния varchar(N) и text на производительность в PostgreSQL?
В PostgreSQL под капотом типы varchar(N) и text используют одну и ту же внутреннюю структуру varlena. Ограничение длины N не дает выигрыша по памяти или скорости, а служит лишь проверочным ограничением целостности данных.