Актуальные подходы к работе с XML в 1С: что нового и какой метод выбрать?

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

В разработке на 1С часто возникает задача обмена данными с другими системами, и формат XML остается одним из самых распространенных стандартов. Разработчики задаются вопросом: появились ли новые, более удобные инструменты для работы с XML в платформе, или все по-прежнему сводится к классическим методам, таким как ПостроительDOM? Давайте разберемся в текущих тенденциях, сравним основные подходы и рассмотрим практические примеры, чтобы понять, какой инструмент лучше всего подходит для конкретной задачи.

Хотя революционных изменений в работе с XML в 1С не произошло, практика выработала более глубокое понимание существующих механизмов и эффективные комбинации их использования. Проанализируем три основных кита, на которых держится обработка XML в 1С.

Основные инструменты для работы с XML

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

  1. Последовательное чтение и запись (ЧтениеXML / ЗаписьXML)
    Это самый низкоуровневый и производительный способ. Он работает как потоковый анализатор: читает файл узел за узлом, не загружая его целиком в память.
    • Преимущества: Минимальное потребление оперативной памяти. Идеально подходит для обработки очень больших файлов (сотни мегабайт и гигабайты), которые просто не поместятся в память целиком.
    • Недостатки: Сложность в навигации. Чтобы получить доступ к вложенному элементу, нужно вручную отслеживать иерархию узлов. Этот подход требует написания более сложного кода для анализа структуры документа.
  2. Объектная модель документа (ПостроительDOM)
    Этот метод парсит весь XML-документ и строит в оперативной памяти его полное древовидное представление (DOM — Document Object Model).
    • Преимущества: Простота навигации. После построения дерева можно легко перемещаться по любому его узлу, получать дочерние и родительские элементы, изменять их. Поддерживает мощный язык запросов XPath для быстрого поиска нужных узлов.
    • Недостатки: Высокое потребление памяти. Весь документ загружается в ОЗУ, что делает этот метод непригодным для больших файлов.
  3. Объекты передачи данных (ФабрикаXDTO)
    Это наиболее современный и мощный механизм, основанный на технологии XDTO (XML Data Transfer Objects). Он позволяет напрямую преобразовывать (сериализовать и десериализовать) XML в типизированные объекты 1С и обратно.
    • Преимущества: Строгая типизация. Если есть схема (XSD), 1С автоматически преобразует XML в объекты с нужными типами данных (Число, Дата, Булево и т.д.). Удобная объектная модель для доступа к данным.
    • Недостатки: Может показаться сложным для новичков ("тугая и непрозрачная вещь"). Требует понимания пакетов XDTO и схем.

Практические сценарии и сравнение подходов

Рассмотрим, в каких ситуациях какой инструмент будет наиболее эффективен.

Сценарий 1: Обработка больших файлов или работа без строгой схемы

Когда контрагенты присылают большие XML-файлы или их структура не всегда соответствует строгой схеме, стандартные инструменты могут быть неудобны. ПостроительDOM съест всю память, а ФабрикаXDTO без схемы может показаться избыточной. В таких случаях разработчики часто пишут собственные парсеры на основе ЧтениеXML.

Рассмотрим пример такого универсального парсера, который рекурсивно обходит XML и преобразует его в удобную структуру из массивов и соответствий. Этот код может работать как на клиенте, так и на сервере.

Функция разбора XML в массив структур:


&НаКлиенте
Функция РазобратьXML(Ч, Строки = Неопределено, РодительскаяСтрока = Неопределено) Экспорт
    Если Строки = Неопределено Тогда
        Строки = Новый Массив();
    КонецЕсли;
    
    Пока Ч.Прочитать() Цикл
        Если Ч.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ТекСтрока = Новый Структура("Тег, Родитель, Тип, Тело", Ч.Имя, РодительскаяСтрока);
            ТекСтрока.Вставить("Атрибуты", Новый Соответствие());
            ТекСтрока.Вставить("Строки", Новый Массив());
            Строки.Добавить(ТекСтрока);
            
            Если Ч.КоличествоАтрибутов() > 0 Тогда
                Пока Ч.ПрочитатьАтрибут() Цикл
                    ТекСтрока.Атрибуты.Вставить(Ч.Имя, Ч.Значение);
                КонецЦикла
            КонецЕсли;
            РазобратьXML(Ч, ТекСтрока.Строки, ТекСтрока);
        ИначеЕсли Ч.ТипУзла = ТипУзлаXML.Текст Тогда
            РодительскаяСтрока.Тело = Ч.Значение;
        ИначеЕсли Ч.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            Возврат Неопределено;
        ИначеЕсли Ч.ТипУзла = ТипУзлаXML.ИнструкцияОбработки Тогда
            РодительскаяСтрока.Тело = Ч.Значение;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Строки;
КонецФункции

Для удобства навигации по полученной структуре можно использовать вспомогательные функции поиска:


&НаКлиенте
Функция НайтиТегXML(Строки, Тег) Экспорт
    Для Каждого Строка ИЗ Строки Цикл
        Если Строка.Тег = Тег Тогда
            Возврат Строка;
        КонецЕсли;
    КонецЦикла;
КонецФункции

&НаКлиенте
Функция НайтиЗначениеТегаXML(Строки, Тег) Экспорт
    Для Каждого Строка ИЗ Строки Цикл
        Если Строка.Тег = Тег Тогда
            Возврат Строка.Тело;
        КонецЕсли;
    КонецЦикла;
КонецФункции

Пример использования этого парсера выглядит очень наглядно и читаемо:


// Предполагается, что переменная "Строки" содержит результат вызова РазобратьXML()
ТегСообщение = НайтиТегXML(Строки, "Message"); 
ТегBody = НайтиТегXML(ТегСообщение.Строки, "Body"); 

Для Каждого Строка ИЗ ТегBody.Строки Цикл 
    
    Если Строка.Тег = "Справочник.Организации" Тогда
        
        ТекКлючевые = НайтиТегXML(Строка.Строки, "КлючевыеСвойства"); 
        ИДОрганизации = НайтиЗначениеТегаXML(ТекКлючевые.Строки, "Ссылка"); 
        ИНН = НайтиЗначениеТегаXML(ТекКлючевые.Строки, "ИНН"); 
        КПП = НайтиЗначениеТегаXML(ТекКлючевые.Строки, "КПП"); 
        
        Организация = НайтиОрганизацию(ИНН, КПП);
        Если Организация = Неопределено Тогда
            ВызватьИсключение "Не найдена организация с ИНН: " + ИНН + " и КПП: " + КПП;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Такой подход сочетает производительность ЧтениеXML и относительное удобство навигации, которое мы пишем сами.

Сценарий 2: Поиск данных в документах средней сложности

Для файлов небольшого и среднего размера ПостроительDOM в связке с XPath является самым мощным и удобным инструментом. Вместо того чтобы писать циклы для обхода дерева, можно одним запросом получить нужные узлы.

Например, чтобы найти все элементы <Item>, у которых атрибут Transit равен "0", не нужно писать сложный код. Достаточно использовать метод ВыбратьУзлы() объекта ДокументDOM:


// Построитель = Новый ПостроительDOM;
// Документ = Построитель.Прочитать(ЧтениеXML);

// Найти все узлы Item, у которых есть дочерний узел Transit со значением "0"
НайденныеУзлы = Документ.ВыбратьУзлы("//Item[Transit='0']");

Для Каждого Узел ИЗ НайденныеУзлы Цикл
    // Обработка найденных узлов
КонецЦикла;

XPath — это стандарт, и его знание значительно упрощает разбор XML любой сложности, позволяя избежать написания громоздких самописных функций поиска.

Сценарий 3: Типизированный обмен данными

ФабрикаXDTO — это стандарт де-факто для обменов между конфигурациями 1С (например, через планы обмена). Но ее можно использовать и для работы с произвольными XML.

Интересная возможность — чтение XML без схемы. В этом случае 1С создаст универсальный ОбъектXDTO, где все значения будут иметь тип Строка, но структура документа будет представлена в виде вложенных объектов. Это может быть удобной альтернативой ПостроительDOM.


// ЧтениеXML = Новый ЧтениеXML;
// ЧтениеXML.ОткрытьФайл(ИмяФайла);
Данные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML); // Схема не требуется

// Доступ к данным будет объектным
ЗначениеID = Данные.Items.Item[0].Id;

Однако при работе с XDTO, особенно при десериализации XML в объекты 1С, есть важный нюанс.

Критический нюанс XDTO: порядок реквизитов имеет значение!

При загрузке данных из XML в объект 1С (например, в документ или элемент справочника) с помощью XDTO, порядок элементов в XML-файле должен строго соответствовать порядку реквизитов в метаданных объекта 1С. Если порядок будет нарушен, данные не загрузятся, и система может выдать ошибку или просто проигнорировать "неправильные" поля.

Например, если в справочнике "Номенклатура" реквизиты идут в порядке "Артикул", "Наименование", "СтавкаНДС", то и в XML-файле для корректной десериализации элементы должны идти в том же порядке. Это коренное отличие от большинства других парсеров, где порядок дочерних элементов обычно не важен.

Это не ошибка, а особенность реализации XDTO в 1С, которую необходимо учитывать при проектировании обменов. Если вы не контролируете формат входящего XML, лучше использовать более гибкие методы, такие как ПостроительDOM или собственный парсер.

XML против JSON: что в тренде?

Действительно, наблюдается глобальная тенденция перехода на JSON в новых проектах и веб-сервисах. JSON более легковесный, проще для чтения человеком и парсинга. 1С также предоставляет инструменты для работы с ним (ЧтениеJSON, ЗаписьJSON).

Тем не менее, XML никуда не ушел и остается незаменимым в сферах, где важны:

Поэтому разработчику 1С необходимо уверенно владеть инструментами для работы с обоими форматами.

Итог: Новых революционных инструментов для XML в 1С не появилось. Однако глубокое понимание сильных и слабых сторон существующих механизмов — ЧтениеXML, ПостроительDOM, ФабрикаXDTO — позволяет выбрать оптимальное решение для любой задачи, будь то парсинг гигабайтного файла, сложный поиск данных или строго типизированный обмен.

← На главную