Как записать элемент XML с атрибутами в 1С:Предприятие

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

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

Основная задача: создание узла с атрибутом

Рассмотрим ситуацию, когда нам необходимо получить XML-код следующего вида:

<DISTR_CONN ID="dist_000_00">

Частой ошибкой начинающих разработчиков является попытка записать значение атрибута через метод ЗаписатьТекст. Однако этот метод предназначен для записи текстового содержимого внутри тега, а не его параметров. Давайте проанализируем правильный подход.

Для создания элемента с атрибутом необходимо соблюдать строгую последовательность вызова методов объекта ЗаписьXML. Сначала мы открываем сам элемент, а затем сразу же прописываем его атрибуты.

Пример кода для решения задачи:


// Инициализируем объект записи
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Exchange\Data.xml", "UTF-8");

// Записываем начало элемента
ЗаписьXML.ЗаписатьНачалоЭлемента("DISTR_CONN");

// СРАЗУ после начала элемента записываем атрибут
ЗаписьXML.ЗаписатьАтрибут("ID", "dist_000_00");

// Если нужно добавить текст внутри тега
ЗаписьXML.ЗаписатьТекст("Произвольное текстовое содержимое");

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

// Завершаем работу с файлом
ЗаписьXML.Закрыть();

Важность порядка вызова методов

Разберем критически важный нюанс: метод ЗаписатьАтрибут может быть вызван только непосредственно после ЗаписатьНачалоЭлемента. Как только вы вызываете любой другой метод записи содержимого (например, ЗаписатьТекст, ЗаписатьКомментарий или открываете новый вложенный элемент), «окно» для добавления атрибутов к текущему родительскому узлу закрывается. Попытка вызвать ЗаписатьАтрибут позже приведет к возникновению ошибки времени выполнения.

Посмотрим на ошибочный вариант, который не сработает:


ЗаписьXML.ЗаписатьНачалоЭлемента("DISTR_CONN");
ЗаписьXML.ЗаписатьТекст("Текст"); 
// ОШИБКА: атрибут нельзя записывать после текста или вложенных узлов
ЗаписьXML.ЗаписатьАтрибут("ID", "TEST"); 

Настройка форматирования и параметров записи

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

Выясним, какие настройки можно задать:

  1. Отступы: использование пробелов или табуляции для визуального отображения вложенности.
  2. Кодировка: явное указание кодировки (например, "UTF-8" или "Windows-1251").
  3. Объявление XML: автоматическое добавление строки <?xml version="1.0" encoding="UTF-8"?>.

Рассмотрим пример настройки параметров:


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

// Записываем заголовок файла
ЗаписьXML.ЗаписатьОбъявлениеXML();

ЗаписьXML.ЗаписатьНачалоЭлемента("Root");
// ... дальнейшая логика записи ...
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();

Работа с пространствами имен (Namespaces)

В сложных интеграционных схемах часто требуется указывать пространства имен. Методы ЗаписатьНачалоЭлемента и ЗаписатьАтрибут поддерживают передачу URI пространства имен и префикса.

Проанализируем ситуацию, когда нам нужно получить узел вида <v8:Value xmlns:v8="http://v8.1c.ru/data">:


ЗаписьXML.ЗаписатьНачалоЭлемента("v8", "Value", "http://v8.1c.ru/data");
// Здесь также можно добавить атрибуты в контексте этого пространства имен
ЗаписьXML.ЗаписатьКонецЭлемента();

Специальные случаи: Секции CDATA

Если вам необходимо передать внутри XML-узла большой блок данных, содержащий спецсимволы (например, <, >, &), которые не должны интерпретироваться парсером, следует использовать секцию CDATA. Объект ЗаписьXML автоматически экранирует одиночные символы в обычных строках, но для целых фрагментов кода или других XML-документов лучше вызвать специализированный метод.

Пример использования:


ЗаписьXML.ЗаписатьНачалоЭлемента("RawData");
ЗаписьXML.ЗаписатьСекциюCDATA("Здесь может быть любой текст с символами < > & без ошибок");
ЗаписьXML.ЗаписатьКонецЭлемента();

Запись XML в строку памяти

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

Разберем, как это работает:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8"); // Указываем, что запись идет в память

ЗаписьXML.ЗаписатьНачалоЭлемента("Response");
ЗаписьXML.ЗаписатьАтрибут("Status", "Success");
ЗаписьXML.ЗаписатьКонецЭлемента();

// Получаем итоговую строку
РезультатСтрокой = ЗаписьXML.Закрыть();
Сообщить(РезультатСтрокой);

Альтернативный подход через XDTO

Если структура вашего XML строго определена схемой (XSD), ручное использование ЗаписьXML может быть избыточным и трудозатратным. В таких случаях эффективнее использовать Фабрику XDTO. Вы создаете объект XDTO на основе модели данных, заполняете его свойства, а затем записываете весь объект одной командой:

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

Этот метод автоматически сформирует все нужные узлы, атрибуты и пространства имен согласно правилам схемы. Для подготовки схемы под модель данных можно использовать инструмент для конвертации схемы XSD в модель XDTO.

Итог: Для записи простого атрибута в 1С используйте связку ЗаписатьНачалоЭлемента() и ЗаписатьАтрибут(). Всегда следите за порядком вызова функций и не забывайте закрывать объект методом Закрыть() для корректного освобождения ресурсов системы.

← На главную