При работе с маркированными товарами в программе 1С:Управление нашей фирмой 3.0 пользователи часто сталкиваются со специфической ошибкой: «Текст Xml содержит недопустимый символ в позиции 31». Проблема обычно проявляется при использовании 2D-сканеров (например, модели Space Penguin) в режиме виртуального COM-порта. Примечательно, что сканер может успешно проходить тесты в настройках и корректно работать в одних документах (например, «Чек ККМ»), но выдавать ошибку в других (например, «Приходная накладная»).
В этой статье мы подробно разберем, почему возникает эта ошибка, как она связана со структурой кода маркировки и как правильно настроить оборудование и программную часть 1С, чтобы избавиться от проблемы.
Проанализируем природу ошибки. Коды маркировки DataMatrix, используемые в системе «Честный ЗНАК», построены по стандарту GS1. Особенностью этого стандарта является использование специального управляющего символа GS (Group Separator), имеющего код ASCII 29. Этот символ необходим для разделения групп данных внутри одного кода (например, чтобы отделить серийный номер от срока годности, если они имеют переменную длину).
Когда сканер передает считанный код в 1С через драйвер в режиме Virtual COM, данные упаковываются в XML-структуру для передачи от драйвера к платформе. Согласно спецификации XML 1.0, большинство управляющих символов ASCII в диапазоне от 0 до 31 (за исключением табуляции, перевода строки и возврата каретки) являются недопустимыми. Как только XML-парсер 1С встречает символ с кодом 29, он прерывает работу и выдает ошибку о недопустимом символе.
Почему же в «Чеке ККМ» это работает? Разберем ситуацию: часто в рабочем месте кассира используются механизмы перехвата событий, которые могут иметь встроенные фильтры или использовать другие методы обработки данных, в то время как стандартные документы используют строгую валидацию через Библиотеку подключаемого оборудования (БПО).
Первым делом рассмотрим настройку самого оборудования. Самый надежный способ решить проблему — заставить сканер заменять невидимый символ GS на что-то, что 1С сможет «переварить», или настроить его так, чтобы драйвер корректно обрабатывал этот символ.
Control Character Substitution или GS Replacement. Рекомендуется настроить сканер так, чтобы вместо ASCII 29 он передавал другой символ, например, # или GS в текстовом виде. Однако наиболее корректным для 1С является режим, при котором сканер передает функциональные символы в формате, распознаваемом драйвером.13 (CR) или комбинацию 13, 10 (CR, LF). Это поможет драйверу однозначно определять окончание передачи кода.Если оборудование настроено верно, но ошибка сохраняется, проанализируем настройки подключения в самой программе 1С.
UTF-8. Это поможет платформе правильно интерпретировать входящий поток байтов.DataMatrix не установлены специфические преобразования, которые могут конфликтовать с XML-форматом.В ситуациях, когда настройка оборудования не помогает (например, сканер не поддерживает замену символов), проблему можно решить на уровне кода 1С. Рассмотрим, как очистить входящие данные от недопустимых символов до того, как они попадут в XML-обработчик.
Для этого необходимо внести изменения в процедуру обработки внешнего события от сканера. Обычно это процедура ОбработкаОповещения в модуле формы или в общем модуле интеграции оборудования.
Пример кода для очистки строки от символа GS:
// Очистка считанных данных от управляющего символа ASCII 29
ДанныеШтрихкода = СтрЗаменить(ДанныеШтрихкода, Символ(29), "");
// Если символ GS необходим для разбора маркировки,
// его можно заменить на допустимый в XML код или обработать вручную
ДанныеШтрихкода = СтрЗаменить(ДанныеШтрихкода, Символ(29), "#");
Важно помнить: символ GS критически важен для правильного разбора кода маркировки на составляющие (GTIN, серийный номер, ключ проверки). Если вы просто удалите его, встроенные механизмы 1С по разбору DataMatrix могут перестать узнавать структуру кода. В идеале, драйвер должен экранировать такие символы в формат , но если он этого не делает, ручная замена на # с последующим обратным преобразованием при разборе — рабочий вариант.
Чтобы окончательно выяснить причину, проведем простой тест. Воспользуемся сторонним текстовым редактором, который умеет отображать скрытые символы (например, Notepad++):
GS в позиции, указанной в ошибке (например, 31-й символ), значит, проблема именно в нем.Резюме: Ошибка «Текст Xml содержит недопустимый символ» — это классический конфликт между стандартом маркировки GS1 и правилами оформления XML-документов. Для исправления ситуации используйте либо перепрограммирование сканера на замену ASCII 29, либо обновите драйвер 1С до последней версии NativeApi, где обработка спецсимволов реализована более корректно.