При выгрузке данных из 1С 7.7 для сторонних систем (например, для сайтов) программисты часто сталкиваются с проблемой: стандартные методы формирования XML создают атрибуты внутри тега, в то время как принимающая сторона ожидает вложенные элементы. В этой статье мы подробно разберем, как добиться нужной иерархии, проанализируем различные способы реализации и выясним, какие инструменты лучше использовать в зависимости от задачи.
Типичная ситуация: вместо требуемой структуры:
<Склад>
<Код>101</Код>
<Наименование>Склад1</Наименование>
</Склад>
<Склад Наименование="Склад1" Код="101"/>
Это происходит потому, что в коде используется метод УстановитьАтрибут. Чтобы изменить поведение системы, нам нужно создавать полноценные дочерние узлы для каждого значения.
Рассмотрим основной способ решения задачи с помощью штатной компоненты v7plus.dll. Ключевая идея заключается в том, что каждое значение (Код, Наименование) должно быть представлено отдельным объектом типа «Элемент», созданным внутри родительского узла.
Разберем по шагам правильный алгоритм:
СоздатьПодчиненныйЭлемент.Текст созданного подчиненного узла.Проанализируем пример кода, который реализует этот подход:
Склады = Данные.СоздатьПодчиненныйЭлемент("Склады");
СкладСпр = СоздатьОбъект("Справочник.Склады");
СкладСпр.ВыбратьЭлементы();
Пока СкладСпр.ПолучитьЭлемент() = 1 Цикл
// Создаем родительский контейнер для конкретного склада
СкладXML = Склады.СоздатьПодчиненныйЭлемент("Склад");
// Создаем узел для Кода
УзелКод = СкладXML.СоздатьПодчиненныйЭлемент("Код");
УзелКод.Текст = СкладСпр.Код;
// Создаем узел для Наименования
УзелНазвание = СкладXML.СоздатьПодчиненныйЭлемент("Наименование");
УзелНазвание.Текст = СокрЛП(СкладСпр.Наименование);
КонецЦикла;
Важный нюанс: использование свойства Текст (или Значение) заставляет систему интерпретировать данные именно как содержимое тега, а не как его параметр. Это и позволяет получить структуру <Тег>Значение</Тег>.
Иногда использование объектной модели DOM (через v7plus) может быть избыточным или медленным, особенно на огромных массивах данных. В таких случаях мы можем прибегнуть к ручному формированию XML через объект Текст. Посмотрим на ситуацию с этой стороны.
ТекстВыгрузки = СоздатьОбъект("Текст");
ТекстВыгрузки.ДобавитьСтроку("<Склады>");
Спр = СоздатьОбъект("Справочник.Склады");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Если Спр.ЭтоГруппа() = 1 Тогда Продолжить; КонецЕсли;
ТекстВыгрузки.ДобавитьСтроку(" <Склад>");
ТекстВыгрузки.ДобавитьСтроку(" <Код>" + Спр.Код + "</Код>");
ТекстВыгрузки.ДобавитьСтроку(" <Наименование>" + Спр.Наименование + "</Наименование>");
ТекстВыгрузки.ДобавитьСтроку(" </Склад>");
КонецЦикла;
ТекстВыгрузки.ДобавитьСтроку("</Склады>");
ТекстВыгрузки.Записать("C:\export.xml");
Этот метод максимально прост, но требует осторожности: программист сам должен следить за закрытием тегов и корректностью спецсимволов (например, символы "&", "<", ">" в названиях товаров могут сломать XML-структуру).
Для более тонкой настройки выгрузки (например, управления кодировкой или создания секций CDATA) опытные разработчики рекомендуют использовать напрямую COM-объект MSXML2.DOMDocument. Это позволяет избежать ограничений компоненты v7plus.dll.
Рассмотрим, какие преимущества это дает:
<![CDATA[ ... ]]>. В v7plus это делается методом СоздатьУзел(4, ...), а в прямом DOM — через createCDATASection.MSXML в паре с ADODB.Stream позволяет сохранить файл в любой современной кодировке без лишних проблем.При работе с v7plus полезно знать разницу между свойствами элементов:
Текст — всегда принимает строку. Если вы передадите туда число или дату, 1С преобразует их в строку по своим внутренним правилам.Значение — более интеллектуальное свойство. Если в объекте настроена типизация, v7plus попытается привести данные к формату XML автоматически (например, дата запишется в формате ГГГГ-ММ-ДД).Если ваша выгрузка содержит десятки тысяч товаров, использование объектной модели (DOM) может привести к критическому потреблению оперативной памяти, так как всё дерево XML строится целиком в ОЗУ перед записью. В таких ситуациях мы рекомендуем:
SAX-парсер (Simple API for XML), который записывает данные последовательно, не загружая весь файл в память.Подведем итог: для большинства повседневных задач в 1С 7.7 наиболее эффективным и быстрым способом формирования иерархического XML является использование v7plus с созданием подчиненных элементов через метод СоздатьПодчиненныйЭлемент и заполнением их свойства Текст. Это гарантирует правильную структуру, понятную любому современному веб-серверу или парсеру.