Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

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

SQLSTATE 22001 Ошибка усечения строковых данных справа: 1С и PostgreSQL

Обновлено: 10.09.2026  ·  Официальная база знаний

Архитектура ошибки 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. Это приведет к фатальному рассогласованию метаданных.

  1. Откройте Конфигуратор и найдите проблемный реквизит документа/справочника.
  2. Увеличьте длину строки (например, верните до 150) или установите тип строки "Неограниченная длина".
  3. Выполните обновление конфигурации БД (F7).
  4. Если необходимо обрезать данные, напишите внешнюю обработку на встроенном языке 1С, которая через Лев(Строка, 100) обрежет реквизиты объектов и перезапишет их через ОбменДанными.Загрузка = Истина.
  5. После очистки данных в 1С, снова уменьшите длину в Конфигураторе и обновите БД.

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

  • Ручной ALTER TABLE в PostgreSQL: Расширение поля типа varchar напрямую в СУБД снимет ошибку временно, но при следующем обновлении платформы или конфигурации 1С обнаружит рассогласование и может разрушить таблицу (выдав ошибку целостности).
  • Игнорирование пробелов: В 1С строки фиксированной длины дополняются пробелами справа. При интеграции с другими системами эти пробелы могут восприниматься СУБД как значимые символы. Обязательно используйте функцию СокрЛП() при загрузке данных.
Практический опыт инженера: Практика ITSTM: При массовых загрузках данных из Excel или внешних SQL-баз мы рекомендуем загружать данные во временные таблицы (в памяти 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) считаются как один символ. Ошибка возникает именно из-за количества символов.