Работа с технологией 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, мы можем извлечь из него данные несколькими способами. Выбор зависит от того, известна ли нам структура объекта заранее.
Значение = ОбъектXDTO.Наименование;. Используется, когда структура жестко описана в схеме.Значение = ОбъектXDTO.Получить("Наименование");. Это незаменимо, если имя свойства хранится в переменной или содержит символы, недопустимые для прямого обращения в коде 1С.
Для Каждого ОписаниеСвойства Из ОбъектXDTO.Свойства() Цикл
Имя = ОписаниеСвойства.Имя;
Значение = ОбъектXDTO.Получить(ОписаниеСвойства);
Сообщить(Имя + ": " + Значение);
КонецЦикла;
Иногда при получении значения (например, строкового) разработчики замечают, что данные возвращаются с лишними кавычками. Выясним причину этого поведения. В XDTO существует понятие простых и сложных типов.
Если свойство объекта имеет простой тип (строка, число, дата), то при обращении ОбъектXDTO.Свойство 1С автоматически выполняет неявное преобразование в соответствующий тип платформы. Если же вы видите кавычки в отладчике, это может означать, что вы получили строковое представление сложного типа или само значение в XML содержит эти символы.
Для гарантированного получения «чистых» данных у узлов, представляющих простые типы, можно использовать программное свойство Значение (Value). Проанализируем ситуацию: если узел является оберткой над значением, то Узел.Значение вернет именно данные в формате 1С (строку без лишних оформлений, число или дату).
Если же кавычки являются частью самой строки из-за некорректного формирования XML на стороне отправителя, можно применить простую очистку:
ЧистоеЗначение = СтрЗаменить(ЗначениеИзXDTO, """", "");
// Или более точечно, если кавычки только по краям:
Если Лев(СтрокаЗначения, 1) = """" И Прав(СтрокаЗначения, 1) = """" Тогда
ЧистоеЗначение = Сред(СтрокаЗначения, 2, СтрДлина(СтрокаЗначения) - 2);
КонецЕсли;
Любой объект XDTO не существует сам по себе — он неразрывно связан с ФабрикойXDTO. Именно фабрика определяет, как интерпретировать данные согласно схемам XSD. Рассмотрим важные моменты:
Проверка на валидность. Перед тем как извлекать значения, полезно проверить, соответствует ли объект своей схеме. Для этого используем метод Проверить(). Если объект невалиден, попытка чтения свойств может привести к непредсказуемым результатам или возврату Неопределено.
Пространства имен (URI). При получении данных из внешних систем (например, через WSПрокси), объект привязан к конкретному пространству имен. Если вы пытаетесь программно сопоставить типы или создать свои объекты для записи в этот узел, всегда учитывайте URI пространства имен, иначе фабрика не сможет правильно сопоставить свойства.
В некоторых случаях структура XML подразумевает «смешанное содержимое», где текст может идти вперемешку с дочерними тегами. В таких ситуациях обычного обращения к свойствам недостаточно. Разберем, как работать с такими данными через объект Последовательность.
Свойство Последовательность() у объекта XDTO позволяет получить данные в том строгом порядке, в котором они следуют в исходном документе. Это критично для специфических форматов обмена, где важен порядок следования элементов, даже если они относятся к разным свойствам одного объекта.
Подводя итог, можно сказать, что работа с XDTO требует внимательности к типам данных. Всегда проверяйте, является ли узел списком или объектом, используйте метод Получить() для динамического доступа и не забывайте о возможности обращения к свойству Значение для простых типов. Эти шаги позволят вам эффективно и без ошибок извлекать любую информацию из XDTO-структур.