Как прочитать скрытый текст из XML-элемента с атрибутами через фабрику XDTO в 1С?

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

При работе с XML-файлами в 1С, особенно когда мы используем мощный механизм XDTO (XML Data Transfer Objects), иногда возникают неочевидные ситуации. Одна из таких — это когда нам нужно получить текстовое содержимое XML-элемента, который помимо текста содержит ещё и атрибуты. В стандартном представлении XDTO такой текст может оказаться "невидимым", то есть не доступным как прямое свойство объекта XDTO.

Давайте подробнее рассмотрим эту проблему и выясним, как её эффективно решить.

Анализируем исходную проблему

Предположим, у нас есть следующий фрагмент XML-файла, который мы загружаем через фабрику XDTO:


<?xml version="1.0" encoding="UTF-8"?>
<Start>
  <ID>283673334</ID>
  <Lang>RU</Lang>
  <STAN>159901</STAN>
  <TStatus>0</TStatus>
  <Type>1</Type>
  <CreateTime>27.09.2024 12:40:09</CreateTime>
  <Amount>10649.60</Amount>
  <Email></Email>
  <InvisibleText Code="2004000">Абсолютно невидимый текст</InvisibleText>
  <TimeDescription></TimeDescription>
  <IsTest>0</IsTest>
  <Domain></Domain>
</Start>

Наша задача — получить значение "Абсолютно невидимый текст", которое находится внутри элемента <InvisibleText>. При этом мы успешно можем получить значение атрибута Code этого же элемента, например, с помощью выражения Заказ.InvisibleText.Code (если Заказ — это наш корневой объект XDTO).

Однако, попытка напрямую обратиться к текстовому содержимому элемента InvisibleText как к свойству, например, Заказ.InvisibleText.Текст или подобным образом, не дает результата. В отладчике мы увидим, что объект Заказ.InvisibleText является коллекцией свойств XDTO, которая содержит только одно свойство — "Code". Сам текст при этом остается недоступным через прямые свойства.

Почему текст "невидимый" для XDTO?

Чтобы понять, почему так происходит, нам нужно углубиться в принципы работы механизма XDTO и его интерпретации структуры XML-документов. Когда тип объекта XDTO содержит как атрибуты, так и текстовое содержимое (так называемое "смешанное содержимое"), этот текст не является отдельным именованным свойством. Вместо этого он считается частью "последовательности" элементов и текстовых узлов внутри данного XDTO-объекта.

Для типов объектов XDTO, которые содержат смешанное содержимое, у них устанавливаются в значение "Истина" свойства Последовательный и Смешанный. В таких случаях для доступа к содержимому этого объекта используется объект ПоследовательностьXDTO. Этот объект позволяет нам получить доступ ко всем компонентам содержимого элемента в том порядке, в котором они встречаются в XML-документе.

Важно отметить, что в рамках одного типа объекта XDTO только одно свойство может иметь форму представления "Текст", и если такое свойство есть, то все остальные свойства должны быть представлены как "Атрибут". Это подчеркивает, что текстовое содержимое элемента с атрибутами обрабатывается XDTO иначе, чем обычные свойства-элементы или свойства-атрибуты.

Как получить текстовое содержимое? Используем ПоследовательностьXDTO

Итак, если мы столкнулись с элементом, который имеет и атрибуты, и текстовое содержимое, стандартные способы обращения через свойства объекта XDTO не сработают для получения текста. Но есть специальный механизм для таких случаев — объект ПоследовательностьXDTO.

Чтобы получить "Абсолютно невидимый текст", мы должны выполнить следующие шаги:

  1. Получить объект XDTO элемента: Сначала нам нужно получить ссылку на сам объект XDTO, представляющий элемент <InvisibleText>. В нашем примере это будет Заказ.InvisibleText.
  2. Обратиться к последовательности содержимого: У этого объекта XDTO мы вызываем метод Последовательность(), который возвращает объект типа ПоследовательностьXDTO.
  3. Извлечь текстовое значение: Объект ПоследовательностьXDTO позволяет получить доступ ко всем компонентам содержимого элемента. В большинстве случаев, когда элемент содержит один непрерывный блок текста в дополнение к атрибутам, этот текст будет находиться по индексу 0. Для его извлечения мы используем метод ПолучитьТекст(<Индекс>).

Посмотрим на пример кода, который демонстрирует это решение:


// Предположим, что Заказ уже загружен из XML-файла через ФабрикуXDTO
// Заказ = ФабрикаXDTO.ПрочитатьXML(ИмяФайла);

ТекстЭлемента = Заказ.InvisibleText.Последовательность().ПолучитьТекст(0);

// Теперь в переменной ТекстЭлемента будет храниться значение "Абсолютно невидимый текст"
Сообщить(ТекстЭлемента); 

Это выражение Заказ.InvisibleText.Последовательность().ПолучитьТекст(0) является корректным для получения "Абсолютно невидимого текста". Метод ПолучитьТекст(<Индекс>) объекта ПоследовательностьXDTO позволяет извлечь текстовое значение по указанному индексу в этой последовательности.

Подробнее о ПоследовательностьXDTO

Объект ПоследовательностьXDTO представляет собой упорядоченную коллекцию компонентов содержимого элемента XDTO. Этими компонентами могут быть:

Когда мы имеем дело с элементом, у которого есть атрибуты и простой текст внутри (как в нашем случае с <InvisibleText>), XDTO рассматривает этот текст как один из узлов в последовательности содержимого. Так как текст является первым (и в данном случае единственным) компонентом содержимого после имени элемента и его атрибутов, он получает индекс 0.

Если бы внутри элемента были другие дочерние элементы или комментарии, они также были бы частью этой последовательности, и для доступа к ним потребовался бы соответствующий индекс или метод (например, ПолучитьЭлемент()).

Заключение

Мы успешно разобрались с проблемой извлечения текстового содержимого из XML-элемента, который также содержит атрибуты, при использовании фабрики XDTO в 1С. Ключевым моментом является понимание того, как XDTO обрабатывает "смешанное содержимое" и использование объекта ПоследовательностьXDTO и его метода ПолучитьТекст(). Этот подход является универсальным и позволяет взаимодействовать с упорядоченным содержимым, включая текстовые узлы, для элементов со сложной структурой.

Таким образом, выражение Заказ.InvisibleText.Последовательность().ПолучитьТекст(0) становится нашим надёжным инструментом для доступа к "скрытому" тексту в подобных сценариях.

← На главную