Работа с XML-файлами в 1С — это повседневная задача для разработчика, будь то интеграция со сторонними сервисами, выгрузка отчетности или обмен данными между базами. Однако ручное написание кода для формирования или парсинга сложных XML-структур — процесс трудоемкий и монотонный. Нам приходится раз за разом писать однотипные команды ЗаписатьНачалоЭлемента или ЗаписатьАтрибут, что увеличивает риск опечаток.
В этой статье мы разберем по шагам, как автоматизировать этот процесс, проанализируем существующие подходы и выясним, как превратить образец XML-файла в готовый программный модуль на встроенном языке 1С.
Рассмотрим стандартную ситуацию: перед программистом стоит задача реализовать выгрузку данных в формате XML, имея на руках только пример файла. Обычно это выглядит так:
ЗаписьXML.ЗаписатьНачалоЭлемента("ИмяУзла").ЗаписьXML.ЗаписатьАтрибут("ИмяАтрибута", Значение).Если в файле 100 и более узлов с глубокой вложенностью, работа превращается в механическое копирование строк. Именно здесь возникает идея: почему бы не использовать сам XML-файл как шаблон для генерации кода? Ведь структура XML строго детерминирована, и связь между тегом в файле и командой в 1С действительно однозначна.
Один из самых простых способов автоматизации — написать небольшую «мета-обработку». Суть ее заключается в том, что мы читаем образец XML через объект ПостроительDOM, а затем рекурсивно обходим дерево, выводя в текстовое поле готовые строки кода 1С.
Проанализируем пример логики такого генератора:
Процедура СгенерироватьКод(УзелDOM, Отступ = "")
Для Каждого ТекущийУзел Из УзелDOM.ДочерниеУзлы Цикл
Если ТекущийУзел.ТипУзла = ТипУзлаDOM.Элемент Тогда
ТекстКода = ТекстКода + Отступ + "ЗаписьXML.ЗаписатьНачалоЭлемента(""" + ТекущийУзел.ИмяУзла + """);" + Символы.ПС;
// Обработка атрибутов
Для Каждого Атрибут Из ТекущийУзел.Атрибуты Цикл
ТекстКода = ТекстКода + Отступ + "ЗаписьXML.ЗаписатьАтрибут(""" + Атрибут.Имя + """, ""Значение"");" + Символы.ПС;
КонецЦикла;
// Рекурсивный вызов для вложенных узлов
СгенерироватьКод(ТекущийУзел, Отступ + " ");
ТекстКода = ТекстКода + Отступ + "ЗаписьXML.ЗаписатьКонецЭлемента();" + Символы.ПС;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Используя такой подход, мы получаем готовый «скелет» процедуры. Нам остается только заменить строковые константы "Значение" на реальные реквизиты объектов 1С, например Объект.Наименование или Выборка.Цена. Это напоминает работу Конструктора запроса: платформа генерирует структуру, а мы наполняем ее смыслом.
Если задача выходит за рамки разовой выгрузки, рассмотрим профессиональный механизм — использование XDTO (XML Data Transfer Objects). Платформа 1С уже содержит мощный инструмент автоматизации связи XML и кода.
Вместо того чтобы генерировать текст программы, мы можем:
XDTO-пакет.Посмотрим на пример того, как лаконично выглядит код при использовании XDTO:
// Создание объекта по схеме
НовыйОбъект = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.example.org", "ДанныеДокумента"));
НовыйОбъект.Номер = Объект1С.Номер;
НовыйОбъект.Дата = Объект1С.Дата;
// Автоматическая запись в XML без ручного перебора тегов
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, НовыйОбъект);
Важный момент: использование XDTO избавляет нас от необходимости следить за порядком тегов и правильностью закрытия узлов — платформа делает это автоматически на основе схемы.
Иногда нам нужно не просто сформировать XML из данных 1С, а преобразовать один XML в другой (например, выгрузку из 1С в формат конкретного банка). В этом случае вместо написания огромного модуля на 1С проанализируем возможность использования XSL-шаблонов.
Объект ПреобразованиеXSL позволяет применить файл стилей к XML-документу. Это фактически выносит логику формирования структуры файла за пределы кода 1С в специализированный декларативный формат. Это особенно полезно, когда формат XML часто меняется внешней стороной: вам не нужно перекомпилировать код 1С, достаточно поправить текстовый .xsl файл.
Для тех, кто не хочет писать свой генератор кода, в сообществе 1С существуют готовые инструменты. Часто они называются «Генератор кода XML по образцу». Вы вставляете в левое окно пример вашего XML, нажимаете кнопку, и в правом окне получаете листинг на языке 1С с использованием ЗаписьXML или ПостроительDOM.
Такие обработки полезны тем, что они умеют:
Как отмечалось в обсуждении на форуме, главная сложность — это не само создание тегов, а преобразование данных. Автоматическая генерация кода позволяет программисту сфокусироваться именно на бизнес-логике: откуда взять данные и как их трансформировать, не отвлекаясь на синтаксис XML. Это повышает качество кода и снижает количество ошибок «забытого закрытого тега».
Подведем итог: если вам нужно быстро создать процедуру для работы с XML, используйте простые генераторы кода на основе DOM. Если же проект крупный и предполагает долгосрочную поддержку — лучше один раз потратить время на создание XDTO-пакета, что обеспечит максимальную надежность и чистоту вашего кода.