Что такое XDTO в 1С и зачем он нужен?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Ответ
XDTO (XML Data Type Object) — это встроенная система 1С для работы с XML-данными, которая позволяет автоматически сериализовать и десериализовать объекты 1С в/из XML на основе схем (XSD).
Определение
XDTO — это механизм, который:
- Определяет структуру XML-документов через XSD-схемы
- Автоматически преобразует объекты 1С в XML и обратно
- Валидирует данные при импорте/экспорте
- Генерирует классы для работы с типизированными объектами
Когда нужен 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 в конфигурацию
- В конфигураторе: Сервис → Пакеты XDTO → Импортировать XSD
- Система автоматически создаст классы для работы с данными
Шаг 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 остаётся стандартом для формальных интеграций с корпоративными системами.