Какие есть варианты выгрузки в формате xml?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Варианты выгрузки в 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.