При работе в типичных конфигурациях, таких как 1С:Розница или 1С:Управление торговлей, пользователи часто сталкиваются с неприятной ситуацией: при сканировании обычного штрихкода EAN-13 система выдает критическую ошибку «Текст XML содержит недопустимый символ в позиции 0». При этом штрихкод визуально выглядит корректно, а на других компьютерах та же самая база может работать без сбоев. Разберем подробно, почему это происходит и как устранить проблему программными и аппаратными методами.
Ошибка парсера XML в позиции 0 практически всегда означает, что в самом начале строки, которую система пытается обработать, находится невидимый управляющий символ или «мусорный» байт, который не соответствует стандарту XML 1.0. Рассмотрим основные причины:
Aim ID или эмуляция нажатия функциональных клавиш вроде F7).BOM) или использование специфических раскладок клавиатуры при передаче данных.Проанализируем ситуацию: в отладчике значение штрихкода может отображаться как обычная строка, например, "6438429602880". Однако, если функция НайтиНедопустимыеСимволыXML указывает на позицию 1 или 0, это явный признак того, что внутри строки есть невидимый символ.
Если мы не хотим или не можем изменить настройки самого сканера, наиболее надежным решением будет внедрение функции очистки строки перед её обработкой. В платформе 1С предусмотрены встроенные механизмы для поиска символов, которые «ломают» XML-сериализацию. В качестве основы для программной настройки оборудования можно использовать готовый пример работы со сканером штрихкодов через БПО.
Рассмотрим пример функции, которую можно добавить в расширение или модуль для удаления лишних данных:
Функция УдалитьНедопустимыеСимволыXML(Стр)
Позиция = НайтиНедопустимыеСимволыXML(Стр, , );
Пока Позиция <> 0 Цикл
Стр = Лев(Стр, Позиция-1) + Сред(Стр, Позиция+1);
Позиция = НайтиНедопустимыеСимволыXML(Стр, , );
КонецЦикла;
Возврат Стр;
КонецФункции
Эту функцию следует вызывать в процедурах обработки внешнего события от торгового оборудования. Посмотрим на примере обработчика ВнешнееСобытие:
&НаКлиенте
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// Очищаем полученные данные от сканера
ОчищенныеДанные = УдалитьНедопустимыеСимволыXML(СокрЛП(Данные));
// Дальнейшая логика обработки штрихкода
ОбработатьШтрихкод(ОчищенныеДанные);
КонецПроцедуры
Важное примечание: Начиная с последних версий платформы 8.3 (например, 8.3.25), появился системный метод ОбработкаСтрокиXML.УдалитьНедопустимыеСимволыXML, который работает значительно быстрее самописных циклов. Если ваша версия платформы позволяет, используйте именно его.
Если ошибка возникает только на одном рабочем месте, вероятнее всего, проблема в физических настройках сканера или его драйвера. Проанализируем шаги по диагностике оборудования:
Set to Defaults (Сброс к заводским настройкам).Add Aim ID или специфические префиксы. Для 1С в режиме эмуляции клавиатуры префикс должен быть пустым, либо строго соответствовать настройкам в справочнике «Подключаемое оборудование».Иногда ошибка «Текст XML содержит недопустимый символ» возникает при попытке системы прочитать ответы от транспортного модуля ЕГАИС. Это происходит, когда в одном из документов содержится спецсимвол, который 1С не может обработать стандартными средствами. Для автоматизации взаимодействия с системой учета алкоголя и корректного ведения таких операций можно настроить обмен 1С и ЕГАИС.
Чтобы решить эту проблему, выполните следующие действия:
localhost:8080).curl или встроенные средства очистки очереди).Если вы опытный разработчик и хотите точно выяснить, какой именно символ мешает работе, используйте функцию КодСимвола в отладчике. Разберем, как это сделать:
Остановитесь точкой останова в месте получения данных и выполните в табло:
КодСимвола(Штрихкод, 1)
Если результат функции меньше 32 (за исключением кодов 9, 10, 13) — это управляющий символ, который запрещен в XML. Например, код 0, 7 или 31 гарантированно вызовут ошибку. Также обратите внимание на код 65279 — это невидимый символ BOM, который часто вводит программистов в заблуждение.
Резюме: Для быстрого исправления ситуации на конкретном рабочем месте лучше всего сбросить настройки сканера и проверить его работу в режиме COM-порта. Если же вы хотите сделать решение универсальным для всех клиентов, внедрите принудительную очистку входящих строк через НайтиНедопустимыеСимволыXML, как показано в примерах выше. Это гарантирует стабильную работу программы вне зависимости от качества настройки оборудования. Если же сбой связан с неверным определением торгового оборудования на конкретном ПК, решить проблему поможет обработка для быстрого переключения рабочих мест.