Как правильно записывать атрибуты и значения XML-элементов в 1С?

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

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

Основы записи элементов и атрибутов

Разберем типичную ситуацию: нам нужно сформировать заголовок документа, где идентификатор (GUID) должен быть атрибутом тега, а остальные данные — вложенными элементами. Рассмотрим структуру, которую мы хотим получить:


<Документ Идентификатор="a83f0f99-ff26-11e6-8353-2c768aacbc92">
    <ТипДок>ПРХ</ТипДок>
    <Комиссия>1</Комиссия>
</Документ>

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

  1. Запись начала элемента: Сначала мы открываем тег с помощью метода ЗаписатьНачалоЭлемента("ИмяТега").
  2. Запись атрибутов: Сразу после открытия тега, до записи какого-либо текста или вложенных узлов, необходимо вызвать метод ЗаписатьАтрибут("ИмяАтрибута", "Значение").
  3. Запись содержимого: После того как все атрибуты текущего тега определены, мы можем записывать внутренний текст (ЗаписатьТекст) или открывать новые вложенные элементы.
  4. Закрытие элемента: Каждый открытый элемент должен быть закрыт методом ЗаписатьКонецЭлемента().

Рассмотрим конкретный пример кода на языке 1С, реализующий эту логику:


// Создаем объект записи
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Exchange\document.xml", "windows-1251");

// Записываем корневой элемент с атрибутом
ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");
ЗаписьXML.ЗаписатьАтрибут("Идентификатор", Строка(СсылкаНаДокумент.УникальныйИдентификатор()));

// Записываем вложенный элемент с текстовым значением
ЗаписьXML.ЗаписатьНачалоЭлемента("ТипДок");
ЗаписьXML.ЗаписатьТекст("ПРХ");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем ТипДок

// Записываем еще один вложенный элемент
ЗаписьXML.ЗаписатьНачалоЭлемента("Комиссия");
ЗаписьXML.ЗаписатьТекст("1");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем Комиссия

// Закрываем основной элемент Документ
ЗаписьXML.ЗаписатьКонецЭлемента();

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

Важность использования функции XMLСтрока

Проанализируем ситуацию с типами данных. В 1С мы работаем с объектами типа Дата, Число, Булево или УникальныйИдентификатор. Если просто использовать функцию Строка(), результат будет зависеть от региональных настроек системы (например, дата может содержать точки, а число — неразрывные пробелы в качестве разделителей разрядов). Это сделает XML-файл невалидным для большинства внешних систем.

Для корректного преобразования типов данных 1С в стандартные форматы XML (XSD) необходимо всегда использовать функцию XMLСтрока(). Выясним, что она делает:

Посмотрим на исправленный фрагмент кода с использованием этой функции:


ЗаписьXML.ЗаписатьНачалоЭлемента("ДатаДок");
ЗаписьXML.ЗаписатьТекст(XMLСтрока(Объект.Дата));
ЗаписьXML.ЗаписатьКонецЭлемента();

ЗаписьXML.ЗаписатьНачалоЭлемента("Сумма");
ЗаписьXML.ЗаписатьТекст(XMLСтрока(Объект.СуммаДокумента));
ЗаписьXML.ЗаписатьКонецЭлемента();

Настройка форматирования (красивый XML)

По умолчанию ЗаписьXML формирует файл "в одну строку" без отступов и переносов, что неудобно для анализа человеком. Чтобы сделать файл читаемым, воспользуемся объектом ПараметрыЗаписиXML. Рассмотрим, как настроить отступы:


ПараметрыЗаписи = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Символы.Таб);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Exchange\pretty.xml", ПараметрыЗаписи);

Параметр Истина включает режим отступов, а Символы.Таб указывает, какой символ использовать для визуального разделения уровней вложенности.

Альтернативные методы формирования XML

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

Метод 1: Использование DOM (объектная модель документа)

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


ДокументDOM = Новый ДокументDOM;
КорневойУзел = ДокументDOM.СоздатьЭлемент("Данные");
ДокументDOM.ДобавитьПодчиненный(КорневойУзел);

НовыйЭлемент = ДокументDOM.СоздатьЭлемент("Номенклатура");
НовыйЭлемент.УстановитьАтрибут("Код", "00001");
КорневойУзел.ДобавитьПодчиненный(НовыйЭлемент);

// Запись DOM в файл
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьXML_DOM = Новый ЗаписьXML;
ЗаписьXML_DOM.ОткрытьФайл("C:\Exchange\dom.xml");
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML_DOM);
ЗаписьXML_DOM.Закрыть();

Метод 2: Использование XDTO (XML Data Transfer Objects)

Это наиболее современный и "правильный" способ в экосистеме 1С. Мы описываем структуру данных в специальном объекте конфигурации "Схема XDTO", после чего работаем с данными как с обычными объектами 1С. Система сама заботится о названиях тегов, типах и пространствах имен. Проанализируем преимущества:

Резюме

Для решения простых задач выгрузки данных достаточно освоить триаду методов ЗаписатьНачалоЭлемента, ЗаписатьАтрибут и ЗаписатьТекст. Главное — помнить о строгой последовательности: атрибуты записываются строго после открытия тега и до любого другого содержимого. Использование XMLСтрока и ПараметрыЗаписиXML сделает ваши файлы профессиональными и совместимыми с любыми стандартами обмена данными.

← На главную