SQLSTATE 22001 Ошибка усечения строковых данных справа: 1С и PostgreSQL
Архитектура ошибки SQLSTATE 22001
Ошибка SQLSTATE 22001 (value too long for type character varying) возникает на уровне СУБД PostgreSQL, когда рабочий процесс сервера 1С (rphost.exe/rphost) пытается записать в колонку таблицы строку, длина которой превышает ограничение (Max Length), заданное в схеме таблицы. В архитектуре 1С:Предприятие длина строковых реквизитов жестко декларируется в метаданных конфигуратора. Бизнес-риски: аварийное прерывание транзакций при проведении документов, невозможность загрузки данных из внешних систем (XML/JSON), блокировка обменов РИБ.
Основные триггеры рассогласования
| Источник проблемы | Описание сбоя | Способ локализации |
|---|---|---|
| Изменение длины реквизита | В Конфигураторе длину строки уменьшили (например, с 150 до 100), но в БД остались строки > 100 символов. Реструктуризация завершилась с ошибкой, но изменения частично применились. | Анализ журнала регистрации (Событие: Ошибка СУБД). |
| Прямая запись SQL | Данные были вставлены в таблицу PostgreSQL напрямую (INSERT/UPDATE), минуя сервер 1С, с нарушением длины поля. | Поиск запросов в логах PostgreSQL (postgresql.conf). |
| Обмен данными (РИБ) | В узлах РИБ разные версии конфигурации. Подчиненный узел присылает строку, которая не помещается в реквизит главного узла. | Анализ XML файла сообщения обмена. |
Алгоритм устранения усечения данных
Сценарий 1: Локализация сбойной таблицы и реквизита
В тексте ошибки 1С обычно выводится SQL-запрос. Необходимо найти в нем имя таблицы (например, _Document154) и поля (_Fld155).
-- Запрос к PostgreSQL для получения структуры таблицы
SELECT column_name, character_maximum_length
FROM information_schema.columns
WHERE table_name = '_document154';
-- Поиск строк, превышающих лимит (например, лимит 100)
SELECT _idrref FROM _document154 WHERE LENGTH(_fld155) > 100;Сценарий 2: Приведение данных в соответствие (через 1С)
Никогда не меняйте структуру таблиц 1С напрямую через SQL ALTER TABLE. Это приведет к фатальному рассогласованию метаданных.
- Откройте Конфигуратор и найдите проблемный реквизит документа/справочника.
- Увеличьте длину строки (например, верните до 150) или установите тип строки "Неограниченная длина".
- Выполните обновление конфигурации БД (F7).
- Если необходимо обрезать данные, напишите внешнюю обработку на встроенном языке 1С, которая через
Лев(Строка, 100)обрежет реквизиты объектов и перезапишет их черезОбменДанными.Загрузка = Истина. - После очистки данных в 1С, снова уменьшите длину в Конфигураторе и обновите БД.
Типовые ошибки администраторов
- Ручной ALTER TABLE в PostgreSQL: Расширение поля типа
varcharнапрямую в СУБД снимет ошибку временно, но при следующем обновлении платформы или конфигурации 1С обнаружит рассогласование и может разрушить таблицу (выдав ошибку целостности). - Игнорирование пробелов: В 1С строки фиксированной длины дополняются пробелами справа. При интеграции с другими системами эти пробелы могут восприниматься СУБД как значимые символы. Обязательно используйте функцию
СокрЛП()при загрузке данных.
Частые вопросы (FAQ)
Как включить детализацию логов PostgreSQL для поиска сбойного запроса?
В файле postgresql.conf установите параметры: log_min_error_statement = error (или warning), log_min_messages = warning. Перезагрузите службу PostgreSQL. Ошибки SQLSTATE будут писаться в pg_log с полным текстом запроса.
Почему ошибка появляется только при использовании PostgreSQL, а на MS SQL работало нормально?
MS SQL Server в связке с 1С может молча обрезать данные (зависит от настроек ANSI_WARNINGS), в то время как PostgreSQL строго соблюдает стандарт SQL и всегда генерирует ошибку 22001 при попытке вставить данные, превышающие размер поля.
Что делать, если база не обновляется в Конфигураторе из-за этой ошибки?
Отмените изменения конфигурации БД (Вернуться к конфигурации БД). Запустите платформу в режиме Предприятия, найдите данные, превышающие новую длину, исправьте их (сократите текст), и только потом повторите реструктуризацию в Конфигураторе.
Влияет ли кодировка UTF-8 на расчет длины строки?
Тип character varying (varchar) в PostgreSQL хранит длину в символах, а не в байтах. Поэтому кириллические символы (занимающие 2 байта в UTF-8) считаются как один символ. Ошибка возникает именно из-за количества символов.