При обмене данными между конфигурациями 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, так как они просто не предназначены для очистки бинарного мусора в строковых данных. Поэтому решать проблему приходится на уровне прикладного кода и данных.
Наиболее распространенный сценарий — человеческий фактор и некорректная настройка торгового оборудования. Рассмотрим его подробнее:
GS (который записывается в базу данных).Многие администраторы баз данных совершают ошибку: они находят указанный в ошибке штрихкод в справочнике Штрихкоды упаковок и товаров, удаляют его, запускают синхронизацию снова, но ошибка повторяется. Проанализируем, в каких еще объектах конфигурации 1С может дублироваться или кэшироваться эта информация:
ХранилищеЗначения.Рассмотрим комплексный подход к решению проблемы, состоящий из очистки данных, сброса очередей обмена и настройки оборудования.
Поскольку Символ(29) является непечатным, его невозможно найти обычным текстовым поиском в пользовательском режиме. Нам поможет написание простого скрипта в консоли запросов или внешней обработке:
СимволРазделитель = Символ(29);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Т.Ссылка КАК Ссылка,
| Т.Штрихкод КАК ЗначениеШтрихкода
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Т
|ГДЕ
| Т.Штрихкод ПОДОБНО ""%"" + &СпецСимвол + ""%""";
Запрос.УстановитьПараметр("СпецСимвол", СимволРазделитель);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Выполняем очистку найденных символов
ОбъектМенеджер = Выборка.Ссылка.ПолучитьОбъект();
// Заменяем недопустимый символ на пустую строку
ОбъектМенеджер.Штрихкод = СтрЗаменить(Выборка.ЗначениеШтрихкода, СимволРазделитель, "");
ОбъектМенеджер.Записать();
КонецЦикла;
КонецЕсли;
Этот пример можно адаптировать под справочники ШтрихкодыУпаковокТоваров, Номенклатура (если битый символ попал в наименование или артикул), а также под соответствующие регистры сведений кодов маркировки. Для автоматического поиска и очистки очереди выгрузки подойдёт обработка для удаления из узла обмена объектов с недопустимыми символами XML.
Если вы удалили или изменили все некорректные элементы, но обмен все равно не запускается, выполните следующие действия:
Для предотвращения подобных ошибок при разработке собственных правил обмена или доработке конфигураций рекомендуется использовать встроенные функции Библиотеки стандартных подсистем (БСП). В БСП присутствует готовый метод, который очищает любые строки от недопустимых в XML символов.
Посмотрим на пример его использования перед сериализацией данных:
// Очистка строки от недопустимых XML-символов с помощью БСП
БезопаснаяСтрока = ОбщегоНазначенияКлиентСервер.УдалитьНедопустимыеСимволыXML(ИсходнаяСтрокаМаркировки);
Этот метод гарантированно вырежет Символ(29) и любые другие непечатаемые управляющие символы, сохранив при этом остальную структуру данных.
Чтобы раз и навсегда исключить попадание символа GS в текстовые поля базы данных при работе пользователей, необходимо правильно настроить торговое оборудование:
GS) на этапе получения события от оборудования, гарантируя запись в базу только чистых данных.Проанализировав проблему и выполнив все шаги по очистке базы данных и настройке оборудования, вы полностью избавитесь от ошибок XML-сериализации и обеспечите бесперебойную синхронизацию между вашими базами данных 1С.