Почему при загрузке данных из XML через DOM в 1С возвращается «Неопределено»?

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

Разработка обменов данными в 1С часто требует работы с форматами XML. Одной из популярных технологий является использование ПостроительDOM. Однако при попытке прочитать атрибуты узлов разработчики иногда сталкиваются с тем, что методы возвращают Неопределено, даже если визуально в XML-файле данные присутствуют. Давайте разберем, почему это происходит и как правильно организовать процесс загрузки.

Анализ проблемы при работе с DOM

Когда мы используем ПостроительDOM, мы превращаем XML-файл в древовидную структуру объектов. Каждый узел в этой структуре является объектом УзелDOM. Основная сложность заключается в том, что структура DOM-документа может быть сложнее, чем кажется на первый взгляд, и содержать узлы разных типов: не только элементы (теги), но и текстовые узлы, узлы пробелов или комментариев.

Рассмотрим структуру кода, который часто используется для обхода файла:


Парсер = Новый ЧтениеXML;
Парсер.ОткрытьФайл(ПутьКФайлу);
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Парсер);
// Обход узлов документа
Для Каждого Элемент0 Из Документ.ЭлементДокумента.ДочерниеУзлы Цикл
    // ... логика обработки
КонецЦикла;

Основные причины получения значения «Неопределено»

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

  1. Отсутствие атрибута в узле: Самая очевидная причина — атрибут с таким именем физически отсутствует в текущем узле product. Всегда проверяйте результат выполнения метода на равенство значению Неопределено перед тем, как обращаться к свойству Значение.
  2. Регистрозависимость: XML-теги и их атрибуты чувствительны к регистру. Если в файле указан атрибут id, а вы ищете ID, парсер не сможет найти соответствие.
  3. Структура дочерних узлов: Метод ДочерниеУзлы возвращает всё содержимое контейнера. Если вы не проверяете ТипУзла, в ваш цикл могут попадать служебные узлы (например, переносы строк), которые не имеют атрибутов.
  4. Расположение данных: Убедитесь, что данные действительно записаны в виде атрибутов, а не являются текстовым содержимым тега. Если структура XML выглядит как <price>100</price>, то обращаться к атрибутам здесь не нужно — необходимо работать с дочерним текстовым узлом.

Как правильно организовать проверку и получение данных

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


Если Элемент1.ИмяУзла = "product" Тогда
    АтрибутID = Элемент1.Атрибуты.ПолучитьИменованныйЭлемент("id");
    Если АтрибутID <> Неопределено Тогда
        ЗначениеID = АтрибутID.Значение;
    Иначе
        // Обработка ситуации, когда ID не задан
        ЗначениеID = "";
    КонецЕсли;
КонецЕсли;

Рекомендации по отладке процесса

Когда вы работаете с XML, отладчик 1С становится вашим главным инструментом. Для эффективного решения проблем выполните следующие действия:

Применяя эти простые правила, вы сможете легко диагностировать причины возникновения Неопределено и написать стабильный механизм импорта товаров в вашу конфигурацию 1С:Бухгалтерия.

← На главную