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

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

При работе с системой маркировки «Честный знак» пользователи часто сталкиваются с неприятной ситуацией: при сканировании кода DataMatrix программа 1С выдает критическую ошибку: «Текст XML содержит недопустимый символ в позиции 31». Эта проблема парализует работу склада или кассовой зоны, так как один и тот же код может считаться нормально, а в следующий раз вызвать сбой — для наведения порядка на этих участках пригодится обработка для точной проверки и сборки заказов со сканером или ТСД. В этой статье мы подробно разберем природу данной ошибки и рассмотрим все известные способы её решения — от настройки «железа» до правки программного кода.

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

Проанализируем ситуацию с технической точки зрения. Код маркировки «Честного знака» содержит в себе специальный управляющий символ — разделитель групп GS1 (Group Separator), который имеет ASCII-код 29. Согласно стандартам XML 1.0, символы с кодами ниже 32 (за исключением табуляции и перевода строки) являются недопустимыми и не могут быть переданы внутри XML-пакета «как есть».

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

Способ 1. Настройка сканера на передачу данных в Base64

Самый эффективный и современный способ решить проблему без вмешательства в программный код — это изменить настройки драйвера сканера. Рассмотрим подробнее, почему это помогает. Если данные передаются в формате Base64, то вся строка штрихкода (включая спецсимволы) кодируется в набор безопасных латинских букв и цифр, которые XML-парсер пропускает без вопросов.

  1. Перейдем в раздел Администрирование — Подключаемое оборудование.
  2. Найдем наш сканер штрихкода и откроем его настройки.
  3. В параметрах драйвера (обычно это 1С:Сканеры штрихкода (NativeApi)) поищем настройку «Способ передачи данных» или аналогичную.
  4. Если драйвер поддерживает, установим значение Base64 вместо «Строка».

После этого 1С будет получать закодированную строку, корректно передавать её на сервер, а стандартные механизмы БПО (Библиотеки подключаемого оборудования) сами произведут обратное декодирование.

Способ 2. Использование режима эмуляции COM-порта

Часто ошибка возникает, если сканер работает в режиме эмуляции клавиатуры (HID). В этом случае ввод данных сильно зависит от раскладки клавиатуры и скорости передачи символов — для бесконфликтной работы склада лучше использовать мобильное приложение для ТСД по сканированию и обработке кодов маркировки. Разберем шаги по переходу на VCOM:

  1. Переведем физический сканер в режим USB-COM (для этого нужно отсканировать специальный управляющий код из инструкции к вашей модели сканера, например, Honeywell, Zebra или АТОЛ).
  2. Установим соответствующий драйвер виртуального COM-порта в операционной системе.
  3. В 1С в настройках оборудования выберем соответствующий COM-порт.
  4. Проверим работу. В режиме COM-порта драйвер более корректно обрабатывает спецсимволы, не привязываясь к раскладке Windows.

Способ 3. Программная очистка строки от недопустимых символов

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

Рассмотрим пример кода, который можно внедрить в расширение конфигурации (например, в модуль ШтрихкодированиеИСКлиент):


Функция УдалитьНедопустимыеСимволыXML(СтрокаХМЛ) Экспорт
    Позиция = НайтиНедопустимыеСимволыXML(СтрокаХМЛ);
    Пока Позиция <> 0 Цикл
        НедопустимыйСимвол = Сред(СтрокаХМЛ, Позиция, 1);
        СтрокаХМЛ = СтрЗаменить(СтрокаХМЛ, НедопустимыйСимвол, "");
        Позиция = НайтиНедопустимыеСимволыXML(СтрокаХМЛ);
    КонецЦикла;
    Возврат СтрокаХМЛ;
КонецФункции

Важный момент: в типовых конфигурациях 1С часто уже существует встроенная функция ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML. Рекомендуется использовать именно её перед отправкой данных на сервер, чтобы не «изобретать велосипед».

Способ 4. Корректировка скорости передачи данных

В некоторых случаях, особенно при работе через физические COM-порты или старые переходники, данные могут «биться» из-за слишком высокой скорости передачи. Посмотрим на практику коллег: иногда снижение скорости помогает стабилизировать чтение.

  1. В настройках оборудования 1С для сканера изменим параметр Speed (Скорость).
  2. Если по умолчанию стоит 9600, попробуем снизить до 4800.
  3. Это увеличит время обработки одного кода, но может избавить от появления «мусорных» символов в середине строки, которые и вызывают ошибку XML.

Способ 5. Физические помехи и USB-хабы

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

Решение: Подключите сканер напрямую в USB-порт на материнской плате компьютера (лучше всего в порты на задней панели системного блока). Также проверьте кабель сканера на наличие ферритовых колец — они эффективно подавляют помехи, которые могут искажать код маркировки.

Резюме по решению проблемы

Для гарантированного устранения ошибки мы рекомендуем следующий алгоритм действий:

Помните, что корректная работа с маркировкой требует не только правильной настройки программы, но и качественного оборудования, способного четко передавать управляющие символы GS1 без искажений.

← На главную