Чтение XML-документа в 1С

XML-файлы очень часто встречаются при обмене данными между различными программными продуктами, сайтами и т.п.

В 1С существует несколько методов чтения XML-файлов:

  • последовательное чтение XML-файла;
  • преобразование XML-файла в DOM-документ и чтение его узлов;
  • чтение с использованием фабрики XTDO.

Для чтения относительно небольших файлов XML лично мне нравится второй способ — чтение через DOM-документ. Этот способ кажется мне наиболее простым, но стоит заметить, что на больших файлах (более 100 тысяч записей) он работает ощутимо медленнее.

Чтение XML-файла черед DOM-документ

Для примера возьмем упрощенный XML-файл, в котором с сайте передан заказ клиента. Лишние узлы оттуда убраны, но порядок чтения файла от этого не меняется.

Чтение XML-документа в 1С

По данным XML-файла будем создавать документ ЗаказПокупателя.

Источник=новый ЧтениеXML;
Источник.ОткрытьФайл(Объект.ЗаказыФайл); // в реквизите ЗаказыФайл находится путь к XML-файлу
Построитель=новый построительDOM;
Документ=Построитель.Прочитать(Источник);

Для каждого Элемент из Документ.ЭлементДокумента.ДочерниеУзлы Цикл // Файл содержит один основной узел. Перебираем сразу дочерние узлы (Документ)
Если Элемент.ИмяУзла="Документ" ТОгда
НовыйДокумент=Документы.ЗаказПокупателя.СоздатьДокумент();

Для каждого РеквизитДокумента Из Элемент.ДочерниеУзлы Цикл // перебираем реквизиты документы, являющиеся дочерними для узла Документ
Если РеквизитДокумента.ИмяУзла="Ид" Тогда
НовыйДокумент.Номер=РеквизитДокумента.ТекстовоеСодержимое;
ИначеЕсли РеквизитДокумента.ИмяУзла="Дата" Тогда
НовыйДокумент.Дата=XMLЗначение(Тип("Дата"), РеквизитДокумента.ТекстовоеСодержимое);
ИначеЕсли РеквизитДокумента.ИмяУзла="СуммаЗаказа" Тогда
НовыйДокумент.СуммаДокумента=РеквизитДокумента.ТекстовоеСодержимое;
ИначеЕсли РеквизитДокумента.ИмяУзла="ВалютаЗаказа" Тогда
НовыйДокумент.ВалютаДокумента=РеквизитДокумента.ТекстовоеСодержимое;
ИначеЕсли РеквизитДокумента.ИмяУзла="Товар" Тогда

Для каждого Товар из РеквизитДокумента.ДочерниеУзлы Цикл //обходим товары
новаяСтрока=НовыйДокумент.Товары.Добавить(); // если есть товар в заказе, добавим строку в таблицу

Для каждого РеквизитТовара из Товар.ДочерниеУзлы Цикл // заполняем строчку заказа
Если РеквизитТовара.ИмяУзла="Наименование" Тогда
НоваяСтрока.Номенклатура=РеквизитТовара.ТекстовоеСодержимое;
ИначеЕсли РеквизитТовара.ИмяУзла="Количество" Тогда
НоваяСтрока.Количество=РеквизитТовара.ТекстовоеСодержимое;
КонецЕсли;
КонецЦикла;

КонецЦикла;

КонецЕсли;
КонецЦикла;

НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *