Как правильно использовать ПостроительDOM для чтения XML в 1С?

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

При работе с XML-документами в 1С разработчики часто сталкиваются с непониманием того, как устроен объект ПостроительDOM. Основная сложность заключается в том, что DOM (Document Object Model) представляет XML-файл как полное дерево узлов, включая не только теги, но и текстовые пробелы, переносы строк и структуру документа. Давайте разберем, как правильно обрабатывать такие данные, чтобы избежать ошибок и получить доступ к нужной информации.

Понимаем структуру дерева узлов

Когда вы используете ПостроительDOM, вы получаете объект документа, состоящий из узлов различных типов. Многие новички ожидают, что цикл по ДочерниеУзлы вернет только список тегов, но на деле в коллекции присутствуют и узлы типа #text. Эти узлы представляют собой пробелы и переносы строк, которые разделяют элементы в исходном XML-файле.

Чтобы эффективно работать с таким деревом, важно использовать рекурсивный подход. Рассмотрим пример универсальной процедуры, которая корректно проходит по всем узлам документа, вне зависимости от их вложенности:


Процедура ПрочитатьУзел(ТекущийУзел, УровеньИерархии)
    Составляющие = Новый Массив;
    Для Индекс = 1 По УровеньИерархии Цикл
        Составляющие.Добавить(Символы.Таб);
    КонецЦикла;
    
    Составляющие.Добавить(ТекущийУзел.ИмяУзла + ?(ПустаяСтрока(ТекущийУзел.ЗначениеУзла), "", "=" + ТекущийУзел.ЗначениеУзла));
    
    // Если у узла есть атрибуты, переберем их
    Если ТекущийУзел.Атрибуты <> Неопределено Тогда
        Для Индекс = 0 По ТекущийУзел.Атрибуты.Количество() - 1 Цикл
            Составляющие.Добавить(" [атрибут]" + ТекущийУзел.Атрибуты[Индекс].Имя + "=" + ТекущийУзел.Атрибуты[Индекс].Значение);
        КонецЦикла;
    КонецЕсли;
    
    Сообщить(СтрСоединить(Составляющие));
    
    // Рекурсивный обход всех дочерних узлов
    Для Каждого Дочерний Из ТекущийУзел.ДочерниеУзлы Цикл
        ПрочитатьУзел(Дочерний, УровеньИерархии + 1);
    КонецЦикла;
КонецПроцедуры

Разбираемся с получением данных из узлов

Часто возникают вопросы при попытке извлечь информацию из узлов и их атрибутов. Рассмотрим основные свойства и методы, с которыми предстоит работать:

Если вам нужно получить значение конкретного атрибута, используйте метод коллекции ПолучитьИменованныйЭлемент. Обратите внимание на следующий пример:


// Предположим, мы нашли нужный узел
ОшибкаDOM = ТекущийУзел; 
Атрибут = ОшибкаDOM.Атрибуты.ПолучитьИменованныйЭлемент("ErrorName");
Если Атрибут <> Неопределено Тогда
    Сообщить("Значение атрибута: " + Атрибут.Значение);
КонецЕсли;

Советы по отладке и подготовке данных

Перед тем как приступать к написанию логики обработки, проверьте корректность самого XML-файла. ПостроительDOM очень строго относится к синтаксису. Если файл содержит несколько заголовков <?xml version='1.0'?>, построение дерева завершится ошибкой. В таких случаях:

  1. Проанализируйте источник данных. Если сервис присылает «грязный» XML, возможно, потребуется предварительная очистка строки через СтрЗаменить.
  2. Используйте отладчик: при проходе циклом по ДочерниеУзлы всегда проверяйте имя узла. Если оно равно #text — это просто форматирование файла, его можно игнорировать.
  3. Если структура документа очень сложная или данные приходят фрагментарно, рассмотрите возможность использования ЧтениеXML в потоковом режиме, что позволит читать файл последовательно, не затрачивая ресурсы на построение полной модели DOM в памяти.

Работа с ПостроительDOM требует внимательности к иерархии узлов. Использование рекурсии — лучший способ гарантированно обработать весь XML, не пропуская ни одного вложенного элемента. Разберитесь с типами узлов, и вы сможете легко манипулировать данными любой сложности. При необходимости разбора данных без ручного обхода дерева можно воспользоваться обработкой для чтения XML в структуру.

← На главную