Как в 1С 7.7 записать XML с вложенными узлами вместо атрибутов?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При выгрузке данных из 1С 7.7 для сторонних систем (например, для сайтов) программисты часто сталкиваются с проблемой: стандартные методы формирования XML создают атрибуты внутри тега, в то время как принимающая сторона ожидает вложенные элементы. В этой статье мы подробно разберем, как добиться нужной иерархии, проанализируем различные способы реализации и выясним, какие инструменты лучше использовать в зависимости от задачи.

Разбор проблемы: атрибуты против вложенных элементов

Типичная ситуация: вместо требуемой структуры:


<Склад>
    <Код>101</Код>
    <Наименование>Склад1</Наименование>
</Склад>
программа выдает компактную строку с атрибутами: <Склад Наименование="Склад1" Код="101"/> Это происходит потому, что в коде используется метод УстановитьАтрибут. Чтобы изменить поведение системы, нам нужно создавать полноценные дочерние узлы для каждого значения.

Решение №1: Использование компоненты v7plus.dll

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

Разберем по шагам правильный алгоритм:

  1. Создаем основной узел объекта (например, "Склад").
  2. Для каждого реквизита создаем подчиненный элемент методом СоздатьПодчиненныйЭлемент.
  3. Присваиваем значение через свойство Текст созданного подчиненного узла.

Проанализируем пример кода, который реализует этот подход:


Склады = Данные.СоздатьПодчиненныйЭлемент("Склады");
СкладСпр = СоздатьОбъект("Справочник.Склады");
СкладСпр.ВыбратьЭлементы();

Пока СкладСпр.ПолучитьЭлемент() = 1 Цикл
    // Создаем родительский контейнер для конкретного склада
    СкладXML = Склады.СоздатьПодчиненныйЭлемент("Склад");
    
    // Создаем узел для Кода
    УзелКод = СкладXML.СоздатьПодчиненныйЭлемент("Код");
    УзелКод.Текст = СкладСпр.Код;
    
    // Создаем узел для Наименования
    УзелНазвание = СкладXML.СоздатьПодчиненныйЭлемент("Наименование");
    УзелНазвание.Текст = СокрЛП(СкладСпр.Наименование);
КонецЦикла;

Важный нюанс: использование свойства Текст (или Значение) заставляет систему интерпретировать данные именно как содержимое тега, а не как его параметр. Это и позволяет получить структуру <Тег>Значение</Тег>.

Решение №2: Прямая запись в текстовый файл

Иногда использование объектной модели DOM (через v7plus) может быть избыточным или медленным, особенно на огромных массивах данных. В таких случаях мы можем прибегнуть к ручному формированию XML через объект Текст. Посмотрим на ситуацию с этой стороны.


ТекстВыгрузки = СоздатьОбъект("Текст");
ТекстВыгрузки.ДобавитьСтроку("<Склады>");

Спр = СоздатьОбъект("Справочник.Склады");
Спр.ВыбратьЭлементы();

Пока Спр.ПолучитьЭлемент() = 1 Цикл
    Если Спр.ЭтоГруппа() = 1 Тогда Продолжить; КонецЕсли;
    
    ТекстВыгрузки.ДобавитьСтроку("  <Склад>");
    ТекстВыгрузки.ДобавитьСтроку("    <Код>" + Спр.Код + "</Код>");
    ТекстВыгрузки.ДобавитьСтроку("    <Наименование>" + Спр.Наименование + "</Наименование>");
    ТекстВыгрузки.ДобавитьСтроку("  </Склад>");
КонецЦикла;

ТекстВыгрузки.ДобавитьСтроку("</Склады>");
ТекстВыгрузки.Записать("C:\export.xml");

Этот метод максимально прост, но требует осторожности: программист сам должен следить за закрытием тегов и корректностью спецсимволов (например, символы "&", "<", ">" в названиях товаров могут сломать XML-структуру).

Продвинутый подход: Использование MSXML2.DOMDocument

Для более тонкой настройки выгрузки (например, управления кодировкой или создания секций CDATA) опытные разработчики рекомендуют использовать напрямую COM-объект MSXML2.DOMDocument. Это позволяет избежать ограничений компоненты v7plus.dll.

Рассмотрим, какие преимущества это дает:

  1. Создание CDATA: Если в ваших справочниках много спецсимволов (кавычки, скобки, амперсанды), лучше помещать их в секции <![CDATA[ ... ]]>. В v7plus это делается методом СоздатьУзел(4, ...), а в прямом DOM — через createCDATASection.
  2. Управление кодировкой: 1С 7.7 по умолчанию работает в ANSI. Для сайта может потребоваться UTF-8. Использование MSXML в паре с ADODB.Stream позволяет сохранить файл в любой современной кодировке без лишних проблем.
  3. Валидация: Вы можете сразу проверять созданный документ на соответствие XSD-схеме.

Технические тонкости: Текст против Значения

При работе с v7plus полезно знать разницу между свойствами элементов:

Оптимизация при больших объемах данных

Если ваша выгрузка содержит десятки тысяч товаров, использование объектной модели (DOM) может привести к критическому потреблению оперативной памяти, так как всё дерево XML строится целиком в ОЗУ перед записью. В таких ситуациях мы рекомендуем:

Подведем итог: для большинства повседневных задач в 1С 7.7 наиболее эффективным и быстрым способом формирования иерархического XML является использование v7plus с созданием подчиненных элементов через метод СоздатьПодчиненныйЭлемент и заполнением их свойства Текст. Это гарантирует правильную структуру, понятную любому современному веб-серверу или парсеру.

← На главную