При работе с внешними системами или форматами обмена данных в 1С, часто возникает задача по формированию XML-документов. Одним из распространенных сценариев является запись XML-элементов, которые имеют не только текстовое содержимое, но и множество атрибутов. В данной статье мы подробно рассмотрим, как правильно использовать объект ЗаписьXML для создания таких элементов, как, например, <category id="12" parentid="33"></category>, и разберем все нюансы работы с ним.
Начинающие разработчики 1С часто сталкиваются с непониманием разницы между текстовым содержимым элемента и его атрибутами. Изначально, автор вопроса пытался записать значения атрибутов с помощью метода ЗаписьXML.ЗаписатьТекст(), что является некорректным подходом для формирования атрибутов. Метод ЗаписатьТекст() предназначен для записи текстового содержимого внутри элемента, между его открывающим и закрывающим тегами, тогда как атрибуты представляют собой пары "имя=значение", которые располагаются внутри открывающего тега элемента.
Например, в конструкции <category id ="12" parentid = "33">Название категории</category>:
category — это имя элемента.id ="12" и parentid = "33" — это атрибуты элемента category.Название категории — это текстовое содержимое элемента category.Для записи атрибутов в 1С предусмотрен специальный метод — ЗаписьXML.ЗаписатьАтрибут().
Для корректной записи XML-элемента с атрибутами в 1С мы будем использовать объект ЗаписьXML. Рассмотрим этот процесс по шагам.
Шаг 1: Инициализация объекта ЗаписьXML и настройка.
Прежде чем начать запись, нам необходимо создать экземпляр объекта ЗаписьXML и указать, куда будут записываться данные: в строку или в файл. Также мы можем настроить форматирование.
Перем ЗаписьXML;
ЗаписьXML = Новый ЗаписьXML;
// Указываем, что запись будет производиться в строку
ЗаписьXML.УстановитьСтроку();
// Добавляем объявление XML-документа (например, <?xml version='1.0' encoding='UTF-8'?>)
ЗаписьXML.ЗаписатьОбъявлениеXML();
// Устанавливаем флаг для добавления отступов и переносов строк для лучшей читаемости
ЗаписьXML.ДобавлятьОтступы = Истина;
Шаг 2: Запись начала элемента.
Для того чтобы обозначить начало нового XML-элемента, мы используем метод ЗаписьXML.ЗаписатьНачалоЭлемента(). В качестве параметра передается имя элемента.
ЗаписьXML.ЗаписатьНачалоЭлемента("category");
На этом этапе XML-документ будет выглядеть примерно так: <category>.
Шаг 3: Запись атрибутов.
После записи начала элемента, но до записи его текстового содержимого или вложенных элементов, мы должны записать все необходимые атрибуты. Для этого используем метод ЗаписьXML.ЗаписатьАтрибут(), передавая ему имя атрибута и его значение.
ЗаписьXML.ЗаписатьАтрибут("id", "12");
ЗаписьXML.ЗаписатьАтрибут("parentid", "33");
После выполнения этих двух строк, наш элемент будет выглядеть как <category id="12" parentid="33">. Обратите внимание, что атрибуты записываются непосредственно в открывающий тег.
Шаг 4: Запись конца элемента.
После того как все атрибуты записаны, и, при необходимости, текстовое содержимое элемента или вложенные элементы, мы должны закрыть текущий элемент с помощью метода ЗаписьXML.ЗаписатьКонецЭлемента().
ЗаписьXML.ЗаписатьКонецЭлемента();
Это завершит формирование элемента category. В данном случае, так как мы не записывали текстовое содержимое, элемент будет закрыт как пустой тег или сразу же после открывающего тега, в зависимости от настроек и того, были ли вложенные элементы.
Шаг 5: Получение результата или закрытие файла.
Если мы записывали в строку, то для получения сформированного XML-документа необходимо вызвать метод ЗаписьXML.Закрыть(), который вернет готовую XML-строку. Если же мы записывали в файл, то Закрыть() сохранит изменения и закроет файл.
СтрокаXML = ЗаписьXML.Закрыть();
Сообщить(СтрокаXML);
Давайте соберем все шаги вместе и посмотрим на полный пример формирования XML-элемента с двумя атрибутами:
Перем ЗаписьXML;
ЗаписьXML = Новый ЗаписьXML;
// 1. Инициализация и настройка
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ДобавлятьОтступы = Истина;
// 2. Запись начала элемента
ЗаписьXML.ЗаписатьНачалоЭлемента("category");
// 3. Запись атрибутов
ЗаписьXML.ЗаписатьАтрибут("id", "12");
ЗаписьXML.ЗаписатьАтрибут("parentid", "33"); // В примере был "Вася", но для parentid логичнее число
// (Опционально) Запись текстового содержимого элемента, если оно есть
// ЗаписьXML.ЗаписатьТекст("Название тестовой категории");
// 4. Запись конца элемента
ЗаписьXML.ЗаписатьКонецЭлемента();
// 5. Получение результата
СтрокаXML = ЗаписьXML.Закрыть();
Сообщить(СтрокаXML);
Результат выполнения данного кода будет следующим:
<?xml version='1.0' encoding='UTF-8'?>
<category id="12" parentid="33"/>
Или, если бы мы добавили текстовое содержимое: <category id="12" parentid="33">Название тестовой категории</category>
Объект ЗаписьXML предлагает множество дополнительных функций и настроек, которые позволяют гибко управлять процессом формирования XML-документов. Рассмотрим некоторые из них подробнее.
Обязательное использование парных методов:
Для каждого метода ЗаписатьНачалоЭлемента() обязательно должен быть соответствующий метод ЗаписатьКонецЭлемента(). Это критически важно для формирования правильно структурированного XML-документа. Если вы забудете закрыть элемент, это приведет к некорректному XML и ошибкам парсинга.
Порядок записи атрибутов:
Как мы уже выяснили, атрибуты должны быть записаны сразу после метода ЗаписатьНачалоЭлемента() и до записи текста элемента или вложенных элементов. Попытка записать атрибут после текста элемента или после его закрытия вызовет ошибку. Это логично, так как атрибуты являются частью открывающего тега.
Множество атрибутов для одного элемента:
Если нам нужно указать несколько атрибутов для одного элемента, мы просто вызываем метод ЗаписьXML.ЗаписатьАтрибут() столько раз, сколько атрибутов требуется. Каждый вызов добавит новый атрибут к текущему открытому элементу.
Запись различных типов данных:
ЗаписьXML предоставляет специализированные методы для записи атрибутов и содержимого элементов в различных типах. Это гарантирует корректное преобразование значений в соответствующий XML-формат и предотвращает возможные ошибки форматирования. К таким методам относятся:
ЗаписатьАтрибутЧисло(Имя, Значение)ЗаписатьАтрибутБулево(Имя, Значение)ЗаписатьАтрибутДатуВремя(Имя, Значение)ЗаписатьЧисло(), ЗаписатьБулево(), ЗаписатьДатуВремя() и т.д.Пример использования типизированного метода:
ЗаписьXML.ЗаписатьНачалоЭлемента("Товар");
ЗаписьXML.ЗаписатьАтрибут("Код", "Т001");
ЗаписьXML.ЗаписатьАтрибутЧисло("Цена", 125.50);
ЗаписьXML.ЗаписатьАтрибутБулево("Активен", Истина);
ЗаписьXML.ЗаписатьКонецЭлемента();
Работа с иерархической структурой:
XML-документы имеют иерархическую структуру. При записи вложенных элементов мы просто повторяем последовательность ЗаписатьНачалоЭлемента(), ЗаписатьАтрибут() (если нужно), ЗаписатьТекст() (если нужно) и ЗаписатьКонецЭлемента() для каждого внутреннего элемента, помещая его между началом и концом родительского элемента.
ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");
ЗаписьXML.ЗаписатьАтрибут("Номер", "123");
ЗаписьXML.ЗаписатьНачалоЭлемента("Шапка");
ЗаписьXML.ЗаписатьНачалоЭлемента("Дата");
ЗаписьXML.ЗаписатьТекст("2023-10-27");
ЗаписьXML.ЗаписатьКонецЭлемента(); // </Дата>
ЗаписьXML.ЗаписатьКонецЭлемента(); // </Шапка>
ЗаписьXML.ЗаписатьНачалоЭлемента("ТабличнаяЧасть");
ЗаписьXML.ЗаписатьНачалоЭлемента("Строка");
ЗаписьXML.ЗаписатьАтрибут("Номенклатура", "Монитор");
ЗаписьXML.ЗаписатьАтрибутЧисло("Количество", 2);
ЗаписьXML.ЗаписатьКонецЭлемента(); // </Строка>
ЗаписьXML.ЗаписатьКонецЭлемента(); // </ТабличнаяЧасть>
ЗаписьXML.ЗаписатьКонецЭлемента(); // </Документ>
Объявление XML-документа:
Перед началом записи корневого элемента всегда рекомендуется использовать метод ЗаписьXML.ЗаписатьОбъявлениеXML(). Этот метод добавляет стандартную директиву <?xml version='1.0' encoding='UTF-8'?> в самое начало документа, что является обязательным элементом любого корректного XML-файла и помогает программам-парсерам правильно его обрабатывать.
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьОбъявлениеXML(); // Добавляем декларацию
// ... дальнейшая запись элементов
Форматирование XML-документа (отступы и переносы):
Для улучшения читаемости сгенерированного XML-файла мы можем использовать свойство ЗаписьXML.ДобавлятьОтступы. Установка этого свойства в Истина заставит ЗаписьXML автоматически добавлять отступы и переносы на новую строку для вложенных элементов, делая структуру документа более наглядной.
ЗаписьXML.ДобавлятьОтступы = Истина;
Без этой настройки весь XML может быть записан одной длинной строкой, что затрудняет его ручной анализ.
Запись в файл или строку:
Объект ЗаписьXML позволяет гибко выбирать место назначения для формируемого XML-документа:
ЗаписьXML.УстановитьСтроку(): Используется для записи XML в строковую переменную. После завершения записи, метод Закрыть() вернет сформированный XML-документ в виде строки. Это удобно для получения XML в памяти программы для дальнейшей обработки или передачи.ЗаписьXML.ОткрытьФайл(ПутьКФайлу, Кодировка): Используется для записи XML непосредственно в файл на диске. После завершения записи, метод Закрыть() сохранит все записанные данные в указанный файл и закроет его. Важно правильно указать путь и кодировку, например, "UTF-8".Использование пространств имен (Namespace):
Если ваш XML-документ должен соответствовать определенным стандартам или схемам, он может использовать пространства имен XML. Их можно объявлять с помощью метода ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(Префикс, URI_ПространстваИмен), обычно в корневом элементе, чтобы они действовали на все вложенные элементы.
ЗаписьXML.ЗаписатьНачалоЭлемента("КорневойЭлемент");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema");
ЗаписьXML.ЗаписатьАтрибут("xsi:schemaLocation", "http://example.com/schema schema.xsd");
ЗаписьXML.ЗаписатьНачалоЭлемента("xs:ЭлементСхемы");
ЗаписьXML.ЗаписатьТекст("Текст");
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
Объект ЗаписьXML в 1С является мощным и гибким инструментом для формирования XML-документов. Понимание разницы между текстовым содержимым элемента и его атрибутами, а также правильное использование методов ЗаписатьНачалоЭлемента(), ЗаписатьАтрибут() и ЗаписатьКонецЭлемента(), позволяет создавать корректные и хорошо структурированные XML-файлы. Всегда помните о парности открывающих и закрывающих тегов, а также о порядке записи атрибутов. Используя дополнительные возможности, такие как типизированные методы записи, объявление XML и форматирование, мы можем создавать надежные и читаемые XML-документы для любых задач интеграции и обмена данными.