При работе с системой маркировки «Честный знак» пользователи часто сталкиваются с неприятной ситуацией: при сканировании кода DataMatrix программа 1С выдает критическую ошибку: «Текст XML содержит недопустимый символ в позиции 31». Эта проблема парализует работу склада или кассовой зоны, так как один и тот же код может считаться нормально, а в следующий раз вызвать сбой — для наведения порядка на этих участках пригодится обработка для точной проверки и сборки заказов со сканером или ТСД. В этой статье мы подробно разберем природу данной ошибки и рассмотрим все известные способы её решения — от настройки «железа» до правки программного кода.
Проанализируем ситуацию с технической точки зрения. Код маркировки «Честного знака» содержит в себе специальный управляющий символ — разделитель групп GS1 (Group Separator), который имеет ASCII-код 29. Согласно стандартам XML 1.0, символы с кодами ниже 32 (за исключением табуляции и перевода строки) являются недопустимыми и не могут быть переданы внутри XML-пакета «как есть».
Когда сканер считывает код, он передает строку в 1С. Если 1С пытается передать эту строку с клиента на сервер (например, в метод ОбработатьШтрихкод) через механизм XDTO или Web-сервисы, система пытается упаковать данные в XML. В этот момент XML-парсер натыкается на символ с кодом 29 и выдает ошибку, так как не знает, как его сериализовать. Позиция 31 в сообщении — это как раз то место в структуре передаваемых данных, где оказывается злополучный разделитель.
Самый эффективный и современный способ решить проблему без вмешательства в программный код — это изменить настройки драйвера сканера. Рассмотрим подробнее, почему это помогает. Если данные передаются в формате Base64, то вся строка штрихкода (включая спецсимволы) кодируется в набор безопасных латинских букв и цифр, которые XML-парсер пропускает без вопросов.
1С:Сканеры штрихкода (NativeApi)) поищем настройку «Способ передачи данных» или аналогичную.После этого 1С будет получать закодированную строку, корректно передавать её на сервер, а стандартные механизмы БПО (Библиотеки подключаемого оборудования) сами произведут обратное декодирование.
Часто ошибка возникает, если сканер работает в режиме эмуляции клавиатуры (HID). В этом случае ввод данных сильно зависит от раскладки клавиатуры и скорости передачи символов — для бесконфликтной работы склада лучше использовать мобильное приложение для ТСД по сканированию и обработке кодов маркировки. Разберем шаги по переходу на VCOM:
COM-порт.Если изменить настройки оборудования невозможно (например, сканер не поддерживает Base64 или работа идет через веб-клиент), нам поможет программная «очистка» считанных данных — альтернативным решением станет распознавание кодов маркировки DataMatrix по фотографиям напрямую в 1С. Проанализируем пример функции, которая находит и удаляет символы, мешающие работе XML-парсера.
Рассмотрим пример кода, который можно внедрить в расширение конфигурации (например, в модуль ШтрихкодированиеИСКлиент):
Функция УдалитьНедопустимыеСимволыXML(СтрокаХМЛ) Экспорт
Позиция = НайтиНедопустимыеСимволыXML(СтрокаХМЛ);
Пока Позиция <> 0 Цикл
НедопустимыйСимвол = Сред(СтрокаХМЛ, Позиция, 1);
СтрокаХМЛ = СтрЗаменить(СтрокаХМЛ, НедопустимыйСимвол, "");
Позиция = НайтиНедопустимыеСимволыXML(СтрокаХМЛ);
КонецЦикла;
Возврат СтрокаХМЛ;
КонецФункции
Важный момент: в типовых конфигурациях 1С часто уже существует встроенная функция ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML. Рекомендуется использовать именно её перед отправкой данных на сервер, чтобы не «изобретать велосипед».
В некоторых случаях, особенно при работе через физические COM-порты или старые переходники, данные могут «биться» из-за слишком высокой скорости передачи. Посмотрим на практику коллег: иногда снижение скорости помогает стабилизировать чтение.
Проанализируем ситуацию: если сканер подключен через дешевый USB-хаб (разветвитель), на линии могут возникать наводки. XML-ошибка в этом случае — лишь следствие того, что в поток данных попал случайный электрический шум, который 1С интерпретирует как спецсимвол.
Решение: Подключите сканер напрямую в USB-порт на материнской плате компьютера (лучше всего в порты на задней панели системного блока). Также проверьте кабель сканера на наличие ферритовых колец — они эффективно подавляют помехи, которые могут искажать код маркировки.
Для гарантированного устранения ошибки мы рекомендуем следующий алгоритм действий:
НайтиНедопустимыеСимволыXML перед передачей данных в серверные методы 1С.Помните, что корректная работа с маркировкой требует не только правильной настройки программы, но и качественного оборудования, способного четко передавать управляющие символы GS1 без искажений.