Работа с XML-файлами — одна из самых частых задач при организации обмена данными между 1С и внешними системами. Часто возникает ситуация, когда файл содержит огромный массив данных (например, курсы всех валют мира), а нам необходимо извлечь информацию только по одному конкретному объекту, например, по доллару США (USD). В этой статье мы подробно разберем несколько подходов к решению этой задачи, проанализируем их преимущества и недостатки, а также изучим конкретные примеры кода.
Этот метод является наиболее производительным и экономным с точки зрения использования оперативной памяти. Объект ЧтениеXML читает файл последовательно, узел за узлом, не загружая всё содержимое файла в память. Это критически важно при работе с файлами большого объема.
Рассмотрим ситуацию, когда нам нужно найти узел Valute, у которого атрибут или вложенный тег соответствует значению "USD". Проанализируем базовый алгоритм работы:
ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.ОткрытьФайл("C:\Exchange\Currencies.xml");
Пока ЧтениеХМЛ.Прочитать() Цикл
// Проверяем, является ли текущий узел началом элемента "Valute"
Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеХМЛ.Имя = "Valute" Тогда
// Попробуем получить код валюты из атрибута
КодВалюты = ЧтениеХМЛ.ЗначениеАтрибута("Code");
Если КодВалюты = "USD" Тогда
// Если это нужная нам валюта, читаем данные внутри этого блока
Пока ЧтениеХМЛ.Прочитать() Цикл
// Выходим из внутреннего цикла, если дошли до конца блока Valute
Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеХМЛ.Имя = "Valute" Тогда
Прервать;
КонецЕсли;
// Извлекаем наименование и курс
Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеХМЛ.Имя = "Name" Тогда
Сообщить("Наименование: " + ЧтениеХМЛ.ПрочитатьСодержимое());
КонецЕсли;
Если ЧтениеХМЛ.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеХМЛ.Имя = "Value" Тогда
Сообщить("Курс: " + ЧтениеХМЛ.ПрочитатьСодержимое());
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЧтениеХМЛ.Закрыть();
Важный нюанс: Обратите внимание на использование метода ПрочитатьСодержимое(). Он позволяет сразу получить текстовое значение внутри тега и переводит указатель чтения на следующий узел. Если использовать просто проверку ТипУзлаXML.Текст, код становится более громоздким и сложным для отладки.
Если файл имеет небольшой размер, гораздо удобнее использовать 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.
Для создания универсальных и надежных интеграций профессиональные разработчики часто выбирают XDTO (XML Data Transfer Objects). Этот механизм позволяет интерпретировать XML-данные как объекты 1С с типизированными свойствами.
Рассмотрим, как это упрощает доступ к данным. Вместо того чтобы перебирать узлы, мы обращаемся к свойствам объекта через точку, как в обычном справочнике или документе.
ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.ОткрытьФайл("C:\Exchange\Currencies.xml");
// Читаем данные в объект XDTO (предполагается, что схема уже известна или используется фабрика по умолчанию)
МояВалютаXDTO = ФабрикаXDTO.Прочитать(ЧтениеХМЛ);
Для Каждого ТекущаяВалюта Из МояВалютаXDTO.Valute Цикл
Если ТекущаяВалюта.CharCode = "USD" Тогда
Сообщить("Валюта: " + ТекущаяВалюта.Name + " Курс: " + ТекущаяВалюта.Value);
КонецЕсли;
КонецЦикла;
Преимущество XDTO заключается в автоматической типизации данных. Если в XML указано число, в 1С вы получите тип Число, а не строку, что исключает ошибки при дальнейших математических вычислениях.
Проанализируем ситуации, в которых стоит отдавать предпочтение тому или иному методу:
ЧтениеXML. Попытка загрузить большой файл в ПостроительDOM может привести к аварийному завершению сеанса 1С из-за нехватки памяти.Подводя итог, можно сказать: для разовых задач по получению курса одной валюты идеально подходит ПостроительDOM. Для регулярных обменов тяжелыми данными (выгрузки товаров, остатков) следует освоить ЧтениеXML или XDTO.