Работа с XDTO (XML Data Transfer Objects) является одним из наиболее мощных и гибких механизмов в платформе 1С:Предприятие 8 для интеграции с внешними системами. Одной из часто встречающихся задач является формирование XML-файла строго по определенной схеме XSD. В данной статье мы подробно разберем, как правильно инициализировать фабрику XDTO, как найти нужные типы данных внутри схемы и как избежать типичных ошибок, связанных с пространствами имен и регистром символов.
Для начала работы нам необходимо создать объект ФабрикаXDTO на основании имеющегося файла схемы. Платформа 1С позволяет сделать это одной командой, передав путь к файлу. Рассмотрим этот процесс по шагам.
Проанализируем базовый код инициализации:
ПутьКФайлу = "C:\Users\user\Downloads\Schema\Contract_v5.xsd";
Фабрика = СоздатьФабрикуXDTO(ПутьКФайлу);
На этом этапе 1С считывает структуру XSD и строит в памяти модель типов. Однако часто программисты сталкиваются с тем, что метод Тип() возвращает Неопределено. Разберемся, почему это происходит и как правильно передавать параметры в этот метод. Для упрощения работы со сторонними схемами можно использовать инструмент для конвертации схемы XSD в модель XDTO.
Метод Фабрика.Тип() принимает два ключевых параметра: URI пространства имен и Локальное имя. Выясним, где взять эти данные непосредственно в тексте XSD-файла.
<xs:schema> обычно присутствует атрибут targetNamespace. Именно его значение нужно использовать в качестве первого параметра. Если этот атрибут отсутствует (как в примере из обсуждения), то пространство имен считается пустой строкой "". Ошибка многих разработчиков заключается в попытке подставить http://www.w3.org/2001/XMLSchema — помните, что это технический адрес самого языка описания схем, а не вашей конкретной структуры.name у тегов <xs:complexType> или <xs:simpleType>. Например, если в схеме указано <xs:complexType name="SubjectType">, то вторым параметром будет строка "SubjectType".Посмотрим на пример правильного получения типа, если пространство имен в схеме не определено:
// Если targetNamespace в XSD отсутствует, используем пустую строку
ТипОбъекта = Фабрика.Тип("", "SubjectType");
Если ТипОбъекта = Неопределено Тогда
Сообщить("Тип не найден! Проверьте имя и пространство имен.");
Иначе
НовыйОбъект = Фабрика.Создать(ТипОбъекта);
КонецЕсли;
Если файл схемы слишком велик или запутан, мы можем исследовать содержимое созданной фабрики программно. Рассмотрим, как перебрать все пакеты и типы, которые 1С распознала в файле.
Разберем пример кода для анализа состава фабрики:
Для Каждого Пакет Из Фабрика.Пакеты Цикл
Сообщить("Пространство имен: " + Пакет.URIПространстваИмен);
// Просмотр типов объектов (Complex Types)
Для Каждого ТипОбъекта Из Пакет.ТипыОбъектов Цикл
Сообщить(" Объект: " + ТипОбъекта.Имя);
КонецЦикла;
// Просмотр типов значений (Simple Types)
Для Каждого ТипЗначения Из Пакет.ТипыЗначений Цикл
Сообщить(" Значение: " + ТипЗначения.Имя);
КонецЦикла;
КонецЦикла;
Важный момент: Обратите внимание на регистр. 1С крайне чувствительна к написанию имен. Если в схеме тип назван complexType (с маленькой буквы), а вы запрашиваете ComplexType, метод вернет Неопределено.
После того как мы успешно получили тип и создали объект через Фабрика.Создать(), необходимо заполнить его данными и записать в файл. Выясним, как это сделать правильно, используя связку с объектом ЗаписьXML.
Рассмотрим пошаговый процесс записи:
// 1. Инициализируем запись в файл
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Output\Contract.xml", "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
// 2. Заполняем свойства объекта
// Допустим, у нас есть тип SubjectType со свойством FirstName
// Если свойство является вложенным объектом, его тоже нужно создать через фабрику
ТипИмени = Фабрика.Тип("", "TextType");
ИмяОбъекта = Фабрика.Создать(ТипИмени);
ИмяОбъекта.language = "RU";
ИмяОбъекта.Последовательность().ДобавитьТекст("Иван");
НовыйОбъект.Entity = ... // заполняем по структуре
// 3. Записываем объект в XML
// Если объект создан на основании типа, а не глобального свойства,
// нужно указать имя корневого тега вручную
Фабрика.Записать(Запись, НовыйОбъект, "Contract", "");
Запись.Закрыть();
В сложных схемах часто используется конструкция <xs:choice> (выбор). Проанализируем ситуацию: если в объекте предусмотрен выбор между Individual (физическое лицо) и Company (юридическое лицо), то при установке одного свойства другое автоматически сбрасывается.
Для проверки корректности заполнения перед записью рекомендуется использовать метод Проверить(). Это позволит выявить ошибки (например, незаполненные обязательные поля или превышение длины строки) на этапе выполнения кода, а не при попытке чтения файла принимающей стороной. Для итогового контроля уже сформированных выгрузок подойдёт обработка для валидации XML-файлов по схеме XSD.
Проанализируем пример проверки:
Попытка
НовыйОбъект.Проверить();
Сообщить("Объект XDTO заполнен верно.");
Исключение
Сообщить("Ошибка валидации: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если ваша XSD-схема ссылается на другие файлы (использует import или include), прямое использование СоздатьФабрикуXDTO() может не сработать. В таком случае рассмотрим более надежный метод через набор схем:
ЧтениеXML для открытия основного файла схемы.СхемаXML и считываем в него данные.НаборСхемXML.Такой подход гарантирует, что все взаимосвязи между файлами будут корректно разрешены платформой 1С.
Подведем итог: Для успешной работы с XDTO файлом важно точно определить targetNamespace, строго соблюдать регистр имен типов и использовать средства отладки (перебор пакетов) для визуализации структуры схемы в памяти 1С. Понимание того, что фабрика — это "чертеж", а объект XDTO — это "деталь", созданная по этому чертежу, поможет вам эффективно строить интеграционные решения любой сложности.