Как создать XML из ОбъектXDTO с переносами строк и форматированием

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

При выгрузке данных из 1С в формат XML с использованием механизмов XDTO разработчики часто сталкиваются с тем, что итоговый файл записывается «в одну строку». Хотя такой формат абсолютно корректен для программного чтения, он крайне неудобен для анализа человеком (в таких ситуациях может помочь визуализация данных через XSLT), отладки или просмотра в обычном текстовом редакторе. Разберем подробно, как сделать структуру XML читабельной, добавив в нее автоматические переносы строк и отступы.

Проблема стандартной записи XDTO

Рассмотрим стандартную ситуацию: у нас есть готовый ОбъектXDTO, который мы хотим сохранить (подобным образом часто выполняется выгрузка обычных форм в xml). Типичный код, который используют начинающие разработчики, выглядит примерно так:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("windows-1251");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ДанныеXDTOПакета, "Файл",,, НазначениеТипаXML.Явное);
ТекстОбъектаXDTO = ЗаписьXML.Закрыть();

В данном случае метод УстановитьСтроку с одним параметром (кодировкой) не дает платформе указаний на форматирование. В результате получается монолитный блок текста без единого символа перевода строки. Если же вам требуется предварительная конвертация схемы XSD в модель XDTO, давайте выясним, как это исправить.

Основное решение: Использование объекта ПараметрыЗаписиXML

Для того чтобы XML стал «красивым», нам необходимо использовать специальный объект ПараметрыЗаписиXML. Этот объект позволяет гибко настроить визуальное представление документа. Проанализируем его конструктор, который принимает несколько важных аргументов:

  1. Кодировка: например, "UTF-8" или "windows-1251".
  2. Версия: обычно оставляют пустым (по умолчанию 1.0).
  3. Отступ: Булево. Если установить Истина, платформа начнет добавлять переносы строк и отступы для вложенных узлов.
  4. Отступ атрибутов: Булево. Если Истина, каждый атрибут тега будет записываться с новой строки.
  5. Символы отступа: строка, которая будет использоваться в качестве отступа (например, табуляция или несколько пробелов).

Перепишем наш исходный код, применяя правильные параметры:


ПараметрыЗаписи = Новый ПараметрыЗаписиXML("windows-1251", , Истина, Ложь, Символы.Таб);

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку(ПараметрыЗаписи); // Передаем объект параметров вместо просто строки кодировки
ЗаписьXML.ЗаписатьОбъявлениеXML();

ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ДанныеXDTOПакета, "КорневойУзел");

ТекстXML = ЗаписьXML.Закрыть();

Важный нюанс: Обратите внимание, что метод УстановитьСтроку имеет несколько вариантов синтаксиса (перегрузок). Если передать в него просто строку, это будет воспринято как кодировка. Если же передать объект типа ПараметрыЗаписиXML, платформа применит все настройки форматирования.

Альтернативный метод: Запись напрямую в файл

Если планируется создание объемного XML-документа, использование метода УстановитьСтроку может привести к чрезмерному потреблению оперативной памяти, так как вся текстовая строка будет храниться в RAM. В таких случаях мы рекомендуем использовать метод ОткрытьФайл или автоматическое разделение выгрузки на части. Он точно так же поддерживает работу с параметрами записи.

Рассмотрим пример записи напрямую на диск:


ПутьКФайлу = "C:\Exchange\Export.xml";
ПараметрыЗаписи = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Ложь, "    "); // 4 пробела для отступа

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу, ПараметрыЗаписи);
ЗаписьXML.ЗаписатьОбъявлениеXML();

ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);

ЗаписьXML.Закрыть();

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

Форматирование уже существующей строки через DOM

Иногда возникает ситуация, когда XML уже получен в виде «сжатой» строки (например, пришел из веб-сервиса), и нам нужно его отформатировать постфактум. В 1С это удобно сделать через Объектную Модель Документа (DOM).

Посмотрим на алгоритм действий:

  1. Создаем объект ЧтениеXML и загружаем в него «сырую» строку.
  2. Используем ПостроительDOM для создания объекта ДокументDOM.
  3. Создаем ЗаписьXML с нужными нам параметрами форматирования (отступами).
  4. Используем объект ЗаписьDOM для выгрузки документа обратно в строку или файл.

Проанализируем пример кода для этого случая:


// 1. Читаем исходную сжатую строку
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СжатыйXML);

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

// 3. Настраиваем красивую запись
Запись = Новый ЗаписьXML;
Параметры = Новый ПараметрыЗаписиXML("UTF-8", , Истина, Ложь, Символы.Таб);
Запись.УстановитьСтроку(Параметры);

// 4. Записываем DOM обратно
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, Запись);

Результат = Запись.Закрыть();

Нюансы производительности и объема данных

Нужно учитывать, что «красивый» XML с отступами и переносами строк всегда весит больше, чем его компактная версия. Для глубоко вложенных структур данных объем файла может увеличиться на 15–30%. Если файл предназначен исключительно для автоматического обмена между серверами (где его не будет открывать человек), мы рекомендуем отключать форматирование (параметр Отступ = Ложь) для экономии трафика и ресурсов процессора на сериализацию.

Также важно помнить о кодировке BOM (Byte Order Mark). При создании файлов в UTF-8 некоторые внешние системы могут некорректно обрабатывать первый невидимый символ метки порядка байтов. Если вы столкнулись с такой проблемой, 1С позволяет управлять записью через объект ЗаписьДанных, который оборачивает ЗаписьXML, позволяя явно указать отсутствие BOM.

Управление пространствами имен и префиксами

Красота XML-файла заключается не только в переносах строк, но и в понятных префиксах пространств имен (Namespaces). При стандартной записи через XDTO платформа часто генерирует автоматические префиксы вида d2p1, d3p1 и так далее.

Чтобы сделать XML еще более читабельным, перед началом записи объекта можно принудительно сопоставить префиксы в объекте ЗаписьXML:


ЗаписьXML.УстановитьСтроку(ПараметрыЗаписи);
// Сопоставляем префиксы ДО записи XDTO
ЗаписьXML.ЗаписатьСоответствиеПрефикса("exc", "http://www.example.com/exchange");
ЗаписьXML.ЗаписатьСоответствиеПрефикса("md", "http://www.example.com/metadata");

ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ДанныеXDTO);

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

Заключение

Мы выяснили, что основным инструментом для создания структурированного XML в 1С является объект ПараметрыЗаписиXML. Правильное его использование в методах УстановитьСтроку или ОткрытьФайл позволяет добиться идеального визуального оформления документа. Для сложных случаев, когда нужно преобразовать уже готовую строку, на помощь приходит механизм DOM. Выбирайте подходящий метод в зависимости от объема ваших данных и требований принимающей стороны.

← На главную