Как получить имя корневого элемента XML при использовании XDTO в 1С?

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

При работе с механизмом XDTO в 1С разработчики часто сталкиваются с ситуацией, когда необходимо идентифицировать имя корневого узла XML-файла. Особенно остро этот вопрос встает, когда мы работаем с универсальными данными или когда структура XML не жестко привязана к импортированной XSD-схеме. В таких случаях метод ФабрикаXDTO.ПрочитатьXML(ЧтениеXML) создает объект типа anyType, который «поглощает» содержимое, но скрывает метаданные самого тега.

Давайте разберемся, как можно эффективно решить эту задачу, не отказываясь от удобств XDTO.

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

Механизм XDTO в платформе 1С спроектирован для работы со строго типизированными данными. Если в ФабрикаXDTO не загружена схема, описывающая структуру документа, система не может сопоставить корневой элемент с конкретным типом XDTO. В результате 1С создает объект «общего назначения». Свойство Тип().Имя в такой ситуации закономерно возвращает anyType, так как для платформы конкретное имя тега (например, BDD) не является частью предопределенной модели данных.

Решение: считывание имени до десериализации

Самым надежным и простым способом получить доступ к имени корневого элемента является обращение к объекту ЧтениеXML непосредственно перед тем, как мы передадим его в ФабрикаXDTO. Важно понимать, что ЧтениеXML — это потоковый объект. Когда мы считываем метаданные узла, мы не нарушаем поток, и фабрика сможет продолжить чтение объекта с того же места.

Рассмотрим по шагам, как это реализовать на практике:

  1. Открываем файл через объект ЧтениеXML.
  2. Позиционируемся на корневом узле.
  3. Считываем имя узла через свойство ЛокальноеИмя.
  4. Передаем объект чтения в ФабрикаXDTO для дальнейшей обработки.

Давайте посмотрим на пример программного кода, который реализует данный алгоритм:


// Создаем объект чтения XML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(\"ПутьКВашемуФайлу.xml\");

// Переходим к первому (корневому) узлу
ЧтениеXML.Прочитать();

// Получаем имя тега
ИмяКорневогоТега = ЧтениеXML.ЛокальноеИмя;

// Выводим имя для проверки или используем в логике программы
Сообщить(\"Имя корневого элемента: \" + ИмяКорневогоТега);

// Теперь передаем объект чтения в Фабрику XDTO
// Фабрика корректно считает данные, начиная с текущей позиции
XDTO_Объект = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

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

Важные нюансы работы с потоковым чтением

При использовании данного подхода стоит учитывать несколько архитектурных особенностей платформы 1С:

Когда лучше отказаться от XDTO?

Мы проанализировали ситуацию и пришли к выводу: если вы постоянно сталкиваетесь с тем, что ваша фабрика «не узнает» типы и вам приходится вручную вытаскивать имена тегов, это верный признак того, что формат обмена данными не соответствует принципам строго типизированной схемы XSD. XDTO — мощный инструмент для строгой типизации, но он накладывает жесткие требования к описанию данных. Если данные «плавающие» или не структурированы в соответствии со стандартами XSD, лучше использовать более простые инструменты платформы — ЧтениеXML для последовательного обхода или ЧтениеJSON/ЗаписьJSON, если формат обмена позволяет выбрать более современный стандарт.

Надеемся, что предложенное решение поможет вам сэкономить время при разборе XML-файлов и сделать код более предсказуемым!

← На главную