Как исправить ошибку «Текст XML содержит недопустимый символ» при сканировании штрихкода GS1-128 в 1С?

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

При работе с маркировкой товаров и логистическими штрихкодами формата GS1-128 специалисты часто сталкиваются с критической ошибкой: «Текст XML содержит недопустимый символ в позиции...». Эта проблема особенно актуальна для сканеров Datalogic, Honeywell и Zebra при их подключении к типовым конфигурациям 1С. Давайте подробно разберем, почему возникает эта ситуация и какими способами ее можно решить.

Почему возникает эта ошибка? Выясняем причину

Проанализируем техническую сторону вопроса. Штрихкод стандарта GS1-128 использует специальный управляющий символ FNC1. Согласно международным стандартам, при сканировании этот символ передается как GS (Group Separator), имеющий код ASCII 29. Символ GS является непечатным и служит разделителем полей переменной длины в штрихкоде.

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

Решение 1: Программная обработка символов в 1С

Если у нас есть доступ к изменению кода конфигурации или мы пишем собственную обработку, мы можем перехватить данные до того, как они вызовут сбой. Рассмотрим пример кода, который позволяет очистить полученный штрихкод от недопустимых символов или заменить их на безопасные аналоги.

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


// Функция для очистки строки от символов, вызывающих сбой XML-парсера
Функция ОчиститьШтрихкодОтСпецсимволов(Знач ИсходныйТекст) Экспорт
    ТекНаименование = ИсходныйТекст;
    НедопустимыйСимволПозиция = НайтиНедопустимыеСимволыXML(ТекНаименование);
    
    Пока НедопустимыйСимволПозиция > 0 Цикл
        ЛеваяЧасть = ?(НедопустимыйСимволПозиция = 1, "", Лев(ТекНаименование, НедопустимыйСимволПозиция - 1));
        ПраваяЧасть = ?(НедопустимыйСимволПозиция = СтрДлина(ТекНаименование), "", Сред(ТекНаименование, НедопустимыйСимволПозиция + 1));
        
        // Заменяем недопустимый символ на пустую строку или разделитель (например, "#")
        ТекНаименование = ЛеваяЧасть + "" + ПраваяЧасть;
        НедопустимыйСимволПозиция = НайтиНедопустимыеСимволыXML(ТекНаименование);
    КонецЦикла;
    
    Возврат ТекНаименование;
КонецФункции

Также часто применяется более простой метод через СтрЗаменить, если мы точно знаем, какой символ вызывает проблему:


СимволGS = Символ(29);
ЧистыйКод = СтрЗаменить(ИсходныйКодМаркировки, СимволGS, "");

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

Решение 2: Аппаратная настройка сканера (Замена символа GS)

Самый эффективный способ — заставить сам сканер подменять символ GS на какой-то печатный символ (например, #, $ или |) еще на этапе передачи данных в компьютер. Разберем, как это сделать для популярных моделей.

  1. Для сканеров Datalogic: Используйте фирменную утилиту Aladdin. В разделе настройки конфигурации (Advanced Data Editing) нужно создать правило замены (Character Replacement). Мы находим символ с HEX-кодом 1D (это и есть ASCII 29) и указываем символ замены, например # (HEX 23).
  2. Для сканеров Honeywell: Эти устройства часто позволяют настроить префиксы и идентификаторы. Можно включить опцию GS1-128 Identifier Transmission или настроить Data Formatting, чтобы заменить управляющий код на текстовую строку.
  3. Режим эмуляции: Если сканер работает в режиме Keyboard Wedge (HID), он имитирует нажатие клавиш. Попробуйте перевести его в режим Virtual COM Port (VCP). При работе через COM-порт современные драйверы 1С (NativeApi версии 10.х и выше) умеют корректно экранировать спецсимволы, упаковывая их в безопасные последовательности.

Решение 3: Проверка раскладки клавиатуры и региональных настроек

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

Рекомендация: Переключите раскладку на английскую и проверьте работу. Если это помогает, в настройках драйвера устройства в самой 1С попробуйте установить параметр «Использовать английскую раскладку» или настройте сканер на передачу данных через буфер обмена.

Решение 4: Настройка работы через RDP (удаленный рабочий стол)

Если вы работаете в 1С через терминальный сервер, проблема может скрываться в механизме проброса клавиатуры. Разберем шаги по настройке RDP-клиента:

  1. Откройте настройки подключения к удаленному рабочему столу (mstsc.exe).
  2. Перейдите на вкладку «Локальные ресурсы».
  3. В разделе «Клавиатура» найдите параметр «Использовать сочетания клавиш Windows».
  4. Вместо значения «Только в полноэкранном режиме» установите «На этом компьютере».

Эта настройка позволяет локальному компьютеру корректно обрабатывать последовательности символов, которые генерирует сканер, прежде чем они будут отправлены в удаленную сессию 1С. Это часто решает проблему «склеивания» символов и ошибок XML при передаче управляющих кодов GS1-128.

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

Для надежного устранения ошибки «Недопустимый символ в XML» мы рекомендуем придерживаться следующего алгоритма:

Такой комплексный подход гарантирует стабильную работу оборудования с любыми типами маркировки и исключает внезапные завершения работы программы при сканировании.

← На главную