Как автоматически сгенерировать программный код 1С для работы с XML-файлами

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

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

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

Проблема «ручного» кодинга при работе с XML

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

  1. Программист открывает текстовый редактор с XML-примером.
  2. В конфигураторе 1С создается процедура.
  3. Для каждого узла в XML вручную прописывается команда ЗаписьXML.ЗаписатьНачалоЭлемента("ИмяУзла").
  4. Для каждого атрибута — ЗаписьXML.ЗаписатьАтрибут("ИмяАтрибута", Значение).

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

Решение 1: Генерация кода на основе DOM-модели

Один из самых простых способов автоматизации — написать небольшую «мета-обработку». Суть ее заключается в том, что мы читаем образец XML через объект ПостроительDOM, а затем рекурсивно обходим дерево, выводя в текстовое поле готовые строки кода 1С.

Проанализируем пример логики такого генератора:


Процедура СгенерироватьКод(УзелDOM, Отступ = "")
    Для Каждого ТекущийУзел Из УзелDOM.ДочерниеУзлы Цикл
        Если ТекущийУзел.ТипУзла = ТипУзлаDOM.Элемент Тогда
            ТекстКода = ТекстКода + Отступ + "ЗаписьXML.ЗаписатьНачалоЭлемента(""" + ТекущийУзел.ИмяУзла + """);" + Символы.ПС;
            
            // Обработка атрибутов
            Для Каждого Атрибут Из ТекущийУзел.Атрибуты Цикл
                ТекстКода = ТекстКода + Отступ + "ЗаписьXML.ЗаписатьАтрибут(""" + Атрибут.Имя + """, ""Значение"");" + Символы.ПС;
            КонецЦикла;
            
            // Рекурсивный вызов для вложенных узлов
            СгенерироватьКод(ТекущийУзел, Отступ + "    ");
            
            ТекстКода = ТекстКода + Отступ + "ЗаписьXML.ЗаписатьКонецЭлемента();" + Символы.ПС;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Используя такой подход, мы получаем готовый «скелет» процедуры. Нам остается только заменить строковые константы "Значение" на реальные реквизиты объектов 1С, например Объект.Наименование или Выборка.Цена. Это напоминает работу Конструктора запроса: платформа генерирует структуру, а мы наполняем ее смыслом.

Решение 2: Использование технологии XDTO (наиболее правильный путь)

Если задача выходит за рамки разовой выгрузки, рассмотрим профессиональный механизм — использование XDTO (XML Data Transfer Objects). Платформа 1С уже содержит мощный инструмент автоматизации связи XML и кода.

Вместо того чтобы генерировать текст программы, мы можем:

  1. Импортировать в конфигурацию XSD-схему (описание структуры XML).
  2. Создать XDTO-пакет.
  3. Работать с XML как с обычным объектом 1С через точку.

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


// Создание объекта по схеме
НовыйОбъект = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.example.org", "ДанныеДокумента"));
НовыйОбъект.Номер = Объект1С.Номер;
НовыйОбъект.Дата  = Объект1С.Дата;

// Автоматическая запись в XML без ручного перебора тегов
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, НовыйОбъект);

Важный момент: использование XDTO избавляет нас от необходимости следить за порядком тегов и правильностью закрытия узлов — платформа делает это автоматически на основе схемы.

Решение 3: XSLT-преобразования

Иногда нам нужно не просто сформировать XML из данных 1С, а преобразовать один XML в другой (например, выгрузку из 1С в формат конкретного банка). В этом случае вместо написания огромного модуля на 1С проанализируем возможность использования XSL-шаблонов.

Объект ПреобразованиеXSL позволяет применить файл стилей к XML-документу. Это фактически выносит логику формирования структуры файла за пределы кода 1С в специализированный декларативный формат. Это особенно полезно, когда формат XML часто меняется внешней стороной: вам не нужно перекомпилировать код 1С, достаточно поправить текстовый .xsl файл.

Решение 4: Готовые инструменты и консоли

Для тех, кто не хочет писать свой генератор кода, в сообществе 1С существуют готовые инструменты. Часто они называются «Генератор кода XML по образцу». Вы вставляете в левое окно пример вашего XML, нажимаете кнопку, и в правом окне получаете листинг на языке 1С с использованием ЗаписьXML или ПостроительDOM.

Такие обработки полезны тем, что они умеют:

Выясним причину, почему автоматизация важна

Как отмечалось в обсуждении на форуме, главная сложность — это не само создание тегов, а преобразование данных. Автоматическая генерация кода позволяет программисту сфокусироваться именно на бизнес-логике: откуда взять данные и как их трансформировать, не отвлекаясь на синтаксис XML. Это повышает качество кода и снижает количество ошибок «забытого закрытого тега».

Подведем итог: если вам нужно быстро создать процедуру для работы с XML, используйте простые генераторы кода на основе DOM. Если же проект крупный и предполагает долгосрочную поддержку — лучше один раз потратить время на создание XDTO-пакета, что обеспечит максимальную надежность и чистоту вашего кода.

← На главную