Как исправить ошибку MS SQL Server «Символьные или двоичные данные могут быть усечены» в 1С?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет Сфера услуг, туризм и социальный сектор
← На главную

При работе в клиент-серверном варианте 1С:Предприятия под управлением Microsoft SQL Server пользователи и разработчики могут столкнуться с аварийным завершением операции и системным сообщением: «Microsoft SQL Native Client: Символьные или двоичные данные могут быть усечены. HRESULT=80040E57, SQLSrvr: SQLSTATE=22001, native=8152». Чаще всего подобный сбой происходит при формировании печатных форм (например, Заявки на кассовый расход в БГУ), проведении документов или формировании сложных отчетов. Разберем подробно механику возникновения этой ошибки, способы ее локализации и варианты устранения.

Почему возникает ошибка усечения данных

Выясним причину такого поведения СУБД. Ошибка SQLSTATE=22001 (native=8152) (в англоязычной версии — «String or binary data would be truncated») означает, что сервер баз данных пытается записать строковое или двоичное значение в поле таблицы, максимальная длина которого меньше фактического размера записываемых данных.

В контексте платформы 1С:Предприятие это чаще всего происходит в следующих сценариях:

  1. Неявная типизация во временных таблицах запроса: при формировании печатных форм алгоритмы 1С собирают данные пакетными запросами с промежуточным помещением во временные таблицы СУБД (в базу tempdb). Если в первой ветке конструкции ОБЪЕДИНИТЬ ВСЕ длина строкового поля оказалась короткой или сформировалась пустая строка, СУБД жестко фиксирует тип колонки как VARCHAR(N) с малой длиной. При попытке поместить данные из последующих веток, где текст длиннее, сервер выдает исключение.
  2. Отсутствие явного приведения типов: если в запросе к составным полям или строкам неограниченной длины не используется оператор ВЫРАЗИТЬ(Поле КАК СТРОКА(N)), платформа может передать в SQL-сервер некорректную декларацию типа временной таблицы.
  3. Аномально длинные значения в реквизитах: в документ или справочник было скопировано чрезмерно длинное значение (например, подробное назначение платежа, длинное наименование основания договора или реквизиты контрагента), которое превышает ограничения колонок внутренних регистров или макетов.
  4. Запись служебных параметров печати: некоторые конфигурации при отправке на печать пытаются сохранить параметры формирования отчета или историю в служебные регистры сведений, строковые ресурсы которых строго ограничены по длине.

Способ 1. Локализация ошибки через отладчик 1С

Проанализируем выполнение кода с помощью отладчика платформы 1С:Предприятие. Для этого выполним следующие действия:

  1. Запустим конфигуратор и откроем модуль менеджера документа или модуль объекта в процедуре формирования печатной формы (например, Печать() или СформироватьПечатнуюФорму()).
  2. Включим в меню Отладка пункт Остановка по ошибке.
  3. Запустим печать проблемного документа в режиме 1С:Предприятие.
  4. При возникновении исключения платформа прервет выполнение именно на том запросе или операторе записи объекта, который спровоцировал падение.
  5. Посмотрим на текст запроса и значения параметров, передаваемых в Запрос.УстановитьПараметр(), чтобы выявить проблемное поле.

Способ 2. Включение детальной трассировки на стороне MS SQL Server

По умолчанию MS SQL Server при ошибке 8152 не сообщает, какое именно поле вызвало сбой. Однако в СУБД можно включить расширенную диагностику.

Если используется MS SQL Server 2016 SP2 CU6, MS SQL Server 2017 CU12 или более новые версии, выполним в SQL Server Management Studio (SSMS) команду включения флага трассировки:

DBCC TRACEON(460, -1);

После включения этого флага (или на MS SQL Server 2019 по умолчанию) сервер будет возвращать ошибку с кодом 2628, в тексте которой прямо указывается имя базы данных, целевая таблица (или временная таблица #tt...), имя проблемной колонки и значение строки, которое было усечено.

Способ 3. Проверка и корректировка данных в конкретном документе

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

  1. Откроем проблемный документ и сравним его заполнение с аналогичным успешно распечатанным документом.
  2. Обратим особое внимание на текстовые реквизиты: «Назначение платежа», «Основание», «Примечание», «Предмет договора», расшифровку табличной части заявки.
  3. Если в одно из полей был скопирован длинный неформатированный текст или спецсимволы, сократим его и повторим попытку печати.

Способ 4. Корректировка текста запроса в конфигурации или расширении

Если ошибка вызвана недоработкой типового алгоритма печати во временную таблицу, исправим текст проблемного запроса. Рассмотрим пример, где объединяются две таблицы, и в первой ветке строка не имеет явного ограничения длины:


ВЫБРАТЬ
    Документ.Ссылка КАК Ссылка,
    ВЫРАЗИТЬ(Документ.НазначениеПлатежа КАК СТРОКА(1000)) КАК НазначениеПлатежа,
    Документ.Сумма КАК Сумма
ПОМЕСТИТЬ ВТ_ДанныеПечати
ИЗ
    Документ.ЗаявкаНаКассовыйРасход КАК Документ
ГДЕ
    Документ.Ссылка = &Ссылка

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Документ.Ссылка,
    ВЫРАЗИТЬ(Документ.СодержаниеОперации КАК СТРОКА(1000)),
    Документ.Сумма
ИЗ
    Документ.ЗаявкаНаКассовыйРасход.Расшифровка КАК Документ
ГДЕ
    Документ.Ссылка = &Ссылка

Обратим внимание: явное указание конструкции ВЫРАЗИТЬ(Поле КАК СТРОКА(N)) гарантирует, что СУБД выделит в структуре временной таблицы достаточное количество байт для хранения длинного текста во всех объединяемых выборках.

Способ 5. Очистка кэша и обновление конфигурации

Если ошибка имеет системный характер после некорректного обновления или сбоя метаданных:

  1. Очистим локальный кэш пользователя (удалим каталоги из %LocalAppData%\1C\1cv8\ и %AppData%\1C\1cv8\) либо переподключим информационную базу в списке запуска.
  2. Установим актуальный релиз конфигурации или официальные патчи (исправления) от фирмы «1С». В типовых конфигурациях (включая БГУ) подобные ошибки в модулях печати оперативно устраняются разработчиками типовых решений.
← На главную