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

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

При работе в типичных конфигурациях, таких как 1С:Розница или 1С:Управление торговлей, пользователи часто сталкиваются с неприятной ситуацией: при сканировании обычного штрихкода EAN-13 система выдает критическую ошибку «Текст XML содержит недопустимый символ в позиции 0». При этом штрихкод визуально выглядит корректно, а на других компьютерах та же самая база может работать без сбоев. Разберем подробно, почему это происходит и как устранить проблему программными и аппаратными методами.

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

Ошибка парсера XML в позиции 0 практически всегда означает, что в самом начале строки, которую система пытается обработать, находится невидимый управляющий символ или «мусорный» байт, который не соответствует стандарту XML 1.0. Рассмотрим основные причины:

  1. Скрытые префиксы сканера: Многие сканеры штрихкода «из коробки» настроены на передачу служебных символов перед основным кодом (например, Aim ID или эмуляция нажатия функциональных клавиш вроде F7).
  2. Некорректная работа драйвера: При использовании режима эмуляции клавиатуры драйвер 1С может некорректно интерпретировать поток данных, добавляя в начало строки нулевой символ (Null-terminator) или спецсимволы кодировки.
  3. Проблемы с кодировкой: Наличие метки порядка байтов (BOM) или использование специфических раскладок клавиатуры при передаче данных.
  4. Поврежденные квитанции в УТМ: Если ошибка возникает не только при сканировании, но и при обмене с ЕГАИС, причиной может быть наличие «битого» XML-файла во входящих сообщениях УТМ.

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

Способ 1. Программная очистка штрихкода

Если мы не хотим или не можем изменить настройки самого сканера, наиболее надежным решением будет внедрение функции очистки строки перед её обработкой. В платформе 1С предусмотрены встроенные механизмы для поиска символов, которые «ломают» XML-сериализацию. В качестве основы для программной настройки оборудования можно использовать готовый пример работы со сканером штрихкодов через БПО.

Рассмотрим пример функции, которую можно добавить в расширение или модуль для удаления лишних данных:


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

Эту функцию следует вызывать в процедурах обработки внешнего события от торгового оборудования. Посмотрим на примере обработчика ВнешнееСобытие:


&НаКлиенте
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    // Очищаем полученные данные от сканера
    ОчищенныеДанные = УдалитьНедопустимыеСимволыXML(СокрЛП(Данные));
    
    // Дальнейшая логика обработки штрихкода
    ОбработатьШтрихкод(ОчищенныеДанные);
КонецПроцедуры

Важное примечание: Начиная с последних версий платформы 8.3 (например, 8.3.25), появился системный метод ОбработкаСтрокиXML.УдалитьНедопустимыеСимволыXML, который работает значительно быстрее самописных циклов. Если ваша версия платформы позволяет, используйте именно его.

Способ 2. Настройка торгового оборудования (Сканера)

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

  1. Проверка в блокноте: Откройте обычный текстовый редактор и отсканируйте штрихкод туда. Если перед цифрами появляются лишние знаки, буквы или происходит переход на новую строку там, где его не должно быть — сканер запрограммирован неверно.
  2. Сброс настроек сканера: Найдите инструкцию к вашей модели сканера и отсканируйте управляющий штрихкод Set to Defaults (Сброс к заводским настройкам).
  3. Отключение префиксов: Убедитесь, что в сканере отключены функции Add Aim ID или специфические префиксы. Для 1С в режиме эмуляции клавиатуры префикс должен быть пустым, либо строго соответствовать настройкам в справочнике «Подключаемое оборудование».
  4. Смена режима работы: Наиболее стабильным вариантом является перевод сканера из режима «разрыва клавиатуры» (HID) в режим Native POS (Virtual COM-port). В этом случае данные передаются напрямую в порт, минуя буфер клавиатуры Windows, что исключает влияние раскладки и скрытых символов.

Способ 3. Очистка квитанций УТМ (ЕГАИС)

Иногда ошибка «Текст XML содержит недопустимый символ» возникает при попытке системы прочитать ответы от транспортного модуля ЕГАИС. Это происходит, когда в одном из документов содержится спецсимвол, который 1С не может обработать стандартными средствами. Для автоматизации взаимодействия с системой учета алкоголя и корректного ведения таких операций можно настроить обмен 1С и ЕГАИС.

Чтобы решить эту проблему, выполните следующие действия:

  1. Откройте домашнюю страницу УТМ в браузере (обычно localhost:8080).
  2. Перейдите во вкладку «Входящие».
  3. Попробуйте открыть каждое сообщение по очереди. Если при открытии конкретного документа браузер выдает ошибку XML или страница отображается пустой/кривой — этот документ поврежден.
  4. Удалите поврежденный документ из очереди УТМ (используя curl или встроенные средства очистки очереди).

Дополнительные рекомендации по диагностике

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

Остановитесь точкой останова в месте получения данных и выполните в табло:

КодСимвола(Штрихкод, 1)

Если результат функции меньше 32 (за исключением кодов 9, 10, 13) — это управляющий символ, который запрещен в XML. Например, код 0, 7 или 31 гарантированно вызовут ошибку. Также обратите внимание на код 65279 — это невидимый символ BOM, который часто вводит программистов в заблуждение.

Резюме: Для быстрого исправления ситуации на конкретном рабочем месте лучше всего сбросить настройки сканера и проверить его работу в режиме COM-порта. Если же вы хотите сделать решение универсальным для всех клиентов, внедрите принудительную очистку входящих строк через НайтиНедопустимыеСимволыXML, как показано в примерах выше. Это гарантирует стабильную работу программы вне зависимости от качества настройки оборудования. Если же сбой связан с неверным определением торгового оборудования на конкретном ПК, решить проблему поможет обработка для быстрого переключения рабочих мест.

← На главную