При работе с маркированной продукцией (молоко, табак, легкая промышленность) технические специалисты часто сталкиваются с ошибкой парсинга XML: «Текст XML содержит недопустимый символ в позиции...». Проблема возникает из-за наличия в коде DataMatrix специального управляющего символа GS (Group Separator), который имеет код U+001D (или 29 в десятичной системе). Согласно стандартам XML 1.0, управляющие символы в диапазоне 0x00–0x1F являются недопустимыми и вызывают фатальную ошибку при попытке записи или чтения XML-документа.
В этой статье мы подробно разберем причины возникновения этой ситуации, рассмотрим настройки торгового оборудования и программные методы очистки данных в 1С.
Символ \u001D используется в кодах маркировки как разделитель групп данных. Например, он отделяет серийный номер от «криптохвоста» (кода проверки) или даты истечения срока годности. Проблема заключается в том, как этот символ интерпретируется программным обеспечением:
Первым шагом нам необходимо убедиться, что сканер корректно передает данные в систему. Если сканер настроен неправильно, символ GS может превращаться в «мусорные» символы (особенно если вы используете внешнюю компоненту для мобильного приложения) или вызывать прерывание строки.
Проанализируем шаги по настройке оборудования:
1С:БПО обрабатывает корректно.29 или GS в зависимости от возможностей драйвера.GS как ASCII 29.Иногда ошибка возникает не в момент формирования XML для отправки вовне, а во внутренних механизмах конфигурации при проверке марки в чеке. Рассмотрим ситуацию на примере «молочной продукции» (поможет автоматизированная верификация кодов маркировки), когда марка сканируется не первой позицией в чеке.
Для обхода этой проблемы можно изменить настройки контроля (а также внедрить полноценный разрешительный режим на кассах):
Если вы столкнулись с ошибкой при формировании собственного XML-файла или JSON-запроса (например, для интеграции с маркетплейсами типа Wildberries), символ \u001D можно и нужно удалять или заменять программно. Многие внешние системы принимают коды без криптохвоста или требуют очистки управляющих символов.
Разберем пример кода на языке 1С, который позволяет очистить строку от недопустимого символа:
// Очистка кода маркировки от управляющего символа GS
КодМаркировки = "010290002381119621rP9VUBXh(lT*e" + Символ(29) + "91EE06" + Символ(29) + "92kXhqghD";
ЧистыйКод = СтрЗаменить(КодМаркировки, Символ(29), "");
// Если требуется замена на печатный символ для отладки
КодДляЛога = СтрЗаменить(КодМаркировки, Символ(29), "[GS]");
Важно помнить: метод СтрЗаменить(Строка, Символ(29), "") полностью удаляет разделитель. Это допустимо, если ваша задача — просто передать идентификатор (GTIN + Серийный номер). Однако, если принимающая система требует наличия разделителя в определенном формате (например, ), используйте соответствующее экранирование.
Проанализируем ситуацию, когда после удаления символа GS возникает ошибка вида cvc-pattern-valid. Это означает, что строка не проходит проверку по маске (регулярному выражению) в XSD-схеме.
Такое случается, если:
GS были удалены важные части кода.= (часто появляется при некорректном декодировании Base64).CR/LF), который не предусмотрен шаблоном марки.В этом случае перед записью в XML необходимо проверить длину строки и её соответствие формату. Используйте объект РегулярноеВыражение или простые функции работы со строками, чтобы убедиться, что в коде остались только разрешенные символы [0-9a-zA-Z].
Рассмотрим пример функции для проверки наличия лишних хвостов:
Функция ОчиститьМаркуДляXML(Знач ИсходнаяМарка)
// Убираем символ GS
Результат = СтрЗаменить(ИсходнаяМарка, Символ(29), "");
// Убираем возможные пробелы и переносы строк, которые мог добавить сканер
Результат = СокрЛП(Результат);
// Удаляем знак равенства, если он не предусмотрен структурой
Если Прав(Результат, 1) = "=" Тогда
Результат = Лев(Результат, СтрДлина(Результат) - 1);
КонецЕсли;
Возврат Результат;
КонецФункции
Для успешного решения проблемы с символом \u001D мы рекомендуем придерживаться следующего алгоритма: сначала проверьте настройки сканера (перевод в COM-режим), затем убедитесь в актуальности драйверов 1С, и в крайнем случае прибегайте к программной очистке строки через СтрЗаменить с использованием Символ(29). Помните, что для разных товарных групп правила передачи криптохвоста могут отличаться, поэтому всегда сверяйтесь с актуальной документацией ГИС МТ.