К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как работать с XDTO в 1С: практическое руководство

Практическое руководство по работе с XDTO в 1С: создание пакетов, фабрика XDTO, сериализация объектов, чтение и запись XML, типичные ошибки и примеры кода.

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

Механизм XDTO применяется в трёх основных сценариях: сериализация ссылочных объектов и наборов записей в XML, работа по схеме (схеме XSD) при интеграции со сторонними системами и реализация веб-сервисов. Во всех случаях центральным элементом является фабрика XDTO — объект, который «знает» типы данных и умеет создавать и проверять значения.

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

Что такое XDTO и когда его применять

XDTO расшифровывается как XML Data Transfer Objects — объекты передачи данных в формате XML. Идея механизма: вместо ручного формирования XML построчно вы описываете модель данных (типы, свойства, их порядок и обязательность), а платформа сама заботится о корректном формировании и разборе XML-документов.

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

Важно различать два вида фабрики. Глобальная фабрика (свойство ФабрикаXDTO) содержит типы всех пакетов конфигурации и типы объектов метаданных — её используют для сериализации данных 1С. Пользовательскую фабрику создают методом СоздатьФабрикуXDTO() на основе XSD-схемы, когда нужно работать строго по внешнему описанию, не засоряя конфигурацию.

Создание пакета XDTO в конфигураторе

Пакет XDTO — это объект конфигурации, описывающий пространство имён и набор типов данных. Чтобы создать его, откройте в дереве конфигурации ветку «Общие» → «XDTO-пакеты» и добавьте новый элемент. Главное свойство пакета — URI пространства имён, например http://mycompany.ru/exchange/orders. Именно по нему платформа сопоставляет XML-элементы с типами пакета.

Если у вас уже есть готовая XSD-схема от контрагента, не описывайте типы вручную — используйте импорт: в палитре свойств пакета выберите «Импорт XML-схемы» и укажите файл .xsd. Платформа создаст все типы объектов и типы значений автоматически. Это исключает расхождения между вашей моделью и схемой партнёра.

При ручном описании добавляйте «Типы объектов» для составных структур и задавайте свойства: имя, тип значения, нижнюю и верхнюю границу (количество вхождений), признак возможного отсутствия (nillable). Порядок свойств важен: для типов с моделью содержимого «последовательность» XML-элементы должны следовать строго в заданном порядке, иначе чтение завершится ошибкой.

Чтение и запись XML через фабрику XDTO

Базовый цикл работы выглядит так: создать объект XDTO нужного типа, заполнить свойства, записать в XML. Для создания используется метод ФабрикаXDTO.Создать(Тип), где тип получают через ФабрикаXDTO.Тип(URI, ИмяТипа). Запись выполняется методом ФабрикаXDTO.ЗаписатьXML() с предварительно созданным объектом ЗаписьXML.

ТипЗаказ = ФабрикаXDTO.Тип("http://mycompany.ru/exchange", "Заказ");

Заказ = ФабрикаXDTO.Создать(ТипЗаказ);

Заказ.Номер = "А-00125";

Заказ.Дата = ТекущаяДатаСеанса();

Заказ.Покупатель = "ООО Ромашка";

Запись = Новый ЗаписьXML;

Запись.УстановитьСтроку("UTF-8");

ФабрикаXDTO.ЗаписатьXML(Запись, Заказ, "Заказ");

СтрокаXML = Запись.Закрыть();

Чтение выполняется зеркально: создаётся объект ЧтениеXML, открывается файл или строка, затем вызывается ФабрикаXDTO.ПрочитатьXML(Чтение, Тип). Если тип не указан, фабрика определит его по пространству имён и имени корневого элемента. Результат — объект XDTO, свойства которого доступны через точку.

Чтение = Новый ЧтениеXML;

Чтение.УстановитьСтроку(СтрокаXML);

Заказ = ФабрикаXDTO.ПрочитатьXML(Чтение);

Сообщить(Заказ.Номер);

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

Порядок чтения XML по схеме
  1. 1
    Создайте или импортируйте пакет XDTO с нужным пространством имён
  2. 2
    Создайте объект ЧтениеXML и откройте файл или строку
  3. 3
    Вызовите ФабрикаXDTO.ПрочитатьXML с указанием ожидаемого типа
  4. 4
    Обратитесь к свойствам полученного объекта XDTO и проверьте заполненность
  5. 5
    Проверьте списки: даже один элемент списка возвращается как СписокXDTO

Работа со списками и вложенными объектами

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

СтрокаЗаказа = ФабрикаXDTO.Создать(

ФабрикаXDTO.Тип("http://mycompany.ru/exchange", "СтрокаЗаказа"));

СтрокаЗаказа.Товар = "Кресло офисное";

СтрокаЗаказа.Количество = 2;

Заказ.Строки.Добавить(СтрокаЗаказа);

Вложенные объекты создаются так же: сначала через фабрику создаётся объект нужного типа, затем он присваивается свойству родительского объекта. Присваивать «напрямую» примитивные значения можно только свойствам простых типов (строка, число, дата, булево). Для проверки заполненности необязательных свойств используйте метод Установлено("ИмяСвойства") — он вернёт Истина, только если значение было явно задано.

Типичные ошибки
01
Обращение к свойству-списку как к одиночному значению — получаете СписокXDTO вместо ожидаемого объекта и ошибку при дальнейшей работе
02
Нарушение порядка элементов при записи в тип с последовательностью — фабрика выдаёт ошибку валидации либо формирует невалидный XML
03
Чтение необязательного свойства без проверки Установлено() — обращение к незаполненному свойству вызывает исключение
04
Несовпадение пространства имён пакета и XML-документа — ошибка «тип не обнаружен» при чтении

Сериализация объектов конфигурации

Отдельный сценарий — преобразование объектов 1С (элементов справочников, документов, наборов записей) в XML и обратно. Для этого служит объект XDTOСериализатор, который создаётся конструктором Новый СериализаторXDTO(ФабрикаXDTO). Методы ЗаписатьXML() и ПрочитатьXML() сериализатора работают напрямую со значениями платформы.

Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);

Запись = Новый ЗаписьXML;

Запись.УстановитьСтроку();

Сериализатор.ЗаписатьXML(Запись, ЭлементСправочника.ПолучитьОбъект());

СтрокаXML = Запись.Закрыть();

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

Пользовательская фабрика по XSD-схеме

Когда схема обмена нужна только в одном прикладном механизме и не должна быть частью конфигурации, создайте фабрику на лету: Фабрика = СоздатьФабрикуXDTO("путь\к\схеме.xsd") или передайте схему в виде строки. Дальше работа с этой фабрикой ничем не отличается от глобальной — те же методы Тип, Создать, ПрочитатьXML, ЗаписатьXML.

Такой подход удобен для разовых интеграций, загрузки файлов от контрагентов и случаев, когда схема периодически меняется: вы обновляете XSD-файл, не выпуская обновление конфигурации. Ограничение — пользовательская фабрика не содержит типов объектов метаданных, поэтому сериализовать через неё объекты 1С нельзя.

Глобальная и пользовательская фабрика

Глобальная ФабрикаXDTO

Подходит для сериализации объектов конфигурации и постоянных схем обмена; требует описания пакетов в конфигураторе и обновления конфигурации при смене схемы

Пользовательская фабрика по XSD

Подходит для разовых и меняющихся схем интеграции; не требует изменения конфигурации, но не умеет сериализовать объекты метаданных

Прямая работа через ЗаписьXML/ЧтениеXML

Подходит для произвольного XML без строгой схемы; полный контроль, но вся валидация и разбор структуры — на разработчике

Проверка результата и отладка

После формирования XML всегда проверяйте результат двумя способами. Первый — чтение созданного документа той же фабрикой: если ПрочитатьXML отрабатывает без исключений и все свойства на месте, документ соответствует схеме. Второй — валидация методом ФабрикаXDTO.Проверить() или внешним валидатором по исходной XSD, особенно если файл уходит контрагенту.

Для отладки выводите промежуточный XML в строку (ЗаписьXML.УстановитьСтроку()) и анализируйте его в текстовом редакторе с подсветкой. Типичные признаки проблем: отсутствующие обязательные элементы, лишние пустые теги от необязательных свойств, неверный формат дат. Помните, что XDTO сериализует даты в формате ISO 8601, а числа — с точкой в качестве разделителя, независимо от региональных настроек.

Контрольные точки

Как проверить результат

Чтение сформированного XML той же фабрикой
Норма

ПрочитатьXML выполняется без исключений, все свойства заполнены

Тревожный признак

Ошибка валидации или неустановленные свойства — проверьте порядок элементов и обязательность

Пространство имён корневого элемента
Норма

Совпадает с URI пакета XDTO

Тревожный признак

Другое пространство или его отсутствие — документ не будет прочитан по схеме

Списковые свойства
Норма

Обрабатываются как СписокXDTO в цикле

Тревожный признак

Обращение как к одиночному значению — ошибка типа

FAQ

Чем XDTO отличается от обычной работы с ЗаписьXML и ЧтениеXML?

ЗаписьXML и ЧтениеXML — низкоуровневые объекты потоковой работы: вы сами формируете каждый элемент и атрибут. XDTO работает на уровне модели данных: вы оперируете объектами и свойствами, а платформа сама формирует корректный XML и проверяет его по схеме. Для обмена по согласованной XSD-схеме XDTO почти всегда удобнее и надёжнее.

Как обработать необязательное свойство, которого может не быть в XML?

Перед обращением к такому свойству вызовите метод Установлено("ИмяСвойства") — он вернёт Истина только если значение было задано. Если обратиться к неустановленному свойству напрямую, платформа вызовет исключение. В схеме таким свойствам соответствует нижняя граница 0 или атрибут nillable.

Почему при чтении возникает ошибка «тип не обнаружен»?

Чаще всего пространство имён корневого элемента XML не совпадает с URI пакета XDTO, либо нужный тип не описан в пакете. Проверьте URI посимвольно, включая регистр и завершающие слэши. Если схема внешняя — убедитесь, что импортированы все подключаемые XSD-файлы.

Можно ли сериализовать в XDTO таблицу значений или результат запроса?

Напрямую — нет, сериализатор XDTO работает со ссылочными объектами, наборами записей и некоторыми другими типами платформы. Таблицу значений обычно преобразуют в объект XDTO вручную: создают тип со списковым свойством и в цикле переносят строки. Альтернатива — сериализация через ЗначениеВСтрокуВнутр, но такой формат читается только платформой 1С.

Как изменить схему обмена без обновления конфигурации?

Используйте пользовательскую фабрику: храните XSD-схему в файле, макете или строковой константе и создавайте фабрику методом СоздатьФабрикуXDTO в момент обмена. При изменении схемы достаточно заменить XSD-описание — код останется прежним, если имена типов и свойств сохранились.

Что делать, если XML от контрагента содержит элементы, которых нет в схеме?

Строгое чтение через ПрочитатьXML с указанием типа завершится ошибкой при встрече неизвестного элемента. Варианты: дополнить пакет недостающими типами, попросить контрагента привести файл к согласованной схеме или использовать потоковое чтение через ЧтениеXML с пропуском лишних узлов — это менее строго, но устойчиво к расширениям формата.

Итог

Что важно запомнить

XDTO — механизм обмена данными 1С через XML по описанной модели. Создавайте пакеты с корректным URI пространства имён, работайте через фабрику (глобальную или по XSD), помните о списках и порядке свойств, проверяйте необязательные свойства методом Установлено и тестируйте сериализацию объектов на копии базы.