Как исправить ошибку «Текст XML содержит недопустимый символ в позиции...» при синхронизации в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

При обмене данными между конфигурациями 1С:Розница и 1С:Бухгалтерия (а также в любых других обменах на базе XML/EnterpriseData) пользователи часто сталкиваются со следующей ошибкой:

Текст XML содержит недопустимый символ в позиции 31 : \n0104603934000779215aHf(ijxYSHbQ\u001D9354e

В этой статье мы подробно разберем, почему возникает эта ошибка, где в базе данных могут скрываться невидимые проблемные символы, почему простое удаление штрихкода не всегда помогает и как раз и навсегда предотвратить появление таких ситуаций.

Разберем причину возникновения ошибки

Символ \u001D (в десятичном формате ASCII — код 29, в среде разработки 1С представляемый как Символ(29)) — это управляющий символ GS (Group Separator). Он является стандартом для кодов маркировки GS1 DataMatrix (Честный Знак, ЕГАИС) и служит разделителем групп данных переменной длины (например, отделяет серийный номер товара от криптографического хвоста проверки).

Согласно международному стандарту XML 1.0, использование управляющих символов ASCII с кодами от 0 до 31 в теле XML-документа напрямую категорически запрещено (за исключением трех стандартных символов: табуляции Символ(9), перевода строки Символ(10) и возврата каретки Символ(13)). Платформа 1С при сериализации данных в XML перед отправкой пакета синхронизации записывает строку «как есть». При попытке записать или провалидировать полученный XML-файл парсер натыкается на запрещенный Символ(29) и аварийно завершает работу.

Функции платформы типа XMLСтрока() не преобразуют управляющие символы в безопасные сущности XML, так как они просто не предназначены для очистки бинарного мусора в строковых данных. Поэтому решать проблему приходится на уровне прикладного кода и данных.

Выясним, как спецсимволы попадают в базу данных

Наиболее распространенный сценарий — человеческий фактор и некорректная настройка торгового оборудования. Рассмотрим его подробнее:

  1. Пользователи (кассиры или кладовщики) ошибочно полагают, что код маркировки — это «просто длинный штрихкод».
  2. Они сканируют DataMatrix-код с упаковки товара в стандартные текстовые поля ввода, предназначенные для обычных линейных штрихкодов (например, в форму создания нового штрихкода номенклатуры).
  3. Если сканер штрихкодов настроен некорректно, он передает в систему неочищенный код маркировки напрямую вместе с символом GS (который записывается в базу данных).
  4. При попытке выполнить синхронизацию документов продажи или справочников система считывает эту запись, пытается сформировать XML-сообщение обмена и падает с ошибкой.

Где в базе данных может скрываться проблемный символ?

Многие администраторы баз данных совершают ошибку: они находят указанный в ошибке штрихкод в справочнике Штрихкоды упаковок и товаров, удаляют его, запускают синхронизацию снова, но ошибка повторяется. Проанализируем, в каких еще объектах конфигурации 1С может дублироваться или кэшироваться эта информация:

Пошаговое руководство по устранению проблемы

Рассмотрим комплексный подход к решению проблемы, состоящий из очистки данных, сброса очередей обмена и настройки оборудования.

Шаг 1. Программный поиск и очистка битых записей

Поскольку Символ(29) является непечатным, его невозможно найти обычным текстовым поиском в пользовательском режиме. Нам поможет написание простого скрипта в консоли запросов или внешней обработке:


СимволРазделитель = Символ(29);
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Т.Ссылка КАК Ссылка,
    |	Т.Штрихкод КАК ЗначениеШтрихкода
    |ИЗ
    |	РегистрСведений.ШтрихкодыНоменклатуры КАК Т
    |ГДЕ
    |	Т.Штрихкод ПОДОБНО ""%"" + &СпецСимвол + ""%""";

Запрос.УстановитьПараметр("СпецСимвол", СимволРазделитель);
Результат = Запрос.Выполнить();

Если Не Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
        // Выполняем очистку найденных символов
        ОбъектМенеджер = Выборка.Ссылка.ПолучитьОбъект();
        // Заменяем недопустимый символ на пустую строку
        ОбъектМенеджер.Штрихкод = СтрЗаменить(Выборка.ЗначениеШтрихкода, СимволРазделитель, "");
        ОбъектМенеджер.Записать();
    КонецЦикла;
КонецЕсли;

Этот пример можно адаптировать под справочники ШтрихкодыУпаковокТоваров, Номенклатура (если битый символ попал в наименование или артикул), а также под соответствующие регистры сведений кодов маркировки. Для автоматического поиска и очистки очереди выгрузки подойдёт обработка для удаления из узла обмена объектов с недопустимыми символами XML.

Шаг 2. Очистка регистрации изменений в Планах обмена

Если вы удалили или изменили все некорректные элементы, но обмен все равно не запускается, выполните следующие действия:

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

Шаг 3. Использование встроенных механизмов БСП для защиты кода

Для предотвращения подобных ошибок при разработке собственных правил обмена или доработке конфигураций рекомендуется использовать встроенные функции Библиотеки стандартных подсистем (БСП). В БСП присутствует готовый метод, который очищает любые строки от недопустимых в XML символов.

Посмотрим на пример его использования перед сериализацией данных:


// Очистка строки от недопустимых XML-символов с помощью БСП
БезопаснаяСтрока = ОбщегоНазначенияКлиентСервер.УдалитьНедопустимыеСимволыXML(ИсходнаяСтрокаМаркировки);

Этот метод гарантированно вырежет Символ(29) и любые другие непечатаемые управляющие символы, сохранив при этом остальную структуру данных.

Шаг 4. Настройка сканера штрихкодов

Чтобы раз и навсегда исключить попадание символа GS в текстовые поля базы данных при работе пользователей, необходимо правильно настроить торговое оборудование:

  1. Откажитесь от режима эмуляции клавиатуры (Keyboard Emulation Mode). В этом режиме сканер передает данные в операционную систему так, словно они вводятся с обычной клавиатуры. В результате управляющие символы могут преобразовываться в непредвиденные спецсимволы в полях ввода 1С.
  2. Переведите сканер в режим эмуляции COM-порта (USB-to-Serial / CDC-ACM). В этом режиме сканер отправляет данные напрямую в порт как чистый поток байтов.
  3. Установите сертифицированный Native-драйвер от 1С для работы со сканерами штрихкодов в настройках подключаемого оборудования. Интегрированные драйверы 1С умеют самостоятельно определять префиксы, суффиксы и корректно отсекать технологические символы (включая криптохвосты и спецсимволы GS) на этапе получения события от оборудования, гарантируя запись в базу только чистых данных.

Проанализировав проблему и выполнив все шаги по очистке базы данных и настройке оборудования, вы полностью избавитесь от ошибок XML-сериализации и обеспечите бесперебойную синхронизацию между вашими базами данных 1С.

← На главную