Как исправить ошибку «Текст XML содержит недопустимый символ» при сканировании кодов маркировки (символ GS \u001D)?

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

При работе с маркированной продукцией (молоко, табак, легкая промышленность) технические специалисты часто сталкиваются с ошибкой парсинга XML: «Текст XML содержит недопустимый символ в позиции...». Проблема возникает из-за наличия в коде DataMatrix специального управляющего символа GS (Group Separator), который имеет код U+001D (или 29 в десятичной системе). Согласно стандартам XML 1.0, управляющие символы в диапазоне 0x00–0x1F являются недопустимыми и вызывают фатальную ошибку при попытке записи или чтения XML-документа.

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

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

Символ \u001D используется в кодах маркировки как разделитель групп данных. Например, он отделяет серийный номер от «криптохвоста» (кода проверки) или даты истечения срока годности. Проблема заключается в том, как этот символ интерпретируется программным обеспечением:

  1. Ограничение формата XML: Стандартный парсер XML не может обработать символ с кодом 29 напрямую. Если 1С пытается сформировать сообщение для ГИС МТ (Честный ЗНАК) или передать данные между клиентом и сервером в формате XML, наличие этого символа «разрывает» структуру файла — для решения задачи есть модуль обмена с маркировкой через XML.
  2. Режим работы сканера: Если сканер работает в режиме эмуляции клавиатуры (HID), он может пытаться передать этот символ как нажатие функциональной клавиши или вовсе его проигнорировать, что приводит к некорректному считыванию марки.
  3. Версия БПО: В старых версиях «1С:Библиотека подключаемого оборудования» алгоритмы экранирования таких символов могли работать некорректно.

Решение 1: Настройка драйвера сканера штрихкодов

Первым шагом нам необходимо убедиться, что сканер корректно передает данные в систему. Если сканер настроен неправильно, символ GS может превращаться в «мусорные» символы (особенно если вы используете внешнюю компоненту для мобильного приложения) или вызывать прерывание строки.

Проанализируем шаги по настройке оборудования:

  1. Переведите сканер в режим Native COM или Virtual COM. Это наиболее предпочтительный вариант для 1С, так как данные передаются потоком байтов, который драйвер 1С:БПО обрабатывает корректно.
  2. В настройках драйвера сканера в 1С найдите параметр «Символ-разделитель GS» или «Префикс GS». Попробуйте установить значение 29 или GS в зависимости от возможностей драйвера.
  3. Если используется режим клавиатуры (что часто встречается, когда настроен мобильный ТСД для инвентаризации), убедитесь, что в настройках сканера включена передача символа GS как ASCII 29.

Решение 2: Изменение логики проверки маркировки в 1С

Иногда ошибка возникает не в момент формирования XML для отправки вовне, а во внутренних механизмах конфигурации при проверке марки в чеке. Рассмотрим ситуацию на примере «молочной продукции» (поможет автоматизированная верификация кодов маркировки), когда марка сканируется не первой позицией в чеке.

Для обхода этой проблемы можно изменить настройки контроля (а также внедрить полноценный разрешительный режим на кассах):

  1. Перейдите в настройки интеграции с ИС МП (Честный ЗНАК) — для этого подойдёт модуль интеграции с ГИС МТ Честный знак. Здесь же может потребоваться проверка и инициализация локального модуля Честного знака.
  2. Найдите опцию «Контролировать коды маркировки средствами ККТ».
  3. Установите режим выполнения этой проверки при пробитии чека, а не в момент сканирования в форму документа. Это позволяет избежать преждевременной валидации XML-пакета, который формируется для обмена с драйвером ККТ, и исключает ошибку на этапе подбора товаров.

Решение 3: Программная обработка строки (удаление символа)

Если вы столкнулись с ошибкой при формировании собственного XML-файла или JSON-запроса (например, для интеграции с маркетплейсами типа Wildberries), символ \u001D можно и нужно удалять или заменять программно. Многие внешние системы принимают коды без криптохвоста или требуют очистки управляющих символов.

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


// Очистка кода маркировки от управляющего символа GS
КодМаркировки = "010290002381119621rP9VUBXh(lT*e" + Символ(29) + "91EE06" + Символ(29) + "92kXhqghD";
ЧистыйКод = СтрЗаменить(КодМаркировки, Символ(29), "");

// Если требуется замена на печатный символ для отладки
КодДляЛога = СтрЗаменить(КодМаркировки, Символ(29), "[GS]");

Важно помнить: метод СтрЗаменить(Строка, Символ(29), "") полностью удаляет разделитель. Это допустимо, если ваша задача — просто передать идентификатор (GTIN + Серийный номер). Однако, если принимающая система требует наличия разделителя в определенном формате (например, ), используйте соответствующее экранирование.

Решение 4: Исправление ошибок валидации по регулярному выражению (XSD)

Проанализируем ситуацию, когда после удаления символа GS возникает ошибка вида cvc-pattern-valid. Это означает, что строка не проходит проверку по маске (регулярному выражению) в XSD-схеме.

Такое случается, если:

В этом случае перед записью в XML необходимо проверить длину строки и её соответствие формату. Используйте объект РегулярноеВыражение или простые функции работы со строками, чтобы убедиться, что в коде остались только разрешенные символы [0-9a-zA-Z].

Рассмотрим пример функции для проверки наличия лишних хвостов:


Функция ОчиститьМаркуДляXML(Знач ИсходнаяМарка)
    // Убираем символ GS
    Результат = СтрЗаменить(ИсходнаяМарка, Символ(29), "");
    // Убираем возможные пробелы и переносы строк, которые мог добавить сканер
    Результат = СокрЛП(Результат);
    // Удаляем знак равенства, если он не предусмотрен структурой
    Если Прав(Результат, 1) = "=" Тогда
        Результат = Лев(Результат, СтрДлина(Результат) - 1);
    КонецЕсли;
    Возврат Результат;
КонецФункции

Резюме

Для успешного решения проблемы с символом \u001D мы рекомендуем придерживаться следующего алгоритма: сначала проверьте настройки сканера (перевод в COM-режим), затем убедитесь в актуальности драйверов 1С, и в крайнем случае прибегайте к программной очистке строки через СтрЗаменить с использованием Символ(29). Помните, что для разных товарных групп правила передачи криптохвоста могут отличаться, поэтому всегда сверяйтесь с актуальной документацией ГИС МТ.

← На главную