В разработке на 1С часто возникает задача обмена данными с другими системами, и формат XML остается одним из самых распространенных стандартов. Разработчики задаются вопросом: появились ли новые, более удобные инструменты для работы с XML в платформе, или все по-прежнему сводится к классическим методам, таким как ПостроительDOM? Давайте разберемся в текущих тенденциях, сравним основные подходы и рассмотрим практические примеры, чтобы понять, какой инструмент лучше всего подходит для конкретной задачи.
Хотя революционных изменений в работе с XML в 1С не произошло, практика выработала более глубокое понимание существующих механизмов и эффективные комбинации их использования. Проанализируем три основных кита, на которых держится обработка XML в 1С.
Платформа 1С предлагает несколько встроенных механизмов, каждый из которых имеет свои сильные и слабые стороны. Выбор конкретного инструмента напрямую зависит от размера файла, сложности его структуры и требуемых операций.
ЧтениеXML / ЗаписьXML)ПостроительDOM)ФабрикаXDTO)Рассмотрим, в каких ситуациях какой инструмент будет наиболее эффективен.
Когда контрагенты присылают большие 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 и относительное удобство навигации, которое мы пишем сами.
Для файлов небольшого и среднего размера ПостроительDOM в связке с XPath является самым мощным и удобным инструментом. Вместо того чтобы писать циклы для обхода дерева, можно одним запросом получить нужные узлы.
Например, чтобы найти все элементы <Item>, у которых атрибут Transit равен "0", не нужно писать сложный код. Достаточно использовать метод ВыбратьУзлы() объекта ДокументDOM:
// Построитель = Новый ПостроительDOM;
// Документ = Построитель.Прочитать(ЧтениеXML);
// Найти все узлы Item, у которых есть дочерний узел Transit со значением "0"
НайденныеУзлы = Документ.ВыбратьУзлы("//Item[Transit='0']");
Для Каждого Узел ИЗ НайденныеУзлы Цикл
// Обработка найденных узлов
КонецЦикла;
XPath — это стандарт, и его знание значительно упрощает разбор XML любой сложности, позволяя избежать написания громоздких самописных функций поиска.
ФабрикаXDTO — это стандарт де-факто для обменов между конфигурациями 1С (например, через планы обмена). Но ее можно использовать и для работы с произвольными XML.
Интересная возможность — чтение XML без схемы. В этом случае 1С создаст универсальный ОбъектXDTO, где все значения будут иметь тип Строка, но структура документа будет представлена в виде вложенных объектов. Это может быть удобной альтернативой ПостроительDOM.
// ЧтениеXML = Новый ЧтениеXML;
// ЧтениеXML.ОткрытьФайл(ИмяФайла);
Данные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML); // Схема не требуется
// Доступ к данным будет объектным
ЗначениеID = Данные.Items.Item[0].Id;
Однако при работе с XDTO, особенно при десериализации XML в объекты 1С, есть важный нюанс.
При загрузке данных из XML в объект 1С (например, в документ или элемент справочника) с помощью XDTO, порядок элементов в XML-файле должен строго соответствовать порядку реквизитов в метаданных объекта 1С. Если порядок будет нарушен, данные не загрузятся, и система может выдать ошибку или просто проигнорировать "неправильные" поля.
Например, если в справочнике "Номенклатура" реквизиты идут в порядке "Артикул", "Наименование", "СтавкаНДС", то и в XML-файле для корректной десериализации элементы должны идти в том же порядке. Это коренное отличие от большинства других парсеров, где порядок дочерних элементов обычно не важен.
Это не ошибка, а особенность реализации XDTO в 1С, которую необходимо учитывать при проектировании обменов. Если вы не контролируете формат входящего XML, лучше использовать более гибкие методы, такие как ПостроительDOM или собственный парсер.
Действительно, наблюдается глобальная тенденция перехода на JSON в новых проектах и веб-сервисах. JSON более легковесный, проще для чтения человеком и парсинга. 1С также предоставляет инструменты для работы с ним (ЧтениеJSON, ЗаписьJSON).
Тем не менее, XML никуда не ушел и остается незаменимым в сферах, где важны:
Поэтому разработчику 1С необходимо уверенно владеть инструментами для работы с обоими форматами.
Итог: Новых революционных инструментов для XML в 1С не появилось. Однако глубокое понимание сильных и слабых сторон существующих механизмов — ЧтениеXML, ПостроительDOM, ФабрикаXDTO — позволяет выбрать оптимальное решение для любой задачи, будь то парсинг гигабайтного файла, сложный поиск данных или строго типизированный обмен.