Как в 1С распарсить XML-файл и выбрать данные по конкретному значению (на примере USD)

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа с XML-файлами — одна из самых частых задач при организации обмена данными между 1С и внешними системами. Часто возникает ситуация, когда файл содержит огромный массив данных (например, курсы всех валют мира), а нам необходимо извлечь информацию только по одному конкретному объекту, например, по доллару США (USD). В этой статье мы подробно разберем несколько подходов к решению этой задачи, проанализируем их преимущества и недостатки, а также изучим конкретные примеры кода.

Метод 1: Потоковое чтение с помощью объекта ЧтениеXML

Этот метод является наиболее производительным и экономным с точки зрения использования оперативной памяти. Объект ЧтениеXML читает файл последовательно, узел за узлом, не загружая всё содержимое файла в память. Это критически важно при работе с файлами большого объема.

Рассмотрим ситуацию, когда нам нужно найти узел Valute, у которого атрибут или вложенный тег соответствует значению "USD". Проанализируем базовый алгоритм работы:


ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.ОткрытьФайл("C:\Exchange\Currencies.xml");

Пока ЧтениеХМЛ.Прочитать() Цикл
    // Проверяем, является ли текущий узел началом элемента "Valute"
    Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеХМЛ.Имя = "Valute" Тогда
        
        // Попробуем получить код валюты из атрибута
        КодВалюты = ЧтениеХМЛ.ЗначениеАтрибута("Code");
        
        Если КодВалюты = "USD" Тогда
            // Если это нужная нам валюта, читаем данные внутри этого блока
            Пока ЧтениеХМЛ.Прочитать() Цикл
                // Выходим из внутреннего цикла, если дошли до конца блока Valute
                Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеХМЛ.Имя = "Valute" Тогда
                    Прервать;
                КонецЕсли;
                
                // Извлекаем наименование и курс
                Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеХМЛ.Имя = "Name" Тогда
                    Сообщить("Наименование: " + ЧтениеХМЛ.ПрочитатьСодержимое());
                КонецЕсли;
                
                Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеХМЛ.Имя = "Value" Тогда
                    Сообщить("Курс: " + ЧтениеХМЛ.ПрочитатьСодержимое());
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

ЧтениеХМЛ.Закрыть();

Важный нюанс: Обратите внимание на использование метода ПрочитатьСодержимое(). Он позволяет сразу получить текстовое значение внутри тега и переводит указатель чтения на следующий узел. Если использовать просто проверку ТипУзлаXML.Текст, код становится более громоздким и сложным для отладки.

Метод 2: Использование объектной модели DOM

Если файл имеет небольшой размер, гораздо удобнее использовать Document Object Model (DOM). Этот подход позволяет загрузить весь XML в виде древовидной структуры и обращаться к его элементам напрямую по именам или через коллекции.

Выясним, как реализовать поиск данных с помощью объекта ПостроительDOM. Этот метод избавляет нас от необходимости писать сложные циклы с проверкой каждого узла.


ДанныеXML = Новый ЧтениеXML;
ДанныеXML.ОткрытьФайл("C:\Exchange\Currencies.xml");

// Создаем построитель и читаем файл в модель DOM
ПостроительДом = Новый ПостроительDOM;
ДокументDOM = ПостроительДом.Прочитать(ДанныеXML);

// Получаем все элементы с именем "Valute"
СписокВалют = ДокументDOM.ПолучитьЭлементыПоИмени("Valute");

Для Каждого Элемент Из СписокВалют Цикл
    // Проверяем атрибут или значение вложенного узла
    Если Элемент.ПолучитьАтрибут("Code") = "USD" Тогда
        // Извлекаем данные через поиск по имени внутри текущего узла
        Наименование = Элемент.ПолучитьЭлементыПоИмени("Name")[0].ТекстовоеСодержимое;
        Курс = Элемент.ПолучитьЭлементыПоИмени("Value")[0].ТекстовоеСодержимое;
        
        Сообщить("Найдено: " + Наименование + " - " + Курс);
    КонецЕсли;
КонецЦикла;

ДанныеXML.Закрыть();

Использование DOM делает код более читаемым и понятным. Мы можем перемещаться по дереву документа в любом направлении, что невозможно при использовании ЧтениеXML.

Метод 3: Применение технологии XDTO

Для создания универсальных и надежных интеграций профессиональные разработчики часто выбирают XDTO (XML Data Transfer Objects). Этот механизм позволяет интерпретировать XML-данные как объекты 1С с типизированными свойствами.

Рассмотрим, как это упрощает доступ к данным. Вместо того чтобы перебирать узлы, мы обращаемся к свойствам объекта через точку, как в обычном справочнике или документе.


ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.ОткрытьФайл("C:\Exchange\Currencies.xml");

// Читаем данные в объект XDTO (предполагается, что схема уже известна или используется фабрика по умолчанию)
МояВалютаXDTO = ФабрикаXDTO.Прочитать(ЧтениеХМЛ);

Для Каждого ТекущаяВалюта Из МояВалютаXDTO.Valute Цикл
    Если ТекущаяВалюта.CharCode = "USD" Тогда
        Сообщить("Валюта: " + ТекущаяВалюта.Name + " Курс: " + ТекущаяВалюта.Value);
    КонецЕсли;
КонецЦикла;

Преимущество XDTO заключается в автоматической типизации данных. Если в XML указано число, в 1С вы получите тип Число, а не строку, что исключает ошибки при дальнейших математических вычислениях.

Сравнение методов: что выбрать?

Проанализируем ситуации, в которых стоит отдавать предпочтение тому или иному методу:

  1. Объем файла: Если XML весит более 10-20 Мб, используйте только ЧтениеXML. Попытка загрузить большой файл в ПостроительDOM может привести к аварийному завершению сеанса 1С из-за нехватки памяти.
  2. Сложность структуры: Если данные имеют глубокую вложенность и вам нужно постоянно "прыгать" между уровнями, DOM или XDTO будут гораздо удобнее.
  3. Скорость разработки: Быстрее всего написать код через DOM, так как он требует меньше логических проверок состояния потока чтения.

Подводя итог, можно сказать: для разовых задач по получению курса одной валюты идеально подходит ПостроительDOM. Для регулярных обменов тяжелыми данными (выгрузки товаров, остатков) следует освоить ЧтениеXML или XDTO.

← На главную