Как прочитать XSD-файл и создать на его основе XML-документ с помощью XDTO?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Загрузка схемы и создание фабрики XDTO

Для начала работы нам необходимо создать объект ФабрикаXDTO на основании имеющегося файла схемы. Платформа 1С позволяет сделать это одной командой, передав путь к файлу. Рассмотрим этот процесс по шагам.

Проанализируем базовый код инициализации:


ПутьКФайлу = "C:\Users\user\Downloads\Schema\Contract_v5.xsd";
Фабрика = СоздатьФабрикуXDTO(ПутьКФайлу);

На этом этапе 1С считывает структуру XSD и строит в памяти модель типов. Однако часто программисты сталкиваются с тем, что метод Тип() возвращает Неопределено. Разберемся, почему это происходит и как правильно передавать параметры в этот метод. Для упрощения работы со сторонними схемами можно использовать инструмент для конвертации схемы XSD в модель XDTO.

Определение пространства имен (Namespace URI) и локального имени типа

Метод Фабрика.Тип() принимает два ключевых параметра: URI пространства имен и Локальное имя. Выясним, где взять эти данные непосредственно в тексте XSD-файла.

  1. Пространство имен (Namespace): В корневом теге схемы <xs:schema> обычно присутствует атрибут targetNamespace. Именно его значение нужно использовать в качестве первого параметра. Если этот атрибут отсутствует (как в примере из обсуждения), то пространство имен считается пустой строкой "". Ошибка многих разработчиков заключается в попытке подставить http://www.w3.org/2001/XMLSchema — помните, что это технический адрес самого языка описания схем, а не вашей конкретной структуры.
  2. Локальное имя (Local Name): Это значение атрибута name у тегов <xs:complexType> или <xs:simpleType>. Например, если в схеме указано <xs:complexType name="SubjectType">, то вторым параметром будет строка "SubjectType".

Посмотрим на пример правильного получения типа, если пространство имен в схеме не определено:


// Если targetNamespace в XSD отсутствует, используем пустую строку
ТипОбъекта = Фабрика.Тип("", "SubjectType");

Если ТипОбъекта = Неопределено Тогда
    Сообщить("Тип не найден! Проверьте имя и пространство имен.");
Иначе
    НовыйОбъект = Фабрика.Создать(ТипОбъекта);
КонецЕсли;

Как найти нужный тип, если структура XSD неизвестна (Отладка)

Если файл схемы слишком велик или запутан, мы можем исследовать содержимое созданной фабрики программно. Рассмотрим, как перебрать все пакеты и типы, которые 1С распознала в файле.

Разберем пример кода для анализа состава фабрики:


Для Каждого Пакет Из Фабрика.Пакеты Цикл
    Сообщить("Пространство имен: " + Пакет.URIПространстваИмен);
    
    // Просмотр типов объектов (Complex Types)
    Для Каждого ТипОбъекта Из Пакет.ТипыОбъектов Цикл
        Сообщить("  Объект: " + ТипОбъекта.Имя);
    КонецЦикла;
    
    // Просмотр типов значений (Simple Types)
    Для Каждого ТипЗначения Из Пакет.ТипыЗначений Цикл
        Сообщить("  Значение: " + ТипЗначения.Имя);
    КонецЦикла;
КонецЦикла;

Важный момент: Обратите внимание на регистр. 1С крайне чувствительна к написанию имен. Если в схеме тип назван complexType (с маленькой буквы), а вы запрашиваете ComplexType, метод вернет Неопределено.

Создание XML-документа на основе XDTO-объекта

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

Рассмотрим пошаговый процесс записи:


// 1. Инициализируем запись в файл
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Output\Contract.xml", "UTF-8");
Запись.ЗаписатьОбъявлениеXML();

// 2. Заполняем свойства объекта
// Допустим, у нас есть тип SubjectType со свойством FirstName
// Если свойство является вложенным объектом, его тоже нужно создать через фабрику
ТипИмени = Фабрика.Тип("", "TextType");
ИмяОбъекта = Фабрика.Создать(ТипИмени);
ИмяОбъекта.language = "RU";
ИмяОбъекта.Последовательность().ДобавитьТекст("Иван");

НовыйОбъект.Entity = ... // заполняем по структуре

// 3. Записываем объект в XML
// Если объект создан на основании типа, а не глобального свойства,
// нужно указать имя корневого тега вручную
Фабрика.Записать(Запись, НовыйОбъект, "Contract", "");

Запись.Закрыть();

Особенности работы с xs:choice и вложенными структурами

В сложных схемах часто используется конструкция <xs:choice> (выбор). Проанализируем ситуацию: если в объекте предусмотрен выбор между Individual (физическое лицо) и Company (юридическое лицо), то при установке одного свойства другое автоматически сбрасывается.

Для проверки корректности заполнения перед записью рекомендуется использовать метод Проверить(). Это позволит выявить ошибки (например, незаполненные обязательные поля или превышение длины строки) на этапе выполнения кода, а не при попытке чтения файла принимающей стороной. Для итогового контроля уже сформированных выгрузок подойдёт обработка для валидации XML-файлов по схеме XSD.

Проанализируем пример проверки:


Попытка
    НовыйОбъект.Проверить();
    Сообщить("Объект XDTO заполнен верно.");
Исключение
    Сообщить("Ошибка валидации: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Расширенный метод загрузки схем

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

  1. Используем ЧтениеXML для открытия основного файла схемы.
  2. Создаем объект СхемаXML и считываем в него данные.
  3. Добавляем схему в НаборСхемXML.
  4. Создаем фабрику на основе набора.

Такой подход гарантирует, что все взаимосвязи между файлами будут корректно разрешены платформой 1С.

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

← На главную