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

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

Создание объекта XDTO в 1С: руководство для разработчика

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

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

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

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

Фабрика XDTO: откуда берутся типы и объекты

Фабрика XDTO — это точка входа в механизм. Глобальная фабрика ФабрикаXDTO содержит типы всех пакетов XDTO, подключённых к конфигурации, а также встроенные типы платформы. Кроме глобальной фабрики существуют фабрики отдельных пакетов: они создаются программно из файла схемы XSD и используются, когда пакет не нужно хранить в конфигурации постоянно.

Чтобы создать объект, фабрике нужно указать тип. Тип получают методом Тип(), передавая URI пространства имён и имя типа из схемы. Если тип объявлен в пакете XDTO конфигурации, пространство имён совпадает с тем, что указано в свойствах пакета в конфигураторе. Для встроенных типов платформы используется пространство имён http://v8.1c.ru/8.1/data/enterprise/current-config и аналогичные, но чаще всего разработчик работает с собственными пакетами.

Важно понимать разницу: метод ФабрикаXDTO.Тип() возвращает описание типа, а не сам объект. Попытка заполнить свойства у типа приведёт к ошибке — объект создаётся отдельным вызовом Создать().

bsl
// Получаем тип из пространства имён пакета
ТипКонтрагент = ФабрикаXDTO.Тип("http://example.org/exchange", "Контрагент");

// Создаём объект этого типа
Контрагент = ФабрикаXDTO.Создать(ТипКонтрагент);

// Заполняем свойства
Контрагент.Наименование = "ООО Ромашка";
Контрагент.ИНН = "7707083893";

Создание объекта XDTO по типу из пакета

Стандартный сценарий выглядит так: в конфигураторе создан пакет XDTO с пространством имён, в нём описаны типы объектов и их свойства. В коде разработчик получает тип по имени и создаёт экземпляр. Если имя типа или пространство имён указано с ошибкой, метод Тип() вернёт Неопределено или вызовет исключение — это первое, что нужно проверять при отладке.

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

Обратите внимание: регистр имён типов и свойств в XDTO имеет значение. Свойство ИНН и свойство Инн — разные свойства, и обращение с неправильным регистром вызовет ошибку «Свойство не обнаружено». Сверяйте имена со схемой в конфигураторе.

Порядок создания объекта XDTO
  1. 1
    Откройте пакет XDTO в конфигураторе и уточните пространство имён и имена типов
  2. 2
    В коде получите тип: ФабрикаXDTO.Тип(ПространствоИмен, ИмяТипа)
  3. 3
    Проверьте, что тип получен (не Неопределено)
  4. 4
    Создайте объект: ФабрикаXDTO.Создать(Тип)
  5. 5
    Заполните обязательные свойства объекта
  6. 6
    Проверьте объект методом Проверить() или сразу выгрузите в XML

Заполнение свойств: простые типы, вложенные объекты и списки

Свойства простых типов — строки, числа, даты, булево — заполняются прямым присваиванием. Платформа автоматически приводит значение к типу свойства, но если приведение невозможно (например, строка с буквами в числовое свойство), возникнет ошибка. Даты передаются как значения типа Дата, платформа сама форматирует их по правилам XML.

Свойства со сложным типом требуют создания вложенного объекта XDTO того же способом: получить тип вложенного объекта, создать его, заполнить и присвоить свойству родителя. Пропуск этого шага — частая ошибка: нельзя присвоить свойству со сложным типом строку или структуру 1С.

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

bsl
// Вложенный объект
ТипАдрес = ФабрикаXDTO.Тип("http://example.org/exchange", "Адрес");
Адрес = ФабрикаXDTO.Создать(ТипАдрес);
Адрес.Город = "Москва";
Адрес.Индекс = "101000";
Контрагент.Адрес = Адрес;

// Свойство-список
Для Каждого СтрокаТовара Из Товары Цикл
    Товар = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://example.org/exchange", "Товар"));
    Товар.Наименование = СтрокаТовара.Наименование;
    Товар.Цена = СтрокаТовара.Цена;
    Контрагент.Товары.Добавить(Товар);
КонецЦикла;
Типичные ошибки при создании объектов XDTO
01
Присваивание значения свойству-списку напрямую вместо метода Добавить() — возникает ошибка несоответствия типов
02
Опечатка в пространстве имён или имени типа — метод Тип() возвращает Неопределено, а Создать() падает с ошибкой
03
Заполнение только части обязательных свойств — выгрузка в XML завершается ошибкой валидации
04
Передача строки вместо объекта XDTO в свойство сложного типа
05
Игнорирование регистра имён свойств — платформа различает ИНН и Инн

Выгрузка объекта XDTO в XML

После заполнения объект сериализуется в XML через объект ЗаписьXML и метод фабрики ЗаписатьXML(). Типичная последовательность: создать запись XML, открыть файл или установить строку, записать объявление XML, вызвать ФабрикаXDTO.ЗаписатьXML() с передачей объекта и закрыть запись. Результат — корректный XML-документ, соответствующий схеме пакета.

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

При записи можно управлять пространствами имён и префиксами через параметры метода. Если XML предназначен для внешней системы с жёсткими требованиями к префиксам, проверьте результат в текстовом виде — платформа по умолчанию формирует префиксы автоматически.

bsl
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку("UTF-8");
Запись.ЗаписатьОбъявлениеXML();

Контрагент.Проверить(); // валидация по схеме

ФабрикаXDTO.ЗаписатьXML(Запись, Контрагент, "Контрагент");
ТекстXML = Запись.Закрыть();

Создание фабрики XDTO из файла схемы

Не всегда пакет XDTO хранится в конфигурации. Если схема приходит от внешней системы или часто меняется, фабрику можно создать программно из файла XSD. Для этого используется конструктор Новый ФабрикаXDTO() с передачей пути к файлу схемы или набора схем. Дальше работа с такой фабрикой ничем не отличается от глобальной: те же методы Тип() и Создать().

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

bsl
// Фабрика из файла схемы XSD
МояФабрика = Новый ФабрикаXDTO("C:\Schemas\exchange.xsd");
ТипДокумент = МояФабрика.Тип("http://vendor.org/docs", "Документ");
Документ = МояФабрика.Создать(ТипДокумент);

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

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

Финальная проверка — просмотр полученного XML. Сравните его с ожидаемой структурой: все ли элементы на месте, правильные ли пространства имён, корректно ли сериализованы даты и числа. Для отладки удобно выводить XML в сообщение или сохранять во временный файл и открывать в редакторе с подсветкой.

Если объект читается из XML обратно через ФабрикаXDTO.ПрочитатьXML(), убедитесь, что цикл «создание → запись → чтение» сохраняет данные без потерь. Это хороший регрессионный тест для обмена.

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

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

Тип получен из фабрики
Норма

Переменная типа содержит ТипОбъектаXDTO

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

Тип равен Неопределено — проверьте пространство имён и имя типа

Валидация объекта
Норма

Метод Проверить() выполняется без исключений

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

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

Итоговый XML
Норма

Документ открывается, структура соответствует схеме

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

Отсутствуют элементы или неверные пространства имён

Когда XDTO не нужен: альтернативы

XDTO оправдан, когда есть схема данных, нужна валидация и обмен идёт с типизированными структурами. Если же требуется просто прочитать или записать произвольный XML без строгой схемы, проще использовать ЧтениеXML/ЗаписьXML напрямую или построитель DOM. Для обмена между конфигурациями 1С без внешних требований часто достаточно сериализатора ЗаписатьJSON или планов обмена.

Выбор зависит от задачи: жёсткая схема и внешний контрагент — XDTO, свободный формат и скорость разработки — потоковая запись XML или JSON.

Способы работы с XML в 1С

XDTO

Типизированные объекты, валидация по схеме, подходит для регламентированного обмена. Требует описания пакетов или файлов XSD

ЧтениеXML / ЗаписьXML

Потоковая работа с произвольным XML без схемы. Гибко, но вся проверка структуры ложится на разработчика

ПостроительDOM

Удобен для чтения и навигации по готовому XML-документу, но для создания документов кода больше, чем у XDTO

JSON

Подходит для обмена между современными системами, но не заменяет XML там, где формат задан внешними требованиями

Итог

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

Объект XDTO создаётся через ФабрикаXDTO.Создать() с типом, полученным методом Тип() по пространству имён и имени. Списки заполняются через Добавить(), вложенные объекты создаются отдельно, перед записью в XML выполняйте Проверить(). Фабрику из файла схемы создавайте один раз и кешируйте.

Частые вопросы

Чем отличается ФабрикаXDTO от пакета XDTO?

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

Почему метод Тип() возвращает Неопределено?

Чаще всего причина в несовпадении пространства имён или имени типа со схемой: лишний пробел, другой регистр, опечатка в URI. Откройте пакет XDTO в конфигураторе и скопируйте значения оттуда точно. Также проверьте, что пакет включён в состав конфигурации.

Как создать объект XDTO без пакета в конфигурации?

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

Как заполнить свойство, у которого несколько значений?

Такое свойство в объекте XDTO представлено коллекцией СписокXDTO. Используйте метод Добавить() для каждого элемента: Контрагент.Товары.Добавить(Товар). Прямое присваивание списку одного значения вызовет ошибку несоответствия типов.

Нужно ли вызывать Проверить() перед записью в XML?

Не обязательно, но рекомендуется. Метод Проверить() выполняет валидацию по схеме и выдаёт понятную ошибку до сериализации. Без него некорректный объект может быть записан, а проблема обнаружится только на стороне получателя.

Можно ли присвоить свойству XDTO структуру или соответствие 1С?

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