Order наследует обязательный артикул абстрактного Base. Проверка выполняется на полностью созданном заказе, а направление ЭтоПотомок подтверждается двумя противоположными вызовами.
Где и как запускать
Полный серверный общий модуль собственной отдельной учебной конфигурации.
Подготовка
Создайте отдельную собственную конфигурацию с именем УчебнаяКонфигурацияСинтаксиса. Не используйте рабочую КА2, УНФ, УТ или БП.
Создайте неглобальный общий модуль УчебнаяМодельXDTO85 с флагом Сервер. Вставьте весь выбранный пример, включая вспомогательные функции, если они присутствуют.
Из серверной команды своей учебной обработки вызовите УчебнаяМодельXDTO85.ВыполнитьПример(). Передавать неизвестный объект или реквизиты чужой конфигурации не нужно.
XSD целиком встроена в код: артикул Sku, цвет Color, список артикулов, объединение, абстрактный Base, строка Item, производный Order и смешанный Note.
Справочники, документы и пакеты XDTO метаданных создавать не нужно. Схема и фабрика принадлежат только этому выполнению в памяти.
urn:guide:model85 и URI стандартной XML Schema — идентификаторы пространств имён. Код не загружает их из Интернета; import/include, DTD и внешних файлов нет.
Проверки Истина относятся к приведённой неизменённой учебной XSD. После её изменения сначала пересмотрите ожидаемые типы, границы и обязательность.
Это полный учебный исходник с проверенными статически 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(НаборСхем);
ТипЗаказа = Фабрика.Тип("urn:guide:model85", "Order");
ТипСтроки = Фабрика.Тип("urn:guide:model85", "Item");
Если ТипЗаказа = Неопределено ИЛИ ТипСтроки = Неопределено Тогда
ВызватьИсключение "В собственной модели не найдены Order и Item";
КонецЕсли;
Заказ = Фабрика.Создать(ТипЗаказа);
СвойствоКода = Заказ.Свойства().Получить("code");
СвойствоСтрок = Заказ.Свойства().Получить("item");
СвойствоИмени = ТипСтроки.Свойства.Получить("name");
СвойствоКоличества = ТипСтроки.Свойства.Получить("quantity");
Если СвойствоКода = Неопределено ИЛИ СвойствоСтрок = Неопределено
ИЛИ СвойствоИмени = Неопределено ИЛИ СвойствоКоличества = Неопределено Тогда
ВызватьИсключение "В собственной модели не найдены четыре описателя";
КонецЕсли;
Заказ.Установить(СвойствоКода, Фабрика.Создать(СвойствоКода.Тип, "A001"));
СтрокиЗаказа = Заказ.ПолучитьСписок(СвойствоСтрок);
Книга = Фабрика.Создать(ТипСтроки);
Книга.Установить(СвойствоИмени, Фабрика.Создать(СвойствоИмени.Тип, "Книга"));
Книга.Установить(СвойствоКоличества, Фабрика.Создать(СвойствоКоличества.Тип, "3"));
Книга = СтрокиЗаказа.Добавить(Книга);
Если ТипЗнч(Книга) <> Тип("ОбъектXDTO") Тогда
ВызватьИсключение "Добавленная строка должна быть составным объектом";
КонецЕсли;
Заказ.Проверить();
Базовый = Фабрика.Тип("urn:guide:model85", "Base");
ТипПояснения = Фабрика.Тип("urn:guide:model85", "Note");
Если Базовый = Неопределено ИЛИ ТипПояснения = Неопределено Тогда
ВызватьИсключение "Не найдены собственные Base и Note";
КонецЕсли;
Сообщить(Базовый.Абстрактный);
Сообщить(НЕ ТипЗаказа.Абстрактный);
Сообщить(ТипЗаказа.БазовыйТип = Базовый);
Сообщить(Базовый.ЭтоПотомок(ТипЗаказа));
Сообщить(НЕ ТипЗаказа.ЭтоПотомок(Базовый));
Сообщить(НЕ ТипЗаказа.Открытый);
Сообщить(НЕ ТипЗаказа.Смешанный);
Сообщить(ТипПояснения.Смешанный);
Сообщить("У Order есть последовательность: " + Строка(ТипЗаказа.Последовательный));
Сообщить("Свойства Order упорядочены: " + Строка(ТипЗаказа.Упорядоченный));
Сообщить(ТипЗаказа.Свойства.Получить("code") = СвойствоКода);
Если НЕ ТипЗаказа.Проверить(Заказ) Тогда
ВызватьИсключение "Созданный заказ не соответствует своему типу";
КонецЕсли;
Сообщить(Заказ.Получить(СвойствоКода) = "A001");
Сообщить(СтрокиЗаказа.Количество() = 1);
КонецПроцедурыРазбор по шагам
Создать Order с артикулом A001 и настоящей вложенной строкой Книга, количество 3. Проверить его обязательные значения.
Получить Base и Note из той же фабрики. Абстрактный Base здесь описывает общую часть, экземпляр создаём только по конкретному Order.
Проверить ссылку Order.БазовыйТип. Вызов Базовый.ЭтоПотомок(ТипЗаказа) спрашивает, является ли переданный Order потомком получателя Base.
Сделать обратную проверку и получить Ложь. Это не проверка прав доступа и не проверка вида данных по строке имени.
Разделить открытость модели, смешанное содержимое, наличие последовательности и упорядоченность свойств. Для последних двух вывести реальное описание полученной модели.
Найти унаследованный code в коллекции описателей Order. Это свойство типа, а его значение читается у Заказа.
ТипЗаказа.Проверить(Заказ) возвращает Булево; Заказ.Проверить() выполняется без присваивания результата. Ошибку или Ложь не принимаем за успех.
В конце сопоставить прочитанный артикул и число строк с исходными учебными данными.
Как проверить результат
Все отдельные булевы сообщения дают Истина, артикул A001, одна строка Книга с количеством 3.
Проверка типа завершена без исключения. Признак смешанного содержания Истина только для собственного Note из этих двух показанных типов.
Сообщения о последовательности и упорядоченности показывают фактические флаги модели; не превращайте их в предполагаемое число строк.
Ожидаемый результат
На настоящем заказе показаны наследование, унаследованный артикул, признаки типа и проверка соответствия.
На что обратить внимание
ЭтоПотомок имеет направление получатель-база → аргумент-потомок. Обратный вызов не эквивалентен.
Нельзя создавать заказ из абстрактного Base или присваивать его readonly-флагам другие значения.
Свойства типа — описатели, а не заполненные значения объекта. Их получение само по себе не заполняет заказ.
Открытый=False означает отсутствие пользовательских свойств этого типа, не запрет изменения уже объявленного поля.
Смешанный=True допускает текст вместе с элементами; это отличается от повторяющегося списка Item.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.