ФабрикаXDTO.На основе модели типов

Конструкторы

Создает фабрику типов XDTO по модели типов. Модель типов передается в виде объекта XDTO, имеющего тип XDTO {http://v8.1c.ru/8.1/xdto}:Model.

Синтаксис

Новый ФабрикаXDTO(<Модель>, <Пакеты>)
Полное описание, параметры и ограничения

ФабрикаXDTO.На основе модели типов

ФабрикаXDTO (XDTOFactory)

На основе модели типов

Доступен, начиная с версии 8.1.

Синтаксис:
Новый ФабрикаXDTO(<Модель>, <Пакеты>)
Параметры:

<Модель> (необязательный)
Тип: ОбъектXDTO.
Модель типов, по которой необходимо сформировать фабрику типов XDTO.
Модель представляется в виде объекта XDTO, имеющего тип XDTO {http://v8.1c.ru/8.1/xdto}:Model.

<Пакеты> (необязательный)
Тип: Массив, КоллекцияПакетовXDTO.
Коллекция пакетов для разрешения директив импорта модели типов XDTO.
В случае, если модель типов содержит определения типов из пространства имен, имеющихся в коллекции пакетов, или директивы импорта, ссылающиеся на пакет, имеющийся в коллекции, то в фабрику будет помещен данный пакет, а не сконструирован новый.
Описание:

Создает фабрику типов XDTO по модели типов. Модель типов передается в виде объекта XDTO, имеющего тип XDTO {http://v8.1c.ru/8.1/xdto}:Model.

Использование в версии:

Доступен, начиная с версии 8.1.

Методическая информация

Практические примеры

Создать фабрику XDTO через импорт собственной проверенной XSD

ИмпортМоделиXDTO преобразует набор схем в модель типов, но не проверяет его правильность. Сначала проверяем собственную схему, затем создаём фабрику по модели.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Учебная база 8.5.1.1343, серверный общий модуль УчебныеЗадачи. Фрагмент без директив вставьте в тело ВыполнитьПример() Экспорт и запустите собственной учебной командой.

  2. XML в заданиях приведён полностью или создаётся из собственных чисел/строк. Не подставляйте XML из неизвестных внешних источников, объекты метаданных или реальные ссылки вместо учебных значений.

  3. Ни один фрагмент не пишет товары, документы и настройки конфигурации. Файловое упражнение отдельно предупреждает о создании только собственного временного XSD.

  4. Проверки сообщениями ожидают Истина. XML-текст и объекты можно исследовать в отладчике; это не контракт Avito, SOAP или обмен типовой конфигурации.

XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema""
| xmlns:g=""urn:guide:product"" targetNamespace=""urn:guide:product""
| elementFormDefault=""qualified"" version=""1.0"" xml:lang=""ru"">
| <xs:annotation><xs:documentation>Учебный товар, не контракт внешнего API</xs:documentation></xs:annotation>
| <xs:simpleType name=""Sku""><xs:restriction base=""xs:string"">
|  <xs:length value=""4""/><xs:pattern value=""[A-Z][0-9]{3}""/>
| </xs:restriction></xs:simpleType>
| <xs:complexType name=""Product""><xs:sequence>
|  <xs:element name=""name"" type=""xs:string""/>
|  <xs:element name=""quantity"" type=""xs:nonNegativeInteger""/>
|  <xs:element name=""note"" type=""xs:string"" minOccurs=""0""/>
| </xs:sequence><xs:attribute name=""code"" type=""g:Sku"" use=""required""/>
| </xs:complexType>
| <xs:element name=""product"" type=""g:Product""/>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
    ЧтениеДерева = Новый ПостроительDOM;
    ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
    Чтение.Закрыть();
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
    ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
    ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
Модель = ИмпортМоделиXDTO(Набор);
Сообщить(ТипЗнч(Модель) = Тип("ОбъектXDTO"));
ФабрикаИзМодели = Новый ФабрикаXDTO(Модель);
ТипТовара = ФабрикаИзМодели.Тип("urn:guide:product", "Product");
ТипКода = ФабрикаИзМодели.Тип("urn:guide:product", "Sku");
Сообщить(ТипТовара <> Неопределено);
Сообщить(ТипКода <> Неопределено);
Если ТипТовара = Неопределено Или ТипКода = Неопределено Тогда
    ВызватьИсключение "В собственной фабрике отсутствуют Product или Sku";
КонецЕсли;
Сообщить(ТипТовара.Имя = "Product");
Сообщить(ТипТовара.URIПространстваИмен = "urn:guide:product");
Код = ФабрикаИзМодели.Создать(ТипКода, "A001");
Сообщить(Код.ЛексическоеЗначение = "A001");

Разбор по шагам

  1. В исходнике полностью приведена XSD со строковым кодом Sku и объектом Product. ПостроительDOM и ПостроительСхемXML создают схему в памяти.

  2. Набор.Проверить выполняется до ИмпортМоделиXDTO. Сам импорт не делает эту проверку автоматически.

  3. Конструктор ФабрикаXDTO на основе модели получает объект Модель, не массив путей к файлам.

  4. Находим два типа по собственному URI и создаём значение кода A001, соответствующее ограничениям длины/шаблона.

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

  1. Шесть проверок дают Истина.

  2. В отладчике Модель — ОбъектXDTO, фабрика содержит Product и Sku; Код.ЛексическоеЗначение = A001.

Ожидаемый результат

Проверенная собственная XSD преобразована в модель и использована для создания фабрики.

На что обратить внимание

  1. Импорт может преобразовать структуру схемы: не обещайте буквальную идентичность дерева XSD и модели XDTO.

  2. Это не импорт пакета XDTO в конфигурацию и не изменение метаданных базы.

  3. URI модели не является подключением к внешнему сервису; схема не содержит import/include внешних файлов.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Экспортировать свою модель XDTO и построить вторую фабрику

ЭкспортМоделиXDTO выдаёт описание типов Model, а не заказ. По нему создаётся вторая независимая фабрика, в которой снова проверяем собственные ограничения артикула.

Где и как запускать

Полный серверный общий модуль собственной отдельной учебной конфигурации.

Подготовка

  1. Создайте отдельную собственную конфигурацию с именем УчебнаяКонфигурацияСинтаксиса. Не используйте рабочую КА2, УНФ, УТ или БП.

  2. Создайте неглобальный общий модуль УчебнаяМодельXDTO85 с флагом Сервер. Вставьте весь выбранный пример, включая вспомогательные функции, если они присутствуют.

  3. Из серверной команды своей учебной обработки вызовите УчебнаяМодельXDTO85.ВыполнитьПример(). Передавать неизвестный объект или реквизиты чужой конфигурации не нужно.

  4. XSD целиком встроена в код: артикул Sku, цвет Color, список артикулов, объединение, абстрактный Base, строка Item, производный Order и смешанный Note.

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

  6. urn:guide:model85 и URI стандартной XML Schema — идентификаторы пространств имён. Код не загружает их из Интернета; import/include, DTD и внешних файлов нет.

  7. Проверки Истина относятся к приведённой неизменённой учебной XSD. После её изменения сначала пересмотрите ожидаемые типы, границы и обязательность.

  8. Это полный учебный исходник с проверенными статически API, но запуск в 1С не проверялся. Ошибку подготовки схемы не следует принимать за успешную проверку данных.

Процедура ВыполнитьПример() Экспорт
    XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:model85"" targetNamespace=""urn:guide:model85"" elementFormDefault=""qualified"" attributeFormDefault=""unqualified"">
    |<xs:simpleType name=""Sku""><xs:restriction base=""xs:string""><xs:length value=""4""/><xs:pattern value=""[A-Z][0-9]{3}""/></xs:restriction></xs:simpleType>
    |<xs:simpleType name=""Color""><xs:restriction base=""xs:string""><xs:enumeration value=""red""/><xs:enumeration value=""blue""/></xs:restriction></xs:simpleType>
    |<xs:simpleType name=""SkuList""><xs:list itemType=""g:Sku""/></xs:simpleType>
    |<xs:simpleType name=""QuantityOrCode""><xs:union memberTypes=""xs:positiveInteger g:Sku""/></xs:simpleType>
    |<xs:complexType name=""Base"" abstract=""true""><xs:attribute name=""code"" type=""g:Sku"" use=""required""/></xs:complexType>
    |<xs:complexType name=""Item""><xs:sequence><xs:element name=""name"" type=""xs:string""/><xs:element name=""quantity"" type=""xs:nonNegativeInteger""/></xs:sequence></xs:complexType>
    |<xs:complexType name=""Order""><xs:complexContent><xs:extension base=""g:Base""><xs:sequence><xs:element name=""item"" type=""g:Item"" minOccurs=""0"" maxOccurs=""unbounded""/></xs:sequence></xs:extension></xs:complexContent></xs:complexType>
    |<xs:complexType name=""Note"" mixed=""true""><xs:sequence><xs:element name=""amount"" type=""xs:decimal"" minOccurs=""0"" maxOccurs=""unbounded""/></xs:sequence></xs:complexType>
    |<xs:element name=""order"" type=""g:Order""/><xs:element name=""note"" type=""g:Note""/>
    |</xs:schema>";
    ЧтениеСхемы = Новый ЧтениеXML;
    ЧтениеСхемы.УстановитьСтроку(XSD);
    Попытка
        Дерево = Новый ПостроительDOM;
        ДокументСхемы = Дерево.Прочитать(ЧтениеСхемы);
    Исключение
        ОшибкаСхемы = ОписаниеОшибки();
        Попытка
            ЧтениеСхемы.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаСхемы + Символы.ПС + "Закрытие: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаСхемы;
    КонецПопытки;
    ЧтениеСхемы.Закрыть();
    ПостроительСхем = Новый ПостроительСхемXML;
    Схема = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
    Если Схема = Неопределено Тогда
        ВызватьИсключение "Не построена собственная схема коллекций";
    КонецЕсли;
    НаборСхем = Новый НаборСхемXML;
    НаборСхем.Добавить(Схема);
    Если НЕ НаборСхем.Проверить() Тогда
        ВызватьИсключение "Собственная схема не прошла проверку";
    КонецЕсли;
    Фабрика = Новый ФабрикаXDTO(НаборСхем);
    Модель = Фабрика.ЭкспортМоделиXDTO("urn:guide:model85");
    Если ТипЗнч(Модель) <> Тип("ОбъектXDTO") Тогда
        ВызватьИсключение "Ожидался составной экспорт модели";
    КонецЕсли;
    Модель.Проверить();
    Сообщить(Модель.Тип().Имя = "Model");
    Сообщить(Модель.Тип().URIПространстваИмен = "http://v8.1c.ru/8.1/xdto");
    Пакет = Фабрика.Пакеты.Получить("urn:guide:model85");
    Если Пакет = Неопределено Тогда
        ВызватьИсключение "Не найден исходный собственный пакет";
    КонецЕсли;
    ОпорныеПакеты = Пакет.Зависимости;
    Для Индекс = 0 По ОпорныеПакеты.Количество() - 1 Цикл
        ОпорныйПакет = ОпорныеПакеты.Получить(Индекс);
        Если ОпорныйПакет.URIПространстваИмен = "urn:guide:model85" Тогда
            ВызватьИсключение "Не передавайте исходный пакет вместо восстановления модели";
        КонецЕсли;
    КонецЦикла;
    ВтораяФабрика = Новый ФабрикаXDTO(Модель, ОпорныеПакеты);
    ТипАртикула = ВтораяФабрика.Тип("urn:guide:model85", "Sku");
    ТипЗаказа = ВтораяФабрика.Тип("urn:guide:model85", "Order");
    Если ТипАртикула = Неопределено ИЛИ ТипЗаказа = Неопределено Тогда
        ВызватьИсключение "В восстановленной собственной фабрике не найдены Sku/Order";
    КонецЕсли;
    ТипАртикула.Проверить("A001");
    Артикул = ВтораяФабрика.Создать(ТипАртикула, "A001");
    Сообщить(Артикул.Значение = "A001");
    ПроверитьОтклонениеСвоегоЗначения(ВтораяФабрика, ТипАртикула, "A01");
    ВторойЗаказ = ВтораяФабрика.Создать(ТипЗаказа);
    КодВторого = ВторойЗаказ.Свойства().Получить("code");
    Если КодВторого = Неопределено Тогда
        ВызватьИсключение "Не получен собственный унаследованный code";
    КонецЕсли;
    ВторойЗаказ.Установить(КодВторого, Артикул);
    ВторойЗаказ.Проверить();
    Сообщить(ВторойЗаказ.Получить(КодВторого) = "A001");
    Сообщить(ВторойЗаказ.Фабрика() = ВтораяФабрика);
    Сообщить(ТипЗаказа.БазовыйТип.Имя = "Base");
    Сообщить(НЕ ТипЗаказа.Абстрактный);
КонецПроцедуры

Процедура ПроверитьОтклонениеСвоегоЗначения(Фабрика, ТипЗначения, ЛексическоеЗначение)
    Отклонено = Ложь;
    Попытка
        Неподходящее = Фабрика.Создать(ТипЗначения, ЛексическоеЗначение);
        Сообщить("Неожиданно принято: " + Неподходящее.ЛексическоеЗначение);
    Исключение
        Отклонено = Истина;
    КонецПопытки;
    Если НЕ Отклонено Тогда
        ВызватьИсключение "Не отклонено учебное значение: " + ЛексическоеЗначение;
    КонецЕсли;
    Сообщить("Отклонено по собственному контракту: " + ЛексическоеЗначение);
КонецПроцедуры

Разбор по шагам

  1. Экспортировать только пакет собственного URI, а не все пакеты рабочей конфигурации.

  2. Проверить результат ОбъектXDTO и его модель. Имя Model и URI http://v8.1c.ru/8.1/xdto относятся к описанию типов.

  3. Создать вторую ФабрикаXDTO из объекта Model по отдельной перегрузке конструктора. Для разрешения стандартных ссылок передать только зависимости собственного пакета, не сам исходный пакет.

  4. Получить Sku/Order уже из второй фабрики. Не переносить в неё старые описатели СвойствоXDTO первой фабрики.

  5. Проверить A001 и отклонить A01 во второй модели: экспорт сохранил ограничение длины/образца.

  6. Создать заказ второй фабрикой и взять описатель code из него. Заполнить артикул, проверить объект; список item может быть пустым из-за minOccurs=0.

  7. Сверить чтение артикула, происхождение фабрики, базовый тип и конкретность Order. Не выдавать Model за бизнес-заказ.

  8. Экспорт не записывает метаданные конфигурации или файл. Обе фабрики существуют только в памяти этого выполнения.

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

  1. Семь булевых сообщений дают Истина; A01 отклонён также восстановленной моделью.

  2. Объект экспортированной модели имеет тип Model; второй заказ имеет собственный code A001 и не требует строк item.

  3. Пакеты метаданных, товары и документы информационной базы не изменяются.

Ожидаемый результат

Описание своей модели экспортировано и использовано для второй фабрики с сохранённым учебным контрактом.

На что обратить внимание

  1. ЭкспортМоделиXDTO экспортирует типы, не экземпляры заказов и не справочники базы.

  2. Конструктор по модели типов отличается от конструктора по НаборСхемXML. Первый аргумент здесь ОбъектXDTO Model.

  3. Модели с внешними импортами требуют согласованных пакетов; здесь опорные пакеты уже получены из своей фабрики в памяти, внешнего загрузчика нет.

  4. Не считайте совпадение URI/имени гарантией объектной тождественности описателей разных фабрик.

  5. Не заменяйте этот процесс обновлением конфигурации: это локальное построение в памяти, без записи рабочей базы.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.