Функция снятия экранирования XML со строки данных КИЗ
Внедрение маркировки товаров средствами системы «Честный ЗНАК» продолжает усложнять обмен данными между контрагентами. Одной из ключевых технических проблем, с которой сталкиваются разработчики 1С, является корректная обработка XML-строк, содержащих коды идентификации (КИЗ). Рассмотрим новый подход — функцию снятия экранирования XML со строки данных КИЗ, которая упрощает интеграцию и снижает риск ошибок при разборе входящих документов.
Проблема экранирования XML в данных КИЗ
При обмене документами через оператора ЭДО (например, через сервисы 1С-ЭДО или сторонние платформы) коды КИЗ часто передаются в виде экранированных XML-строк. Это означает, что символы <, >, & и другие заменяются на их сущности (<, >, &). В результате строка, которая должна быть корректным XML-фрагментом, превращается в обычный текст, непригодный для прямого разбора.
Как это выглядит на практике
Типичная ситуация: входящий XML-документ содержит элемент <КИЗ>, внутри которого лежит экранированная строка:
<КИЗ><КодМаркировки>010463...</КодМаркировки></КИЗ>
При попытке прочитать такой элемент стандартными средствами ЧтениеXML платформа 1С воспринимает содержимое как простой текст, а не как вложенный XML. Это приводит к тому, что разбор КИЗ требует дополнительного шага — снятия экранирования.
Ключевой тезис: Без снятия экранирования XML вы не сможете программно извлечь отдельные реквизиты КИЗ (код товара, серийный номер, криптохвост) из строки, полученной от контрагента. Это ведёт к ошибкам при формировании уведомлений о вводе/выводе из оборота.
Функция снятия экранирования: реализация в 1С
Для решения задачи используется встроенная возможность платформы — объект ЧтениеXML в режиме чтения фрагмента. Ниже приведён корректный код, который выполняет обратное преобразование экранированной строки в XML-фрагмент.
Алгоритм работы
- Создаём объект
ЧтениеXMLна основе строки, содержащей экранированные сущности. - Устанавливаем режим чтения как «Фрагмент» (позволяет обрабатывать неполные XML-конструкции).
- Последовательно читаем узлы, пока не дойдём до нужного элемента.
- Извлекаем текстовое содержимое и преобразуем его обратно в XML-строку.
Функция СнятьЭкранированиеXML(ЭкранированнаяСтрока) Экспорт
Результат = "";
Попытка
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ЭкранированнаяСтрока);
// Читаем как фрагмент, чтобы обработать частичный XML
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
// Начинаем сборку результирующего XML
Результат = Результат + "<" + Чтение.Имя;
// Обрабатываем атрибуты, если они есть
Для Каждого Атр Из Чтение.Атрибуты Цикл
Результат = Результат + " " + Атр.Имя + "=""" + Атр.Значение + """";
КонецЦикла;
Результат = Результат + ">";
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Результат = Результат + "</" + Чтение.Имя + ">";
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
// Текст внутри элемента — это и есть экранированная строка
// Её нужно декодировать: < → <, > → >, & → &
Результат = Результат + XMLСтрока(Чтение.Значение);
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Исключение
ЗаписьЖурналаРегистрации("Ошибка снятия экранирования XML",
УровеньЖурналаРегистрации.Ошибка, , ,
КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Результат = "";
КонецПопытки;
Возврат Результат;
КонецФункции
Примечание: ФункцияXMLСтрока()в платформе 1С выполняет обратное преобразование — заменяет сущности на реальные символы. Не путайте её сXMLСтрока()для экранирования (прямое преобразование). В данном контексте она работает как декодер.
Сравнение подходов: ручной разбор и автоматическое снятие экранирования
До появления описанного подхода разработчики часто использовали ручную замену символов через СтрЗаменить(). Однако такой метод ненадёжен при работе с вложенными структурами и спецсимволами в данных. Сравним оба подхода.
| Критерий | Ручная замена (СтрЗаменить) | Автоматическое снятие экранирования (ЧтениеXML) |
|---|---|---|
| Сложность реализации | Низкая (3-5 строк кода) | Средняя (требуется понимание XML-парсинга) |
| Обработка вложенных XML | Не поддерживается (только плоские строки) | Поддерживается (рекурсивный обход узлов) |
| Устойчивость к ошибкам | Низкая (пропуск сущностей, ложные замены) | Высокая (используется штатный парсер платформы) |
| Производительность | Высокая (простая операция со строками) | Средняя (создание объекта и обход DOM) |
| Рекомендация | Только для простых случаев (один уровень, без атрибутов) | Для всех промышленных интеграций с КИЗ |
Практические рекомендации
Если вы сопровождаете обмен с маркированными товарами, внедрите описанную функцию в свой модуль обработки входящих документов. Ниже — чек-лист для быстрой проверки.
Чек-лист внедрения
- Шаг 1. Найдите в конфигурации место, где разбираются входящие XML-документы от ЭДО (обычно это общие модули
ОбработкаВходящихДокументовЭДОилиРаботаСМаркировкой). - Шаг 2. Добавьте экспортную функцию
СнятьЭкранированиеXML(код выше) в соответствующий общий модуль. - Шаг 3. В месте, где извлекается значение элемента
<КИЗ>, вызовите эту функцию вместо прямого присвоения. - Шаг 4. Проверьте на тестовых документах: сравните результат с эталонным XML-фрагментом.
- Шаг 5. Обновите документацию по интеграции для своей команды.
Типичные ошибки
- Игнорирование атрибутов. В коде выше атрибуты обрабатываются явно. Если их пропустить, результирующий XML будет невалидным.
- Забыли про
Попытка/Исключение. Любой парсинг XML может завершиться ошибкой из-за некорректных данных от контрагента. Без обработки исключений вы рискуете получить неинформативную ошибку пользователю. - Путаница с
XMLСтрока(). Эта функция в 1С работает в обе стороны: если передать строку с сущностями — вернёт декодированный текст; если передать обычный текст — заэкранирует его. Убедитесь, что вы передаёте именно экранированную строку. - Использование
СтрЗаменить()для сложных случаев. Если внутри КИЗ есть кавычки или апострофы, ручная замена сломает структуру XML.
Законная оговорка: Приведённый код является примером и не учитывает специфику конкретной конфигурации (1С:Бухгалтерия, 1С:УТ, 1С:ERP). Перед внедрением в рабочую среду обязательно адаптируйте его под свою учётную политику и версию платформы. Все операции с КИЗ должны выполняться в соответствии с действующим законодательством о маркировке товаров.
Заключение
Функция снятия экранирования XML со строки данных КИЗ — это не просто технический приём, а необходимый инструмент для стабильной работы с маркировкой. Она позволяет избежать ручных замен, снижает риск ошибок при разборе документов и делает код более поддерживаемым. Рекомендуем включить её в стандартный набор инструментов каждого разработчика, работающего с ЭДО и «Честным ЗНАКом».
Перейти в каталог решений →