Как получить значение объекта XDTO в 1С

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

Работа с технологией XDTO (XML Data Transfer Objects) является стандартом при интеграции 1С с внешними системами через Web-сервисы или при разборе сложных XML-файлов. Однако начинающие разработчики часто сталкиваются с ситуацией, когда при попытке получить конкретное значение из узла XDTO они видят в отладчике «таблицу значений» или получают ошибку обращения к свойству. Разберемся подробно, как правильно извлекать данные из структур XDTO, учитывая их особенности.

Определяем тип узла: Объект или Список

Первое, что необходимо понять при работе с XDTO: вы можете иметь дело либо с конкретным объектом, либо с коллекцией (списком). В 1С это типы ОбъектXDTO и СписокXDTO. Если в отладчике при вычислении выражения вы видите таблицу, это явный признак того, что перед вами СписокXDTO.

Рассмотрим универсальный подход для обработки узла, который может быть как одиночным значением, так и массивом. Проанализируем следующий программный код:


МойМассив = Новый Массив;
Если ТипЗнч(УзелXDTO) = Тип("СписокXDTO") Тогда
    // Если это список, мы можем перебрать его элементы
    Для Каждого ЭлементСписка Из УзелXDTO Цикл
        МойМассив.Добавить(ЭлементСписка);
    КонецЦикла;
ИначеЕсли ТипЗнч(УзелXDTO) = Тип("ОбъектXDTO") Тогда
    // Если это одиночный объект, просто работаем с ним
    МойМассив.Добавить(УзелXDTO);
КонецЕсли;

Для Каждого Элемент Из МойМассив Цикл
    // Теперь мы точно знаем, что работаем с объектом
    Сообщить(Элемент.ИмяНужногоСвойства);
КонецЦикла;

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

Способы обращения к свойствам объекта

Когда мы убедились, что в руках у нас ОбъектXDTO, мы можем извлечь из него данные несколькими способами. Выбор зависит от того, известна ли нам структура объекта заранее.

  1. Прямое обращение через точку. Самый простой вариант: Значение = ОбъектXDTO.Наименование;. Используется, когда структура жестко описана в схеме.
  2. Метод Получить(). Позволяет получить значение по строковому имени свойства: Значение = ОбъектXDTO.Получить("Наименование");. Это незаменимо, если имя свойства хранится в переменной или содержит символы, недопустимые для прямого обращения в коде 1С.
  3. Коллекция Свойства. Мы можем программно перебрать все доступные свойства объекта, не зная их имен:
    
    Для Каждого ОписаниеСвойства Из ОбъектXDTO.Свойства() Цикл
        Имя = ОписаниеСвойства.Имя;
        Значение = ОбъектXDTO.Получить(ОписаниеСвойства);
        Сообщить(Имя + ": " + Значение);
    КонецЦикла;
    

Типизация данных и проблема лишних кавычек

Иногда при получении значения (например, строкового) разработчики замечают, что данные возвращаются с лишними кавычками. Выясним причину этого поведения. В XDTO существует понятие простых и сложных типов.

Если свойство объекта имеет простой тип (строка, число, дата), то при обращении ОбъектXDTO.Свойство 1С автоматически выполняет неявное преобразование в соответствующий тип платформы. Если же вы видите кавычки в отладчике, это может означать, что вы получили строковое представление сложного типа или само значение в XML содержит эти символы.

Для гарантированного получения «чистых» данных у узлов, представляющих простые типы, можно использовать программное свойство Значение (Value). Проанализируем ситуацию: если узел является оберткой над значением, то Узел.Значение вернет именно данные в формате 1С (строку без лишних оформлений, число или дату).

Если же кавычки являются частью самой строки из-за некорректного формирования XML на стороне отправителя, можно применить простую очистку:


ЧистоеЗначение = СтрЗаменить(ЗначениеИзXDTO, """", "");
// Или более точечно, если кавычки только по краям:
Если Лев(СтрокаЗначения, 1) = """" И Прав(СтрокаЗначения, 1) = """" Тогда
    ЧистоеЗначение = Сред(СтрокаЗначения, 2, СтрДлина(СтрокаЗначения) - 2);
КонецЕсли;

Роль Фабрики XDTO и валидация

Любой объект XDTO не существует сам по себе — он неразрывно связан с ФабрикойXDTO. Именно фабрика определяет, как интерпретировать данные согласно схемам XSD. Рассмотрим важные моменты:

Проверка на валидность. Перед тем как извлекать значения, полезно проверить, соответствует ли объект своей схеме. Для этого используем метод Проверить(). Если объект невалиден, попытка чтения свойств может привести к непредсказуемым результатам или возврату Неопределено.

Пространства имен (URI). При получении данных из внешних систем (например, через WSПрокси), объект привязан к конкретному пространству имен. Если вы пытаетесь программно сопоставить типы или создать свои объекты для записи в этот узел, всегда учитывайте URI пространства имен, иначе фабрика не сможет правильно сопоставить свойства.

Работа с последовательностями (XDTOSequence)

В некоторых случаях структура XML подразумевает «смешанное содержимое», где текст может идти вперемешку с дочерними тегами. В таких ситуациях обычного обращения к свойствам недостаточно. Разберем, как работать с такими данными через объект Последовательность.

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

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

← На главную