Как исправить ошибку «Текст Xml содержит недопустимый символ» при сканировании маркированного товара в 1С

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

При работе с маркированными товарами в программе 1С:Управление нашей фирмой 3.0 пользователи часто сталкиваются со специфической ошибкой: «Текст Xml содержит недопустимый символ в позиции 31». Проблема обычно проявляется при использовании 2D-сканеров (например, модели Space Penguin) в режиме виртуального COM-порта. Примечательно, что сканер может успешно проходить тесты в настройках и корректно работать в одних документах (например, «Чек ККМ»), но выдавать ошибку в других (например, «Приходная накладная»).

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

Причина ошибки: символ-разделитель GS (ASCII 29)

Проанализируем природу ошибки. Коды маркировки DataMatrix, используемые в системе «Честный ЗНАК», построены по стандарту GS1. Особенностью этого стандарта является использование специального управляющего символа GS (Group Separator), имеющего код ASCII 29. Этот символ необходим для разделения групп данных внутри одного кода (например, чтобы отделить серийный номер от срока годности, если они имеют переменную длину).

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

Почему же в «Чеке ККМ» это работает? Разберем ситуацию: часто в рабочем месте кассира используются механизмы перехвата событий, которые могут иметь встроенные фильтры или использовать другие методы обработки данных, в то время как стандартные документы используют строгую валидацию через Библиотеку подключаемого оборудования (БПО).

Решение 1: Настройка сканера штрихкодов

Первым делом рассмотрим настройку самого оборудования. Самый надежный способ решить проблему — заставить сканер заменять невидимый символ GS на что-то, что 1С сможет «переварить», или настроить его так, чтобы драйвер корректно обрабатывал этот символ.

  1. Замена символа GS (GS1 Replacement): Найдите в инструкции к вашему сканеру управляющий штрихкод, отвечающий за Control Character Substitution или GS Replacement. Рекомендуется настроить сканер так, чтобы вместо ASCII 29 он передавал другой символ, например, # или GS в текстовом виде. Однако наиболее корректным для 1С является режим, при котором сканер передает функциональные символы в формате, распознаваемом драйвером.
  2. Режим эмуляции клавиатуры: Если бизнес-процесс позволяет, можно перевести сканер из режима Virtual COM в режим эмуляции клавиатуры (USB-HID). В этом случае символы передаются как нажатия клавиш, и XML-парсер драйвера не задействуется напрямую для передачи «сырых» данных, что часто снимает проблему недопустимых символов.
  3. Суффиксы и префиксы: Проверьте настройки суффикса. Для корректной работы в 1С рекомендуется устанавливать суффикс 13 (CR) или комбинацию 13, 10 (CR, LF). Это поможет драйверу однозначно определять окончание передачи кода.

Решение 2: Настройка драйвера в 1С

Если оборудование настроено верно, но ошибка сохраняется, проанализируем настройки подключения в самой программе 1С.

  1. Перейдите в раздел Администрирование — Подключаемое оборудование.
  2. Откройте настройки вашего сканера. Убедитесь, что используется актуальная версия драйвера «1С:Сканеры штрихкода (NativeApi)».
  3. Попробуйте изменить параметр «Кодировка» на UTF-8. Это поможет платформе правильно интерпретировать входящий поток байтов.
  4. В некоторых версиях драйверов есть параметр «Тип символики». Убедитесь, что для DataMatrix не установлены специфические преобразования, которые могут конфликтовать с XML-форматом.

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

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

Для этого необходимо внести изменения в процедуру обработки внешнего события от сканера. Обычно это процедура ОбработкаОповещения в модуле формы или в общем модуле интеграции оборудования.

Пример кода для очистки строки от символа GS:


// Очистка считанных данных от управляющего символа ASCII 29
ДанныеШтрихкода = СтрЗаменить(ДанныеШтрихкода, Символ(29), "");

// Если символ GS необходим для разбора маркировки, 
// его можно заменить на допустимый в XML код или обработать вручную
ДанныеШтрихкода = СтрЗаменить(ДанныеШтрихкода, Символ(29), "#");

Важно помнить: символ GS критически важен для правильного разбора кода маркировки на составляющие (GTIN, серийный номер, ключ проверки). Если вы просто удалите его, встроенные механизмы 1С по разбору DataMatrix могут перестать узнавать структуру кода. В идеале, драйвер должен экранировать такие символы в формат , но если он этого не делает, ручная замена на # с последующим обратным преобразованием при разборе — рабочий вариант.

Как проверить, что выдает сканер?

Чтобы окончательно выяснить причину, проведем простой тест. Воспользуемся сторонним текстовым редактором, который умеет отображать скрытые символы (например, Notepad++):

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

Резюме: Ошибка «Текст Xml содержит недопустимый символ» — это классический конфликт между стандартом маркировки GS1 и правилами оформления XML-документов. Для исправления ситуации используйте либо перепрограммирование сканера на замену ASCII 29, либо обновите драйвер 1С до последней версии NativeApi, где обработка спецсимволов реализована более корректно.

← На главную