Разработка и Конфигурация · 10 мин
Как прочитать объект XDTO в 1С: пошаговое руководство
Как прочитать объект XDTO в 1С: ЧтениеXML, ФабрикаXDTO, работа со свойствами, списками и типами. Примеры кода, ошибки и проверка результата.
Чтение объекта XDTO — стандартная задача при обмене данными в 1С: загрузке XML-файлов, разборе ответов веб-сервисов, обработке сообщений Enterprise Data и пакетов XDTO. Механизм XDTO (XML Data Transfer Objects) позволяет прочитать XML-документ в объектную модель, где к элементам обращаются как к свойствам объекта, а не как к тексту. Это удобнее и надёжнее ручного разбора XML построчно.
Основная связка для чтения — объект ЧтениеXML плюс метод ПрочитатьXML() фабрики XDTO. Фабрика преобразует поток XML в значение XDTO, тип которого определяется по схеме пакета. Дальше разработчик обращается к свойствам объекта, обходит списки и извлекает значения нужных типов.
Типичная ошибка новичков — путать «объект XDTO» и «значение XDTO». Объект соответствует XML-элементу со вложенной структурой, а значение — простому типу (строке, числу, дате). От этого различия зависит, как именно извлекать данные и какие проверки выполнять.
Что такое объект XDTO и когда его читают
XDTO-пакет — это описание структуры XML-документа: типы объектов, их свойства, типы значений, пространства имён. Конфигурация содержит встроенные пакеты (например, для форматов обмена), а разработчик может добавить свои. Фабрика XDTO — глобальный объект ФабрикаXDTO, который по этой схеме создаёт и читает объекты.
Чтение объекта XDTO нужно в трёх типовых сценариях: загрузка XML-файла, полученного от контрагента или другой системы; разбор тела ответа HTTP-сервиса или веб-сервиса; обработка сообщения в плане обмена, где данные сериализованы в XDTO. Во всех случаях логика одинакова: получить поток XML, передать его фабрике, работать с результатом как с объектом.
Базовый код чтения объекта XDTO из файла и строки
Минимальный пример чтения из файла на диске. Здесь важно, чтобы пространство имён в XML совпадало с пространством имён пакета, иначе фабрика не сможет определить тип и вернёт ошибку.
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\Обмен\data.xml");
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
Чтение.Закрыть();
Если XML приходит как строка (например, из HTTP-ответа), используется УстановитьСтроку() вместо открытия файла. Остальной код не меняется.
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXML);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
Чтение.Закрыть();
После чтения объект доступен через свойства, имена которых совпадают с именами элементов схемы. Например, если в схеме у корневого типа есть свойство Номер и Контрагент, обращение выглядит как ОбъектXDTO.Номер и ОбъектXDTO.Контрагент. Вложенные объекты читаются так же — цепочкой свойств.
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяФайла);
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение);
Чтение.Закрыть();
Сообщить(ОбъектXDTO.Номер);
Для Каждого Строка Из ОбъектXDTO.Товары.Строка Цикл
Сообщить(Строка.Наименование);
КонецЦикла;Работа со свойствами, списками и значениями простых типов
Свойство объекта XDTO может быть трёх видов: значение простого типа (строка, число, дата), вложенный объект XDTO или список XDTO. Простые значения читаются напрямую, вложенные объекты — цепочкой обращений, а списки — циклом Для Каждого. Список XDTO поддерживает методы Количество(), Получить(Индекс) и итерацию.
Тонкость касается элементов со смешанным содержимым и простых типов с атрибутами. Если элемент имеет и текстовое содержимое, и атрибуты, текст извлекается через свойство __content: ОбъектXDTO.Элемент.__content. Если попытаться присвоить весь объект строковой переменной, получите либо ошибку, либо служебное представление, а не текст.
// Список
Для Каждого Позиция Из ОбъектXDTO.Товары Цикл
Сумма = Позиция.Сумма; // число
КонецЦикла;
// Текст элемента с атрибутами
ТекстЗначения = ОбъектXDTO.Комментарий.__content;
Как проверить тип объекта и необязательные свойства
Прочитать тип объекта можно методом Тип(), который возвращает ТипОбъектаXDTO, а сравнить с ожидаемым — через ФабрикаXDTO.Тип(ПространствоИмен, ИмяТипа). Это полезно, когда один и тот же файл может содержать разные корневые элементы.
Если ОбъектXDTO.Тип() = ФабрикаXDTO.Тип("http://example.org/exchange", "Документ") Тогда
// обработка документа
КонецЕсли;
Необязательные свойства (с minOccurs=0 в схеме) могут отсутствовать. Перед обращением проверяйте их через метод Установлено(ИмяСвойства): Если ОбъектXDTO.Установлено("Скидка") Тогда .... Обращение к неустановленному необязательному свойству вернёт Неопределено для простых типов, но для строгих сценариев явная проверка надёжнее и читаемее.
- 1Получите XML: файл, строка или поток HTTP-ответа
- 2Создайте ЧтениеXML и откройте источник (ОткрытьФайл или УстановитьСтроку)
- 3Вызовите ФабрикаXDTO.ПрочитатьXML(Чтение) и закройте ЧтениеXML
- 4Проверьте тип объекта через Тип() при необходимости
- 5Извлеките данные: свойства напрямую, списки циклом, текст через __content
- 6Проверьте результат: количество строк, заполненность ключевых полей
Чтение сообщений обмена и альтернативы XDTO
В планах обмена с форматом Enterprise Data данные приходят уже как объекты XDTO: в обработчике получения данных объект доступен через параметр, и отдельное чтение через ЧтениеXML не требуется. Но если сообщение сохранено в файл, его читают той же связкой, только часто используют ЧтениеСообщенияОбмена, где метод ПрочитатьXML вызывается у фабрики с учётом заголовка сообщения.
XDTO — не единственный способ чтения XML. Если схемы нет или документ имеет произвольную структуру, удобнее последовательное чтение через ЧтениеXML с проверкой ТипУзла или разбор через ПостроительDOM. XDTO выигрывает, когда структура строго описана пакетом и нужна типизация; DOM и потоковое чтение — когда схема неизвестна или документ очень большой.
Способы чтения XML в 1С
Подходит при наличии XDTO-пакета: типизация, обращение по именам свойств. Ограничение: нужна схема и совпадение пространств имён
Подходит для любых XML без схемы и больших файлов. Ограничение: ручной разбор структуры, больше кода
Подходит для навигации по произвольной структуре. Ограничение: весь документ загружается в память
Типичные ошибки и ограничения
Самая частая проблема — исключение «Ошибка разбора XML» или «Не удалось определить тип». Причины: несовпадение пространства имён в файле и пакете, отсутствие типа в схеме, битый файл, неверная кодировка. Проверьте первые строки XML: атрибут xmlns корневого элемента должен совпадать с URI пакета в конфигурации.
Вторая группа ошибок — работа со списками. Если в XML пришла одна строка, а в схеме свойство объявлено списком, фабрика всё равно вернёт список из одного элемента — обращаться надо как к списку. Обратная ситуация: разработчик ждёт список, а свойство в схеме одиночное — тогда цикл упадёт с ошибкой. Смотрите определение типа в пакете, а не только сам XML.
Ограничения безопасности: при чтении файлов, полученных извне, валидируйте данные перед записью в базу. XDTO проверяет соответствие схеме, но не бизнес-логику: отрицательные суммы, несуществующие ссылки и дубли фабрика пропустит. Также помните, что очень большие файлы при чтении в объект XDTO целиком загружаются в память — для гигабайтных выгрузок используйте потоковое чтение.
Как проверить результат чтения
Тип() совпадает с ожидаемым типом пакета
Фабрика вернула другой тип или упала с ошибкой
Количество() соответствует числу строк в XML
Список пуст или меньше ожидаемого
Обязательные свойства заполнены и имеют нужный тип
Неопределено или пустые строки в обязательных полях
Частые вопросы
Чем объект XDTO отличается от значения XDTO?
Объект XDTO соответствует элементу со вложенной структурой и имеет свойства. Значение XDTO — это простое типизированное значение (строка, число, дата), у него нет свойств, только само значение. При чтении через ПрочитатьXML корневой элемент всегда возвращается как объект XDTO.
Почему ПрочитатьXML выдаёт ошибку «Не удалось определить тип»?
Чаще всего пространство имён корневого элемента в XML не совпадает с URI пакета XDTO в конфигурации, либо нужный тип не описан в пакете. Сравните атрибут xmlns в файле с пространством имён пакета в конфигураторе.
Как прочитать атрибут XML-элемента через XDTO?
Если атрибут описан в схеме пакета, он доступен как обычное свойство объекта XDTO по имени. Если атрибут в схеме не описан, через XDTO его не прочитать — используйте потоковое ЧтениеXML или DOM.
Можно ли прочитать XML без создания XDTO-пакета?
Да, но не через ФабрикаXDTO. Используйте последовательное чтение через ЧтениеXML с анализом ТипУзла или ПостроительDOM для навигации по дереву. XDTO требует описанной схемы.
Как обойти список XDTO, если вернулась одна строка?
Никаких специальных действий не нужно: если свойство объявлено списком в схеме, фабрика вернёт список даже с одним элементом. Обходите его циклом Для Каждого — он корректно отработает и для одного элемента.
Что делать с большими XML-файлами, которые не помещаются в память?
Читайте файл потоково через ЧтениеXML, выделяя отдельные фрагменты, и для каждого фрагмента вызывайте ПрочитатьXML. Так объект XDTO создаётся порциями, а не для всего документа сразу.
Что важно запомнить
Чтение объекта XDTO строится на связке ЧтениеXML + ФабрикаXDTO.ПрочитатьXML. Данные извлекаются через свойства объекта, списки обходятся циклом, текст элементов — через __content. Контролируйте пространство имён, проверяйте тип и необязательные свойства, валидируйте данные перед записью в базу.