Работа с 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С может записывать данные в одну строку, что затрудняет отладку.
Выясним, какие настройки можно задать:
<?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.Закрыть();
В сложных интеграционных схемах часто требуется указывать пространства имен. Методы ЗаписатьНачалоЭлемента и ЗаписатьАтрибут поддерживают передачу URI пространства имен и префикса.
Проанализируем ситуацию, когда нам нужно получить узел вида <v8:Value xmlns:v8="http://v8.1c.ru/data">:
ЗаписьXML.ЗаписатьНачалоЭлемента("v8", "Value", "http://v8.1c.ru/data");
// Здесь также можно добавить атрибуты в контексте этого пространства имен
ЗаписьXML.ЗаписатьКонецЭлемента();
Если вам необходимо передать внутри XML-узла большой блок данных, содержащий спецсимволы (например, <, >, &), которые не должны интерпретироваться парсером, следует использовать секцию CDATA. Объект ЗаписьXML автоматически экранирует одиночные символы в обычных строках, но для целых фрагментов кода или других XML-документов лучше вызвать специализированный метод.
Пример использования:
ЗаписьXML.ЗаписатьНачалоЭлемента("RawData");
ЗаписьXML.ЗаписатьСекциюCDATA("Здесь может быть любой текст с символами < > & без ошибок");
ЗаписьXML.ЗаписатьКонецЭлемента();
Не всегда удобно сохранять результат работы во временный файл на диске, особенно если XML нужно сразу отправить через HTTP-запрос. В таких случаях мы можем использовать метод УстановитьСтроку().
Разберем, как это работает:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8"); // Указываем, что запись идет в память
ЗаписьXML.ЗаписатьНачалоЭлемента("Response");
ЗаписьXML.ЗаписатьАтрибут("Status", "Success");
ЗаписьXML.ЗаписатьКонецЭлемента();
// Получаем итоговую строку
РезультатСтрокой = ЗаписьXML.Закрыть();
Сообщить(РезультатСтрокой);
Если структура вашего XML строго определена схемой (XSD), ручное использование ЗаписьXML может быть избыточным и трудозатратным. В таких случаях эффективнее использовать Фабрику XDTO. Вы создаете объект XDTO на основе модели данных, заполняете его свойства, а затем записываете весь объект одной командой:
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ВашОбъектXDTO);
Этот метод автоматически сформирует все нужные узлы, атрибуты и пространства имен согласно правилам схемы. Для подготовки схемы под модель данных можно использовать инструмент для конвертации схемы XSD в модель XDTO.
Итог: Для записи простого атрибута в 1С используйте связку ЗаписатьНачалоЭлемента() и ЗаписатьАтрибут(). Всегда следите за порядком вызова функций и не забывайте закрывать объект методом Закрыть() для корректного освобождения ресурсов системы.