Работа с XML-файлами — одна из самых частых задач при организации обмена данными между 1С и внешними системами. Несмотря на наличие высокоуровневых механизмов (например, XDTO), базовый объект ЗаписьXML остается востребованным благодаря своей простоте и скорости работы. Однако начинающие разработчики часто сталкиваются с трудностями при формировании структуры документа, особенно когда нужно совместить атрибуты тега и его текстовое содержимое. В этой статье мы подробно разберем, как правильно использовать методы ЗаписатьНачалоЭлемента, ЗаписатьАтрибут и ЗаписатьТекст, а также рассмотрим нюансы форматирования и типизации данных.
Разберем типичную ситуацию: нам нужно сформировать заголовок документа, где идентификатор (GUID) должен быть атрибутом тега, а остальные данные — вложенными элементами. Рассмотрим структуру, которую мы хотим получить:
<Документ Идентификатор="a83f0f99-ff26-11e6-8353-2c768aacbc92">
<ТипДок>ПРХ</ТипДок>
<Комиссия>1</Комиссия>
</Документ>
Основная ошибка заключается в попытке записать атрибут после того, как в элемент уже добавлены данные или вложенные теги. Проанализируем правильный алгоритм работы с объектом ЗаписьXML:
ЗаписатьНачалоЭлемента("ИмяТега").ЗаписатьАтрибут("ИмяАтрибута", "Значение").ЗаписатьТекст) или открывать новые вложенные элементы.ЗаписатьКонецЭлемента().Рассмотрим конкретный пример кода на языке 1С, реализующий эту логику:
// Создаем объект записи
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Exchange\document.xml", "windows-1251");
// Записываем корневой элемент с атрибутом
ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");
ЗаписьXML.ЗаписатьАтрибут("Идентификатор", Строка(СсылкаНаДокумент.УникальныйИдентификатор()));
// Записываем вложенный элемент с текстовым значением
ЗаписьXML.ЗаписатьНачалоЭлемента("ТипДок");
ЗаписьXML.ЗаписатьТекст("ПРХ");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем ТипДок
// Записываем еще один вложенный элемент
ЗаписьXML.ЗаписатьНачалоЭлемента("Комиссия");
ЗаписьXML.ЗаписатьТекст("1");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем Комиссия
// Закрываем основной элемент Документ
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.Закрыть();
Проанализируем ситуацию с типами данных. В 1С мы работаем с объектами типа Дата, Число, Булево или УникальныйИдентификатор. Если просто использовать функцию Строка(), результат будет зависеть от региональных настроек системы (например, дата может содержать точки, а число — неразрывные пробелы в качестве разделителей разрядов). Это сделает XML-файл невалидным для большинства внешних систем.
Для корректного преобразования типов данных 1С в стандартные форматы XML (XSD) необходимо всегда использовать функцию XMLСтрока(). Выясним, что она делает:
Посмотрим на исправленный фрагмент кода с использованием этой функции:
ЗаписьXML.ЗаписатьНачалоЭлемента("ДатаДок");
ЗаписьXML.ЗаписатьТекст(XMLСтрока(Объект.Дата));
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("Сумма");
ЗаписьXML.ЗаписатьТекст(XMLСтрока(Объект.СуммаДокумента));
ЗаписьXML.ЗаписатьКонецЭлемента();
По умолчанию ЗаписьXML формирует файл "в одну строку" без отступов и переносов, что неудобно для анализа человеком. Чтобы сделать файл читаемым, воспользуемся объектом ПараметрыЗаписиXML. Рассмотрим, как настроить отступы:
ПараметрыЗаписи = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Символы.Таб);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Exchange\pretty.xml", ПараметрыЗаписи);
Параметр Истина включает режим отступов, а Символы.Таб указывает, какой символ использовать для визуального разделения уровней вложенности.
Помимо последовательной записи через ЗаписьXML, существуют и другие подходы, которые могут быть более эффективными в зависимости от задачи.
Если структура документа сложная и вам нужно постоянно возвращаться к созданным узлам или изменять их порядок в процессе формирования, лучше использовать Документ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.Закрыть();
Это наиболее современный и "правильный" способ в экосистеме 1С. Мы описываем структуру данных в специальном объекте конфигурации "Схема XDTO", после чего работаем с данными как с обычными объектами 1С. Система сама заботится о названиях тегов, типах и пространствах имен. Проанализируем преимущества:
Для решения простых задач выгрузки данных достаточно освоить триаду методов ЗаписатьНачалоЭлемента, ЗаписатьАтрибут и ЗаписатьТекст. Главное — помнить о строгой последовательности: атрибуты записываются строго после открытия тега и до любого другого содержимого. Использование XMLСтрока и ПараметрыЗаписиXML сделает ваши файлы профессиональными и совместимыми с любыми стандартами обмена данными.