Функция снятия экранирования XML со строки данных КИЗ | infolimp.ru

Функция снятия экранирования XML со строки данных КИЗ

16 июня 2026 · infolimp.ru

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

Проблема экранирования XML в данных КИЗ

При обмене документами через оператора ЭДО (например, через сервисы 1С-ЭДО или сторонние платформы) коды КИЗ часто передаются в виде экранированных XML-строк. Это означает, что символы <, >, & и другие заменяются на их сущности (&lt;, &gt;, &amp;). В результате строка, которая должна быть корректным XML-фрагментом, превращается в обычный текст, непригодный для прямого разбора.

Как это выглядит на практике

Типичная ситуация: входящий XML-документ содержит элемент <КИЗ>, внутри которого лежит экранированная строка:

<КИЗ>&lt;КодМаркировки&gt;010463...&lt;/КодМаркировки&gt;</КИЗ>

При попытке прочитать такой элемент стандартными средствами ЧтениеXML платформа 1С воспринимает содержимое как простой текст, а не как вложенный XML. Это приводит к тому, что разбор КИЗ требует дополнительного шага — снятия экранирования.

Ключевой тезис: Без снятия экранирования XML вы не сможете программно извлечь отдельные реквизиты КИЗ (код товара, серийный номер, криптохвост) из строки, полученной от контрагента. Это ведёт к ошибкам при формировании уведомлений о вводе/выводе из оборота.

Функция снятия экранирования: реализация в 1С

Для решения задачи используется встроенная возможность платформы — объект ЧтениеXML в режиме чтения фрагмента. Ниже приведён корректный код, который выполняет обратное преобразование экранированной строки в XML-фрагмент.

Алгоритм работы

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

Сравнение подходов: ручной разбор и автоматическое снятие экранирования

До появления описанного подхода разработчики часто использовали ручную замену символов через СтрЗаменить(). Однако такой метод ненадёжен при работе с вложенными структурами и спецсимволами в данных. Сравним оба подхода.

Критерий Ручная замена (СтрЗаменить) Автоматическое снятие экранирования (ЧтениеXML)
Сложность реализации Низкая (3-5 строк кода) Средняя (требуется понимание XML-парсинга)
Обработка вложенных XML Не поддерживается (только плоские строки) Поддерживается (рекурсивный обход узлов)
Устойчивость к ошибкам Низкая (пропуск сущностей, ложные замены) Высокая (используется штатный парсер платформы)
Производительность Высокая (простая операция со строками) Средняя (создание объекта и обход DOM)
Рекомендация Только для простых случаев (один уровень, без атрибутов) Для всех промышленных интеграций с КИЗ

Практические рекомендации

Если вы сопровождаете обмен с маркированными товарами, внедрите описанную функцию в свой модуль обработки входящих документов. Ниже — чек-лист для быстрой проверки.

Чек-лист внедрения

Типичные ошибки

  1. Игнорирование атрибутов. В коде выше атрибуты обрабатываются явно. Если их пропустить, результирующий XML будет невалидным.
  2. Забыли про Попытка/Исключение. Любой парсинг XML может завершиться ошибкой из-за некорректных данных от контрагента. Без обработки исключений вы рискуете получить неинформативную ошибку пользователю.
  3. Путаница с XMLСтрока(). Эта функция в 1С работает в обе стороны: если передать строку с сущностями — вернёт декодированный текст; если передать обычный текст — заэкранирует его. Убедитесь, что вы передаёте именно экранированную строку.
  4. Использование СтрЗаменить() для сложных случаев. Если внутри КИЗ есть кавычки или апострофы, ручная замена сломает структуру XML.
Законная оговорка: Приведённый код является примером и не учитывает специфику конкретной конфигурации (1С:Бухгалтерия, 1С:УТ, 1С:ERP). Перед внедрением в рабочую среду обязательно адаптируйте его под свою учётную политику и версию платформы. Все операции с КИЗ должны выполняться в соответствии с действующим законодательством о маркировке товаров.

Заключение

Функция снятия экранирования XML со строки данных КИЗ — это не просто технический приём, а необходимый инструмент для стабильной работы с маркировкой. Она позволяет избежать ручных замен, снижает риск ошибок при разборе документов и делает код более поддерживаемым. Рекомендуем включить её в стандартный набор инструментов каждого разработчика, работающего с ЭДО и «Честным ЗНАКом».

Профессиональные решения для 1С и marketplace-интеграций — каталог отчётов и инструментов на витрине НОПи.

Перейти в каталог решений →