Новый ShortSku основан на xs:string и содержит длину 3 плюс образец. Проверяем связи, копируем тип и удаляем только созданные компоненты.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Каждый фрагмент выполните отдельно на сервере учебной базы. Полная собственная XSD включена в код; используются только namespace urn:guide:product и встроенные типы языка XSD.
Sku описывает код, SkuList — список кодов, SkuOrQuantity — выбор допустимого типа значения. Product и Price — разные составные типы.
Нет DTD, include/import, чтения или записи файла и сетевого доступа. НаборСхемXML.Проверить проверяет собственную схему, не XML-экземпляр товара.
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:simpleType name=""SkuList""><xs:list itemType=""g:Sku""/></xs:simpleType>
| <xs:simpleType name=""SkuOrQuantity""><xs:union memberTypes=""g:Sku xs:nonNegativeInteger""/></xs:simpleType>
| <xs:complexType name=""Price""><xs:simpleContent>
| <xs:annotation><xs:documentation source=""urn:guide:price-content"">Цена — число с атрибутом валюты</xs:documentation></xs:annotation>
| <xs:extension base=""xs:decimal"">
| <xs:annotation><xs:documentation source=""urn:guide:price-extension"">Расширение простого decimal</xs:documentation></xs:annotation>
| <xs:attribute name=""currency"" type=""xs:string"" default=""RUB""/>
| </xs:extension>
| </xs:simpleContent></xs:complexType>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
ЧтениеДерева = Новый ПостроительDOM;
ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
НовыйТип = Новый ОпределениеПростогоТипаXS;
НовыйТип.Имя = "ShortSku";
НовыйТип.Вариант = ВариантПростогоТипаXS.Атомарная;
НовыйТип.ИмяБазовогоТипа = Новый РасширенноеИмяXML("http://www.w3.org/2001/XMLSchema", "string");
Длина = Новый ФасетДлиныXS;
Длина.Значение = 3;
Образец = Новый ФасетОбразцаXS;
Образец.Значение = "[A-Z][0-9]{2}";
НовыйТип.Фасеты.Добавить(Длина);
НовыйТип.Фасеты.Добавить(Образец);
АннотацияОграничения = Новый АннотацияXS;
Примечание = Новый ДокументацияXS;
Примечание.Источник = "urn:guide:short-code-rule";
Примечание.Язык = "ru";
АннотацияОграничения.Состав.Добавить(Примечание);
НовыйТип.АннотацияВарианта = АннотацияОграничения;
Схема.Содержимое.Добавить(НовыйТип);
Схема.ОбновитьЭлементDOM();
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Собственная схема с ShortSku не прошла проверку";
КонецЕсли;
Сообщить(НовыйТип.Фасеты.Количество() = 2);
Сообщить(НовыйТип.Содержит(Образец));
Сообщить(НовыйТип.АннотацияВарианта = АннотацияОграничения);
Базовый = НовыйТип.ОпределениеБазовогоТипа;
Примитивный = НовыйТип.ОпределениеПримитивногоТипа;
Корневой = НовыйТип.КорневойТип;
Если Базовый = Неопределено Или Примитивный = Неопределено Или Корневой = Неопределено Тогда
ВызватьИсключение "Не разрешена иерархия собственного атомарного типа";
КонецЕсли;
Сообщить(Базовый.Имя = "string");
Сообщить(Примитивный.Имя = "string");
Сообщить("Корневой тип: " + Корневой.Имя);
Копия = НовыйТип.КлонироватьКомпоненту(Истина);
Если ТипЗнч(Копия) <> Тип("ОпределениеПростогоТипаXS") Тогда
ВызватьИсключение "Не получена копия ShortSku";
КонецЕсли;
Копия.Имя = "ShortSkuCopy";
Схема.Содержимое.Добавить(Копия);
Схема.ОбновитьЭлементDOM();
Сообщить(Схема.ОпределенияТипов.Количество() = 7);
Сообщить(НовыйТип.Имя = "ShortSku");
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Собственная схема с копией типа не прошла проверку";
КонецЕсли;
Схема.Содержимое.Удалить(Копия);
Схема.Содержимое.Удалить(НовыйТип);
Сообщить(Схема.ОпределенияТипов.Количество() = 5);Разбор по шагам
Конструктор простого типа создаёт отдельный компонент, который ещё не относится к схеме.
Атомарный вариант с базовым QName xs:string задаёт restriction. Два фасета добавляются в собственный тип.
Длина 3 задаёт полную длину, образец — структуру буква A–Z и две цифры. В этом уроке проверяется модель схемы, не набор строк.
АннотацияВарианта относится к restriction. Через Состав добавляется собственная документация источника правила.
После присоединения обновляем DOM и проверяем схему; только затем читаем разрешённые базовый, примитивный и корневой типы.
Копия получает уникальное имя. Исходные пять типов остаются после удаления только двух созданных типов.
Как проверить результат
Восемь логических проверок Истина и диагностическое имя корневого типа.
Количество глобальных типов 5→6→7→5; исходный Sku не переименован и не удалён.
Ожидаемый результат
Конструкторы типа и двух фасетов встроены в полный проверяемый цикл сборки и удаления.
На что обратить внимание
Проверка набора схем не доказывает, что A12 или другая строка успешно провалидирована как XML-экземпляр.
После удаления Копия и НовыйТип не используются; не переносите удаление на чужую модель.
Корневой и примитивный тип — разные уровни иерархии, их имена не объявлены одинаковыми.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.