← Назад к вопросам

Что такое XDTO в 1С и зачем он нужен?

2.3 Middle🔥 141 комментариев
#Интеграции и обмены

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ

XDTO (XML Data Type Object) — это встроенная система 1С для работы с XML-данными, которая позволяет автоматически сериализовать и десериализовать объекты 1С в/из XML на основе схем (XSD).

Определение

XDTO — это механизм, который:

  1. Определяет структуру XML-документов через XSD-схемы
  2. Автоматически преобразует объекты 1С в XML и обратно
  3. Валидирует данные при импорте/экспорте
  4. Генерирует классы для работы с типизированными объектами

Когда нужен XDTO

Обмен данными с внешними системами через XML ✓ Сериализация объектов для сохранения состояния ✓ Веб-сервисы — формирование SOAP-запросов ✓ EDI/Электронные документы — унифицированные форматы ✓ Интеграция с 1С системами через XML ✓ Тип-безопасная работа с XML (вместо обработки строк)

Архитектура XDTO

1С Объект
    ↓ (Сериализация)
XML-документ (XSD-схема)
    ↓ (Валидация)
Экспорт/Отправка
    ↓ (Десериализация)
1С Объект

Компоненты XDTO

1. Пакеты (Packages)

Пакет XDTO — контейнер для типов
├── Тип 1 (ObjectType)
│   ├── Свойство 1
│   ├── Свойство 2
│   └── Свойство 3
├── Тип 2 (ValueType)
└── Тип 3 (EnumType)

2. Типы данных

  • ObjectType — объектный тип (как класс)
  • ValueType — примитивный тип (как структура)
  • EnumType — перечисление

3. Свойства

  • Атрибуты
  • Вложенные элементы
  • Текстовое содержимое

Пример: Определение XDTO для счёта

Шаг 1: Определить XSD-схему

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Invoice" type="InvoiceType"/>
    
    <xs:complexType name="InvoiceType">
        <xs:sequence>
            <xs:element name="Number" type="xs:string"/>
            <xs:element name="Date" type="xs:date"/>
            <xs:element name="Amount" type="xs:decimal"/>
            <xs:element name="Items" type="ItemsType"/>
        </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="ItemsType">
        <xs:sequence>
            <xs:element name="Item" type="ItemType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="ItemType">
        <xs:sequence>
            <xs:element name="Name" type="xs:string"/>
            <xs:element name="Quantity" type="xs:integer"/>
            <xs:element name="Price" type="xs:decimal"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

Шаг 2: Загрузить XSD в конфигурацию

  1. В конфигураторе: Сервис → Пакеты XDTO → Импортировать XSD
  2. Система автоматически создаст классы для работы с данными

Шаг 3: Работать с объектами в коде

// Создание объекта по XSD-схеме
Счёт = Новый (XDTO.Пакеты.Invoice.Types.InvoiceType);
Счёт.Number = "СФ-001";
Счёт.Date = ТекущаяДата();
Счёт.Amount = 10000;

// Добавление строк
Счёт.Items = Новый (XDTO.Пакеты.Invoice.Types.ItemsType);
Строка = Новый (XDTO.Пакеты.Invoice.Types.ItemType);
Строка.Name = "Товар 1";
Строка.Quantity = 10;
Строка.Price = 1000;
Счёт.Items.Item.Добавить(Строка);

Сериализация в XML

&НаСервере
Процедура ЭкспортироватьВXML(СчётОбъект)
    // Сериализовать объект в XML
    ФабрикаXDTO = Новый ФабрикаXDTO();
    
    XMLДокумент = ФабрикаXDTO.ЗаписатьОбъект(СчётОбъект);
    
    // Сохранить в файл
    XMLДокумент.Запись("/tmp/invoice.xml");
    
    // Или получить текст
    XMLТекст = XMLДокумент.ПолучитьТекст();
    Сообщить(XMLТекст);
КонецПроцедуры

Результат (XML):

<?xml version="1.0" encoding="UTF-8"?>
<Invoice>
    <Number>СФ-001</Number>
    <Date>2026-03-26</Date>
    <Amount>10000</Amount>
    <Items>
        <Item>
            <Name>Товар 1</Name>
            <Quantity>10</Quantity>
            <Price>1000</Price>
        </Item>
    </Items>
</Invoice>

Десериализация из XML

&НаСервере
Процедура ИмпортироватьИзXML()
    // Прочитать XML из файла
    XMLДокумент = Новый XMLДокумент();
    XMLДокумент.Прочитать("/tmp/invoice.xml");
    
    // Десериализовать в объект
    ФабрикаXDTO = Новый ФабрикаXDTO();
    СчётОбъект = ФабрикаXDTO.ПрочитатьОбъект(XMLДокумент.ДокументЭлемент());
    
    // Работать с объектом как обычно
    Сообщить("Номер счёта: " + СчётОбъект.Number);
    Сообщить("Сумма: " + СчётОбъект.Amount);
    
    // Итерация по строкам
    Для каждого Товар Из СчётОбъект.Items.Item Цикл
        Сообщить(Товар.Name + " - " + Товар.Quantity);
    КонецЦикла;
КонецПроцедуры

Преимущества XDTO

Типизированность — компилятор проверит типы ✓ Автозавершение — IDE подсказывает свойства объектов ✓ Валидация — проверка структуры при загрузке XML ✓ Удобство — не нужно вручную парсить XML ✓ Стандартизация — соответствие XSD-схеме ✓ Безопасность — контроль входных данных ✓ Производительность — оптимизированная работа с большими объёмами

Недостатки XDTO

Сложность — нужно определить и загрузить схему ✗ Жёсткость — изменение схемы требует пересоздания ✗ Вербозность — XML может быть многословным ✗ Кривая обучения — нужно понимать XSD

Альтернативы

1. Ручная работа с XML (DOM)

XMLДокумент = Новый XMLДокумент();
XMLДокумент.Прочитать("файл.xml");
Элемент = XMLДокумент.ДокументЭлемент();
Номер = Элемент.ПолучитьДочерний("Number").Текст();

2. JSON вместо XML (в современных версиях 1С)

ObjJSON = Новый ЧтениеJSON();
ObjJSON.УстановитьСтроку(JSONТекст);
Объект = ЧитатьJSON(ObjJSON);

3. Таблицы значений (для простых структур)

Таблица = Новая ТаблицаЗначений();
Таблица.Добавить();
Таблица[0].Поле = Значение;

Практический пример: интеграция с внешней системой

&НаСервере
Процедура ОтправитьДанныеВОтчёты()
    // Подготовить данные в формате XDTO
    Отчёт = Новый (XDTO.Пакеты.Reports.Types.ReportType);
    Отчёт.Number = "ОПЕ-001";
    Отчёт.Date = ТекущаяДата();
    Отчёт.Sender = "ООО Компания";
    
    // Сериализовать в XML
    ФабрикаXDTO = Новый ФабрикаXDTO();
    XMLДокумент = ФабрикаXDTO.ЗаписатьОбъект(Отчёт);
    XMLТекст = XMLДокумент.ПолучитьТекст();
    
    // Отправить на сервер
    HTTPСоединение = Новый HTTPСоединение("reports.example.com");
    HTTPЗапрос = Новый HTTPЗапрос("/api/reports");
    HTTPЗапрос.УстановитьТелоИзСтроки(XMLТекст);
    HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/xml");
    
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
КонецПроцедуры

Заключение

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

Для современных решений часто предпочитают JSON (легче в веб-системах), но XDTO остаётся стандартом для формальных интеграций с корпоративными системами.

Что такое XDTO в 1С и зачем он нужен? | PrepBro