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

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

При работе с системой «Честный знак» (ИС МП) в программах 1С пользователи часто сталкиваются с технической ошибкой: «Текст XML содержит недопустимый символ в позиции 31». Эта проблема возникает в момент сканирования 2D-кода DataMatrix и блокирует дальнейшую обработку документа. В данной статье мы подробно разберем природу этой ошибки и рассмотрим эффективные методы её решения.

Выясним причину возникновения ошибки

Для начала проанализируем ситуацию. Ошибка возникает из-за конфликта стандартов передачи данных. Код маркировки формата DataMatrix строится по стандарту GS1, который предусматривает использование специальных управляющих символов-разделителей. Самым важным из них является символ GS (Group Separator), имеющий код ASCII 29 (или 0x1D в шестнадцатеричной системе).

Символ GS необходим для того, чтобы алгоритм расшифровки понимал, где заканчивается поле переменной длины (например, серийный номер) и начинается следующее поле (например, ключ проверки или «криптохвост»). Однако стандарт XML 1.0, который 1С использует для обмена данными между клиентским приложением и сервером (через XDTO), категорически запрещает использование управляющих символов в диапазоне 0–31 (за исключением табуляции и переноса строки).

Когда сканер считывает код и передает его в 1С как обычную строку, эта строка попадает в процедуру обработки. При попытке передать этот «сырой» код с клиента на сервер, система сериализует его в XML-пакет. Встретив символ Символ(29), парсер XML выдает ошибку, так как этот символ недопустим в структуре XML-документа. Позиция 31 обычно соответствует началу блока криптозащиты в кодах для обуви, одежды или табака.

Решение 1: Перевод сканера в режим эмуляции COM-порта

Рассмотрим самый простой и эффективный способ решения проблемы, не требующий изменения программного кода. Большинство 2D-сканеров по умолчанию работают в режиме эмуляции клавиатуры (HID). В этом режиме сканер «печатает» символы в поле ввода, и драйвер 1С получает их через стандартное внешнее событие, часто не успевая корректно обработать спецсимволы.

  1. Найдите инструкцию к вашему сканеру (User Manual).
  2. Считайте настроечный штрихкод «USB Serial Emulation» или «Enable COM Port Mode».
  3. После этого в диспетчере устройств Windows появится новое устройство в разделе «Порты (COM и LPT)». Запомните номер порта (например, COM3).
  4. В 1С перейдите в раздел «Администрирование» — «Подключаемое оборудование».
  5. Отредактируйте настройки вашего сканера: выберите тип подключения «COM-порт», укажите номер порта и убедитесь, что используется актуальный драйвер «1С:Сканеры штрихкода (NativeApi)».

В режиме COM-порта драйвер 1С перехватывает поток байтов напрямую. Современные версии драйверов NativeApi обучены корректно обрабатывать или игнорировать символ GS при упаковке данных в XML для сервера.

Решение 2: Обновление платформы и конфигурации

Проанализируем ситуацию с программной точки зрения. Фирма «1С» регулярно выпускает обновления для Библиотеки стандартных подсистем (БСП) и Библиотеки подключаемого оборудования (БПО), чтобы адаптировать механизмы работы с маркировкой. Если вы используете старый релиз (например, ранние версии УТ 11.4 или Розница 2.2), в них может отсутствовать «экранирование» спецсимволов.

Что необходимо сделать:

Решение 3: Программная обработка штрихкода (для разработчиков)

Если обновление невозможно или не помогает, разберем, как можно модифицировать код 1С для обхода ошибки. Основная задача — не допустить попадания символа Символ(29) в XML-сериализатор при вызове серверного метода.

Рассмотрим пример, где мы принудительно очищаем строку от недопустимых символов перед её отправкой на сервер. Это можно сделать в общем модуле ШтрихкодированиеИСКлиент (или через расширение):


// Пример функции очистки строки штрихкода
Функция ОчиститьКодМаркировкиОтСпецсимволов(Знач ИсходныйШтрихкод) Экспорт
    // Код символа GS - 29
    НедопустимыйСимвол = Символ(29);
    // Удаляем или заменяем его на пустую строку
    Результат = СтрЗаменить(ИсходныйШтрихкод, НедопустимыйСимвол, "");
    Возврат Результат;
КонецФункции

Однако более правильным подходом является передача данных в виде двоичных данных или использование функции XMLСтрока, которая умеет кодировать спецсимволы. Посмотрим на пример передачи данных через Base64:


// На стороне клиента преобразуем в Base64
ДвоичныеДанныеКода = ПолучитьДвоичныеДанныеИзСтроки(Штрихкод, КодировкаТекста.UTF8);
СтрокаДляПередачи = Base64Строка(ДвоичныеДанныеКода);

// На стороне сервера производим обратное действие
ДвоичныеДанныеСервер = Base64Значение(СтрокаДляПередачи);
ЧистыйШтрихкод = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанныеСервер, КодировкаТекста.UTF8);

Использование ДвоичныеДанные гарантирует, что XML-парсер не «споткнется» о содержимое строки, так как она будет передана в виде безопасного текстового массива символов A-Z, 0-9.

Решение 4: Настройка аппаратной замены символа в сканере

Проанализируем еще один способ: настройку самого оборудования. Большинство сканеров позволяют заменить передачу символа GS на любой печатный символ, например, на символ решетки # или вертикальной черты |.

Порядок действий:

  1. Откройте полную инструкцию к сканеру.
  2. Найдите раздел «Data Formatting» или «Character Substitution».
  3. Следуя инструкции, настройте замену символа с кодом 1D на код выбранного вами печатного символа.
  4. После этого в 1С штрихкод будет приходить в виде 0102900...21agM%ssr|KkWNd.... Символ | является допустимым в XML, и ошибка исчезнет.

Важно: При использовании этого метода убедитесь, что алгоритмы разбора кода маркировки в 1С (шаблоны штрихкодов) корректно распознают ваш новый разделитель.

Подведем итоги

Ошибка «недопустимый символ в позиции 31» — это типичная проблема «трудностей перевода» между промышленным стандартом маркировки и веб-стандартом передачи данных XML. Мы рекомендуем в первую очередь переводить оборудование на Native API и COM-порт, так как это штатный путь, предусмотренный разработчиками 1С. Если же вы столкнулись с этой проблемой в самописной конфигурации, используйте механизм передачи данных через Base64 или ДвоичныеДанные, чтобы обеспечить сохранность спецсимволов при прохождении через XML-сериализатор. Для устранения других типовых сбоев при интеграции с маркировкой можно использовать практический сборник готовых решений по работе с Честным Знаком в 1С.

← На главную