← Назад к вопросам

Какие есть варианты выгрузки в формате xml?

1.8 Middle🔥 141 комментариев
#Интеграции и обмены

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Варианты выгрузки в XML: полный обзор

Выгрузка данных в XML — одна из самых частых операций при интеграции 1С с внешними системами. Рассмотрю все доступные способы, их особенности и практические примеры.

Вариант 1: Встроенный объект XMLWriter (рекомендуется)

Самый удобный и быстрый способ для больших объемов:

Процедура ВыгрузитьДанныеВXMLWriter(ТабДанных)
    
    // Создаем объект для записи XML
    XMLПись = Новый XMLWriter();
    
    // Открываем файл на запись
    XMLПись.OpenFile("C:\\Выгрузки\\данные.xml", "UTF-8");
    
    // Начало документа
    XMLПись.WriteXMLDeclaration();
    XMLПись.WriteStartElement("Документ");
    XMLПись.WriteAttribute("Дата", ТекущаяДата());
    
    // Перебираем строки таблицы
    Для Каждого Строка Из ТабДанных Цикл
        XMLПись.WriteStartElement("Строка");
        
        XMLПись.WriteStartElement("Номер");
        XMLПись.WriteText(Строка.Номер);
        XMLПись.WriteEndElement();
        
        XMLПись.WriteStartElement("Наименование");
        XMLПись.WriteText(Строка.Наименование);
        XMLПись.WriteEndElement();
        
        XMLПись.WriteStartElement("Сумма");
        XMLПись.WriteText(Строка.Сумма);
        XMLПись.WriteEndElement();
        
        XMLПись.WriteEndElement(); // </Строка>
    КонецЦикла;
    
    XMLПись.WriteEndElement(); // </Документ>
    XMLПись.Close();
    
    // Результат:
    // <?xml version="1.0" encoding="UTF-8"?>
    // <Документ Дата="2024-03-26T12:30:00">
    //     <Строка>
    //         <Номер>1</Номер>
    //         <Наименование>Товар 1</Наименование>
    //         <Сумма>1000.00</Сумма>
    //     </Строка>
    // </Документ>
    
КонецПроцедуры

Преимущества:

  • Потоковая запись (экономит память)
  • Быстро даже для больших объемов
  • Полный контроль над структурой XML
  • Встроен в платформу

Недостатки:

  • Требует указания каждого элемента
  • Много кода для сложных структур

Вариант 2: Объект DOMBuilder (для простых структур)

Удобен, когда данные умещаются в памяти:

Процедура ВыгрузитьВXMLDOMBuilder(ТабДанных)
    
    // Создаем XML документ
    XMLДокумент = Новый XMLDocument();
    
    // Корневой элемент
    КорневойЭлемент = XMLДокумент.CreateElement("Данные");
    XMLДокумент.AppendChild(КорневойЭлемент);
    
    // Добавляем атрибут
    КорневойЭлемент.SetAttribute("ВремяВыгрузки", ТекущаяДата());
    
    // Перебираем данные
    Для Каждого Строка Из ТабДанных Цикл
        СтрокаЭлемент = XMLДокумент.CreateElement("Строка");
        КорневойЭлемент.AppendChild(СтрокаЭлемент);
        
        // Добавляем поля
        ПолеНомер = XMLДокумент.CreateElement("Номер");
        ПолеНомер.AppendChild(XMLДокумент.CreateTextNode(Строка.Номер));
        СтрокаЭлемент.AppendChild(ПолеНомер);
        
        ПолеНаименование = XMLДокумент.CreateElement("Наименование");
        ПолеНаименование.AppendChild(XMLДокумент.CreateTextNode(Строка.Наименование));
        СтрокаЭлемент.AppendChild(ПолеНаименование);
    КонецЦикла;
    
    // Сохраняем
    XMLДокумент.WriteToFile("C:\\Выгрузки\\данные.xml", , "UTF-8");
    
КонецПроцедуры

Преимущества:

  • Проще синтаксис чем XMLWriter
  • Можно редактировать XML в памяти

Недостатки:

  • Весь XML в памяти (проблемы с большими файлами)
  • Медленнее для больших объемов

Вариант 3: Преобразование через XSL

Когда уже есть XML структура, которую нужно трансформировать:

Процедура ПреобразоватьXMLЧерезXSL(ИсходныйXML, ФайлXSL)
    
    // Загружаем исходный XML
    XMLДокумент = Новый XMLDocument();
    XMLДокумент.LoadFromFile(ИсходныйXML);
    
    // Создаем трансформер
    Трансформер = Новый XSLTransform();
    Трансформер.LoadFromFile(ФайлXSL);
    
    // Применяем трансформацию
    РезультатXML = Трансформер.Transform(XMLДокумент);
    
    // Сохраняем результат
    РезультатXML.WriteToFile("C:\\Выгрузки\\преобразованные_данные.xml");
    
КонецПроцедуры

Преимущества:

  • Мощный инструмент для сложного преобразования
  • Отделяет логику трансформации от кода
  • Переиспользуемо

Недостатки:

  • XSL синтаксис сложный
  • Требует файла XSL

Вариант 4: Сохранение ТаблицыЗначений через встроенную функцию

Самый простой способ для быстрой выгрузки:

Процедура ВыгрузитьТаблицуВXML(ТабДанных, ПутьФайла)
    
    // Способ 1: ТаблицаЗначений.ЭкспортXML()
    ТабДанных.ЭкспортXML(ПутьФайла);
    
    // Результат — простая структура:
    // <?xml version="1.0" encoding="UTF-8"?>
    // <ТабдеХнчПо default_xmlns="http://v8.1c.ru/data">
    //     <Строка>
    //         <Номер>1</Номер>
    //         <Наименование>Товар</Наименование>
    //     </Строка>
    // </ТабдеХнчПо>
    
КонецПроцедуры

Преимущества:

  • Одна строка кода
  • Очень быстро
  • Автоматическая типизация

Недостатки:

  • Форматированный XML не очень читаемый
  • Ограниченный контроль над структурой
  • Сложно интегрировать с другими системами

Вариант 5: Ручное формирование строки XML

Для очень простых случаев, но не рекомендуется:

Процедура ВыгрузитьРучноеФормирование(ТабДанных, ПутьФайла)
    
    // Опасно! Не использовать в production
    XMLТекст = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
    XMLТекст = XMLТекст + "<Документ>\n";
    
    Для Каждого Строка Из ТабДанных Цикл
        XMLТекст = XMLТекст + "  <Строка>\n";
        XMLТекст = XMLТекст + "    <Номер>" + Строка.Номер + "</Номер>\n";
        XMLТекст = XMLТекст + "    <Наименование>" + Строка.Наименование + "</Наименование>\n";
        XMLТекст = XMLТекст + "  </Строка>\n";
    КонецЦикла;
    
    XMLТекст = XMLТекст + "</Документ>";
    
    // Сохранить файл
    Файл = Новый ТекстовыйДокумент();
    Файл.УстановитьТекст(XMLТекст);
    Файл.Записать(ПутьФайла);
    
КонецПроцедуры

Минусы:

  • Проблемы с экранированием спецсимволов
  • Уязвимо для XML-injection
  • Сложно с вложенными структурами
  • Непрофессионально

Вариант 6: JSON с преобразованием в XML

Когда удобнее работать с JSON:

Процедура ВыгрузитьЧерезJSON(ТабДанных)
    
    // Преобразуем таблицу в JSON
    JSONСтруктура = Новая Структура();
    JSONСтруктура.Вставить("Данные", ТабДанных.ВыгрузитьВМассив());
    
    JSONТекст = ПреобразоватьВJSON(JSONСтруктура);
    
    // Затем можно конвертировать JSON → XML
    // или использовать JSON напрямую для веб-сервисов
    
КонецПроцедуры

Сравнение методов

МетодСкоростьПростотаКонтрольДля больших данных
XMLWriterВысокаяСредняяПолныйХорошо
DOMBuilderСредняяВысокаяХорошийПлохо
XSL TransformСредняяНизкаяОчень полныйХорошо
ЭкспортXMLОчень высокаяОчень высокаяНизкийОтлично
РучноеНизкаяНизкаяПолныйПлохо

Практические рекомендации

Для небольших объемов (до 10000 строк):

// Используй ЭкспортXML — просто и быстро
ТабДанных.ЭкспортXML(ПутьФайла);

Для больших объемов и контроля над структурой:

// XMLWriter с потоковой записью
ХМЛПись = Новый XMLWriter();
// ... строим структуру ...

Для сложного преобразования:

// XSL трансформ — мощный и переиспользуемый
Трансформер = Новый XSLTransform();
// ... применяем трансформацию ...

Никогда не используй:

  • Ручное формирование строк (уязвимо и хрупко)
  • Конкатенацию без экранирования (XML-injection)
  • DOMBuilder для очень больших файлов (OOM)

В итоге, выбор метода зависит от объема данных и требований к структуре XML. Для production кода рекомендую XMLWriter или встроенный ЭкспортXML.

Какие есть варианты выгрузки в формате xml? | PrepBro