Клонирует данный компонент схемы XML.
Синтаксис
КлонироватьКомпоненту(<Рекурсивно>)Полное описание, параметры и ограничения
ИспользованиеАтрибутаXS.КлонироватьКомпоненту (XSAttributeUse.CloneComponent)
ИспользованиеАтрибутаXS (XSAttributeUse)
КлонироватьКомпоненту (CloneComponent)
Доступен, начиная с версии 8.1.
Синтаксис:
КлонироватьКомпоненту(<Рекурсивно>)
Параметры:
<Рекурсивно> (необязательный)
Тип: Булево.
Признак рекурсивного клонирования компонента (клонируются также компоненты, содержащиеся в данном).
Значение по умолчанию: Истина.
Возвращаемое значение:
Тип: АннотацияXS, СхемаXML, ИнформацияДляПриложенияXS, ДокументацияXS, ФасетМинимальногоИсключающегоЗначенияXS, ФасетМинимальногоВключающегоЗначенияXS, ФасетМаксимальногоИсключающегоЗначенияXS, ФасетМаксимальногоВключающегоЗначенияXS, ФасетДлиныXS, ФасетМинимальнойДлиныXS, ФасетМаксимальнойДлиныXS, ФасетОбщегоКоличестваРазрядовXS, ФасетКоличестваРазрядовДробнойЧастиXS, ФасетПеречисленияXS, ФасетОбразцаXS, ФасетПробельныхСимволовXS, ОпределениеПростогоТипаXS, ОпределениеСоставногоТипаXS, ОпределениеГруппыАтрибутовXS, ОпределениеГруппыМоделиXS, ОбъявлениеАтрибутаXS, ОбъявлениеЭлементаXS, ОпределениеОграниченияИдентичностиXS, ОпределенияXPathXS, ОбъявлениеНотацииXS, МаскаXS, ИмпортXS, ВключениеXS, ПереопределениеXS, ИспользованиеАтрибутаXS, ГруппаМоделиXS, ФрагментXS.
Описание:
Клонирует данный компонент схемы XML.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
XML-счёт: собственные копии фасетов, группы и уникальный артикул4→5→4
Полный memory workflow для новичка: две собственные строки → native XS model → настоящие собственные definition constructors/typed clones/guarded Set → свежая схема → actual XML validation и сумма1050.
Где и как запускать
Полный серверный общий модуль своей новой пустой FileCF .1343; вызывается собственной управляемой формой толстого клиента. XS model/validation не переносится в thin/web. Actual runtime0.
Подготовка
Задача: собственный XML-счёт BOOK3×250=750 и TEA_2×150=300. Проверить артикулам длину4, допустимые символы и уникальность, сменить только независимую live политику4→5→4, получить настоящие числовые поля DOM и сумму1050. Это не импорт рабочей базы.
Вручную создайте НОВУЮ пустую файловую ИБ платформы8.5.1.1343 строго по пути C:\1C85_OwnXSInvoice\7b57b5b8-5742-4d10-9bf0-30a78abc871f\Base. Если путь уже занят, остановитесь. UUID каталога — учебная метка пути, не UUID ИБ. Здесь новая ИБ/каталог/роль/пользователь фактически не создавались.
Конфигуратор: новая конфигурация УчебнаяПолитикаСчетаXS85, основной режим УправляемоеПриложение, совместимость НеИспользовать. Ровно один общий модуль, одна управляемая общая форма и одна роль УчебныйАдминистратор85. Прикладных объектов/общих макетов/хранилищ/параметров сеанса/расширений нет.
В своей роли разрешите Администрирование, запуск толстого управляемого клиента и доступ к своей форме. Создайте ровно одного собственного реального пользователя УчебныйАдминистратор85, войдите им в один сеанс. Native GetUsers требует административного права. Код сравнивает настоящий UUID текущего пользователя с единственным native пользователем, не требует placeholder.
Общие → Общие модули → УчебныйСчетXS85: Глобальный Нет; Сервер Да; оба клиента Нет; Внешнее соединение Нет; Вызов сервера Нет; Привилегированный Нет; повторное использование возвращаемых значений НеИспользовать. Вставьте целиком CODE. moduleOwner=ОбщийМодуль; экспорт только ВыполнитьСвойУрок85, не helpers с чужой схемой.
Общие → Общие формы → ПолитикаСчетаXS85: управляемая форма без основного реквизита. Протокол85 — Строка неограниченной длины, многострочное поле только просмотра. Остановка85 — Булево, начальное значение Ложь, не редактируется. Команда Проверить85 с Действие=Проверить85; одна кнопка Команда=Проверить85. Вставьте FORM целиком.
Корень своей конфигурации → Модуль управляемого приложения: вставьте APPLICATION целиком. Настоящее native ПриНачалеРаботыСистемы() без аргументов открывает только свою форму. Не вызывайте событие вручную. После будущего ручного обновления своей ИБ откройте толстый управляемый клиент и нажмите свою кнопку ровно один раз.
ИсходнаяСхема85 и Счет85 содержат полные собственные тексты. Нет targetNamespace, внешних DTD/сущностей/import/include/schemaLocation, дисковых путей XML, загрузки URL или сетевого контракта. URI xs — имя встроенного языка схем, не инструкция загрузки. Helpers не экспортируются; не подменяйте их внешними входами.
ПостроительDOM.Прочитать(ЧтениеXML) возвращает настоящий XML DOM; ПостроительСхемXML.СоздатьСхемуXML может вернуть Неопределено, поэтому Type guard обязателен. Два экземпляра Original/Live создаются отдельным чтением собственного текста, не объявляются независимыми только по имени переменной.
Каркас:5 глобальных компонентов,2 собственных определения типов Sku/Item,1 invoice,1 Amounts sequence из quantity/price,1 Identity с обязательным sku. Facets ровно2, их индексы находятся по настоящим Type, а не фиксируются0/1. Нет неоднозначного РазрешитьОпределениеТипа.
Новые ОпределениеГруппыМоделиXS/ОпределениеГруппыАтрибутовXS — native конструкторы без аргументов. В live заменяется только фактически найденная own definition с тем же именем; копируются actual model/attribute-use компоненты. Native Contains и Get до/после Set подтверждают exact list state. Unknown/nonempty native default новой группы не очищается — fail-stop.
Новый ОпределениеОграниченияИдентичностиXS и два Новый ОпределенияXPathXS без аргументов создают настоящие Unique/selector item/field @sku. Поля и ОграниченияИдентичности — readonly ссылки на изменяемые native списки: заменять сами свойства нельзя. No-namespace XPath нужен именно своему no-targetNamespace XML.
ФасетДлиныXS/ФасетОбразцаXS.КлонироватьКомпоненту(Истина) возвращает union типов XS: каждый actual Type проверен. Contains(Аннотация) проверяет принадлежность компонента, НЕ соответствие строки регулярному выражению. Содержит не получает BOOK/TEA_; lexical matching выполняет настоящая schema validation.
Native default не обещан пустым. Readback проверяет пустые fresh own collections перед Add, свои count/types/containment до Set. Clone annotation принадлежит clone и не original; если эффект shared/неожиданный — отказ до дальнейших замен. Точный сериализованный собственный DOM-снимок и отдельные typed original readbacks подтверждают этот оригинал, не независимость произвольных внешних схем.
Readonly Фасеты/Содержимое не присваиваются. Native Set(index,component) меняет только детально подтверждённый own список. Value длины — Число4/5, Value образца — Строка [A-Z_]{4}/[A-Z_]{5}; перед сменой обратно обе текущие live величины и ownership проверены. Нет слепого rollback после неизвестной ошибки.
После изменения выполняются UpdateDOM, native сериализация в Строку и НОВОЕ чтение schema model из фактического текущего текста. Затем НОВЫЙ НаборСхемXML/Add/Validate. Использовать старый cached проверенный набор после смены модели запрещено. Fresh reread повторяет facets/identity XPath и полный каркас.
ПараметрыЧтенияXML readonly. Используется реальный конструктор11 optional аргументов: ValidationType задаётся в четвёртой позиции, не setter. XMLReader.SetString получает именно свежий validated SchemaSet третьим аргументом, Read доводится доEOF. Набор.Проверить проверяет схему; чтение проверяет XML-экземпляр — это разные действия.
Положительный счёт прочитан из actual DOM:2 item, настоящий sku, quantity/price, qty5/total1050 вычислены из текста узлов, а не подставлены. При length5 контроль BOOKS/TEA_X также даёт1050; length4 BOOK/TEA_ тогда обязан вызвать native отказ. После подтверждённого собственного возврата4 счёт снова читается.
Каждый отрицательный XML сначала читается без schema validation вне catch, чтобы не маскировать синтаксическую ошибку. Положительный контроль той же актуальной схемы выполняется до/после узкого try, в котором только native SetString/Read. Constructors/schema setup/copy/type/readback failures не классифицируются как ожидаемый отказ. Диагностика берётся фактически, точный текст/номер ошибки не угадывается.
Наблюдение native отказа и двух успешных контролей — учебный ручной протокол, не универсальный классификатор всех ошибок/OOM. Изучите фактическую диагностику отрицательных случаев; если она не про проверяемую XSD, остановитесь, не считайте произвольное исключение успехом. RuntimeVerified=False: здесь 1С/compile/DB/UI/файлы XML/сеть/печать/provisioning/backup0.
При неизвестном частичном отказе client и server оставляют Остановка85=True, rethrow; клиент отдельно устанавливает local flag, поскольку серверное изменение может не синхронизироваться при исключении. Нет автоматического retry, cleanup чужой схемы или обещания атомарности memory/UI действий. Закройте свою форму и разберите причину.
Процедура ПроверитьСвойСтенд85()
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnXSInvoice\7b57b5b8-5742-4d10-9bf0-30a78abc871f\Base"";" Тогда
ВызватьИсключение "Только собственная новая учебная файловая ИБ";
КонецЕсли;
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Не совпали своя конфигурация и точная платформа";
КонецЕсли;
Если Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.ОбщиеМодули.Найти("УчебныйСчетXS85") = Неопределено
Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("ПолитикаСчетаXS85") = Неопределено
Или Метаданные.Роли.Количество() <> 1 Или Метаданные.Роли.Найти("УчебныйАдминистратор85") = Неопределено Тогда
ВызватьИсключение "Нужны только свои общий модуль, форма и роль";
КонецЕсли;
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0
Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0
Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0
Или Метаданные.Обработки.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
Или Метаданные.Константы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0
Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Или Метаданные.ХранилищаНастроек.Количество() <> 0
Или Метаданные.ОбщиеМакеты.Количество() <> 0 Или Метаданные.ПараметрыСеанса.Количество() <> 0 Тогда
ВызватьИсключение "Учебная прикладная схема должна быть пустой";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Урок не допускает расширений";
КонецЕсли;
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если Текущий = Неопределено Или Пользователи.Количество() <> 1 Тогда
ВызватьИсключение "Нужен единственный собственный реальный пользователь ИБ";
КонецЕсли;
Если Текущий.Имя <> "УчебныйАдминистратор85" Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Не совпал реальный UUID пользователя своей ИБ";
КонецЕсли;
КонецПроцедуры
Функция ИсходнаяСхема85()
Возврат "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" version=""1.0"">
|<xs:simpleType name=""Sku""><xs:restriction base=""xs:string"">
|<xs:length value=""4""><xs:annotation><xs:documentation>own-length-four</xs:documentation></xs:annotation></xs:length>
|<xs:pattern value=""[A-Z_]{4}""><xs:annotation><xs:documentation>own-uppercase-or-underscore</xs:documentation></xs:annotation></xs:pattern>
|</xs:restriction></xs:simpleType>
|<xs:group name=""Amounts""><xs:sequence><xs:element name=""quantity"" type=""xs:positiveInteger""/><xs:element name=""price"" type=""xs:decimal""/></xs:sequence></xs:group>
|<xs:attributeGroup name=""Identity""><xs:attribute name=""sku"" type=""Sku"" use=""required""/></xs:attributeGroup>
|<xs:complexType name=""Item""><xs:sequence><xs:group ref=""Amounts""/></xs:sequence><xs:attributeGroup ref=""Identity""/></xs:complexType>
|<xs:element name=""invoice""><xs:complexType><xs:sequence><xs:element name=""item"" type=""Item"" minOccurs=""2"" maxOccurs=""2""/></xs:sequence></xs:complexType></xs:element>
|</xs:schema>";
КонецФункции
Функция Счет85(ПервыйАртикул, ВторойАртикул)
Если (ПервыйАртикул <> "BOOK" И ПервыйАртикул <> "BOOKS")
Или (ВторойАртикул <> "TEA_" И ВторойАртикул <> "TEAX" И ВторойАртикул <> "TEA_X" И ВторойАртикул <> "BOOK" И ВторойАртикул <> "tea_") Тогда
ВызватьИсключение "Артикулы только из собственных фиксированных учебных вариантов, не внешний ввод";
КонецЕсли;
Возврат "<invoice><item sku=""" + ПервыйАртикул + """><quantity>3</quantity><price>250</price></item><item sku=""" + ВторойАртикул + """><quantity>2</quantity><price>150</price></item></invoice>";
КонецФункции
Функция ПараметрыЧтения85(Проверять)
Возврат Новый ПараметрыЧтенияXML("1.0", "ru", ПробельныеСимволыXML.ПоУмолчанию,
?(Проверять, ТипПроверкиXML.СхемаXML, ТипПроверкиXML.НетПроверки), Истина, Истина, Ложь, Ложь, Истина, Ложь, Ложь);
КонецФункции
Функция ПрочитатьСвойDOM85(ТекстXML, Набор = Неопределено)
Если ТипЗнч(ТекстXML) <> Тип("Строка") Или СтрДлина(ТекстXML) > 12000
Или СтрНайти(ВРег(ТекстXML), "<!DOCTYPE") <> 0 Или СтрНайти(ВРег(ТекстXML), "<!ENTITY") <> 0 Тогда
ВызватьИсключение "Только свои ограниченные строки без DTD и сущностей";
КонецЕсли;
Чтение = Новый ЧтениеXML;
Параметры = ПараметрыЧтения85(Набор <> Неопределено);
Построитель = Новый ПостроительDOM;
Попытка
Чтение.УстановитьСтроку(ТекстXML, Параметры, Набор);
Документ = Построитель.Прочитать(Чтение);
Пока Чтение.Прочитать() Цикл
КонецЦикла;
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если ТипЗнч(Документ) <> Тип("ДокументDOM") Или Документ.ОпределениеТипаДокумента <> Неопределено Тогда
ВызватьИсключение "Нужен собственный XML DOM без определения типа документа";
КонецЕсли;
Возврат Документ;
КонецФункции
Функция ПостроитьСвоюСхему85(ТекстXSD)
Документ = ПрочитатьСвойDOM85(ТекстXSD);
ПостроительСхем = Новый ПостроительСхемXML;
Схема = ПостроительСхем.СоздатьСхемуXML(Документ.ЭлементДокумента);
Если ТипЗнч(Схема) <> Тип("СхемаXML") Тогда
ВызватьИсключение "Native builder не вернул схему XML";
КонецЕсли;
ПроверитьКаркас85(Схема);
Возврат Схема;
КонецФункции
Процедура ПроверитьКаркас85(Схема)
Если ТипЗнч(Схема) <> Тип("СхемаXML") Или Схема.ПространствоИмен <> ""
Или Схема.Директивы.Количество() <> 0 Или Схема.Содержимое.Количество() <> 5
Или Схема.ОпределенияТипов.Количество() <> 2 Или Схема.ОбъявленияЭлементов.Количество() <> 1
Или Схема.ОпределенияГруппМоделей.Количество() <> 1 Или Схема.ОпределенияГруппАтрибутов.Количество() <> 1
Или Схема.ОбъявленияАтрибутов.Количество() <> 0 Или Схема.ОбъявленияНотаций.Количество() <> 0 Тогда
ВызватьИсключение "Не совпал полный собственный каркас без импортов и include";
КонецЕсли;
Артикул = Схема.ОпределенияТипов.Получить("Sku", "");
Модель = Схема.ОпределенияГруппМоделей.Получить("Amounts", "");
Атрибуты = Схема.ОпределенияГруппАтрибутов.Получить("Identity", "");
Корень = Схема.ОбъявленияЭлементов.Получить("invoice", "");
Если ТипЗнч(Артикул) <> Тип("ОпределениеПростогоТипаXS") Или ТипЗнч(Модель) <> Тип("ОпределениеГруппыМоделиXS")
Или ТипЗнч(Атрибуты) <> Тип("ОпределениеГруппыАтрибутовXS") Или ТипЗнч(Корень) <> Тип("ОбъявлениеЭлементаXS") Тогда
ВызватьИсключение "Нужны реальные собственные определения, не строки имён";
КонецЕсли;
Если Артикул.Имя <> "Sku" Или Артикул.Фасеты.Количество() <> 2 Или Модель.Имя <> "Amounts" Или Модель.ЭтоСсылка
Или ТипЗнч(Модель.ГруппаМодели) <> Тип("ГруппаМоделиXS") Или Модель.ГруппаМодели.ВидГруппы <> ВидГруппыМоделиXS.Последовательность
Или Модель.ГруппаМодели.Фрагменты.Количество() <> 2 Или Атрибуты.Имя <> "Identity" Или Атрибуты.ЭтоСсылка
Или Атрибуты.Содержимое.Количество() <> 1 Или Корень.Имя <> "invoice" Тогда
ВызватьИсключение "Не совпали собственные поля групп и артикула";
КонецЕсли;
КонецПроцедуры
Функция НайтиСвоиФасеты85(Схема)
Артикул = Схема.ОпределенияТипов.Получить("Sku", "");
Если ТипЗнч(Артикул) <> Тип("ОпределениеПростогоТипаXS") Или Артикул.Фасеты.Количество() <> 2 Тогда
ВызватьИсключение "Не найдены два собственных фасета Sku";
КонецЕсли;
Фасеты = Артикул.Фасеты;
Длина = Неопределено;
Образец = Неопределено;
ИндексДлины = -1;
ИндексОбразца = -1;
Для Индекс = 0 По Фасеты.Количество() - 1 Цикл
Компонент = Фасеты.Получить(Индекс);
Если ТипЗнч(Компонент) = Тип("ФасетДлиныXS") И Длина = Неопределено Тогда
Длина = Компонент;
ИндексДлины = Индекс;
ИначеЕсли ТипЗнч(Компонент) = Тип("ФасетОбразцаXS") И Образец = Неопределено Тогда
Образец = Компонент;
ИндексОбразца = Индекс;
Иначе
ВызватьИсключение "Лишний, повторный или неизвестный фасет";
КонецЕсли;
КонецЦикла;
Если Длина = Неопределено Или Образец = Неопределено Или ИндексДлины < 0 Или ИндексОбразца < 0
Или Не Фасеты.Содержит(Длина) Или Не Фасеты.Содержит(Образец) Тогда
ВызватьИсключение "Не подтверждена собственная коллекция фасетов";
КонецЕсли;
Возврат Новый Структура("Коллекция,Длина,Образец,ИндексДлины,ИндексОбразца", Фасеты, Длина, Образец, ИндексДлины, ИндексОбразца);
КонецФункции
Процедура ЗаменитьСвойКомпонент85(Содержимое, Старый, НовыйКомпонент)
Если ТипЗнч(Содержимое) <> Тип("СписокКомпонентXS") Или Содержимое.Количество() <> 5
Или Не Содержимое.Содержит(Старый) Или Содержимое.Содержит(НовыйКомпонент) Тогда
ВызватьИсключение "Замена только точного своего компонента, не чужая коллекция";
КонецЕсли;
НайденныйИндекс = -1;
Для Индекс = 0 По Содержимое.Количество() - 1 Цикл
Если Содержимое.Получить(Индекс) = Старый Тогда
Если НайденныйИндекс <> -1 Тогда
ВызватьИсключение "Повторный собственный компонент";
КонецЕсли;
НайденныйИндекс = Индекс;
КонецЕсли;
КонецЦикла;
Если НайденныйИндекс < 0 Тогда
ВызватьИсключение "Реальный индекс замены не найден";
КонецЕсли;
Содержимое.Установить(НайденныйИндекс, НовыйКомпонент);
Если Содержимое.Количество() <> 5 Или Содержимое.Содержит(Старый) Или Не Содержимое.Содержит(НовыйКомпонент)
Или Содержимое.Получить(НайденныйИндекс) <> НовыйКомпонент Тогда
ВызватьИсключение "Не подтвердился native readback после замены";
КонецЕсли;
КонецПроцедуры
Процедура УстановитьСвоиОпределения85(Живая)
ПроверитьКаркас85(Живая);
ИсходнаяГруппа = Живая.ОпределенияГруппМоделей.Получить("Amounts", "");
КопияМодели = ИсходнаяГруппа.ГруппаМодели.КлонироватьКомпоненту(Истина);
Если ТипЗнч(КопияМодели) <> Тип("ГруппаМоделиXS") Или КопияМодели.Фрагменты.Количество() <> 2 Тогда
ВызватьИсключение "Нет типизированной рекурсивной копии своей модели";
КонецЕсли;
НоваяГруппа = Новый ОпределениеГруппыМоделиXS;
НоваяГруппа.Имя = "Amounts";
НоваяГруппа.ГруппаМодели = КопияМодели;
ЗаменитьСвойКомпонент85(Живая.Содержимое, ИсходнаяГруппа, НоваяГруппа);
ИсходныеАтрибуты = Живая.ОпределенияГруппАтрибутов.Получить("Identity", "");
Использование = ИсходныеАтрибуты.Содержимое.Получить(0);
Если ТипЗнч(Использование) <> Тип("ИспользованиеАтрибутаXS") Тогда
ВызватьИсключение "Нет собственного использования обязательного атрибута sku";
КонецЕсли;
КопияИспользования = Использование.КлонироватьКомпоненту(Истина);
Если ТипЗнч(КопияИспользования) <> Тип("ИспользованиеАтрибутаXS") Тогда
ВызватьИсключение "Native clone не вернул использование атрибута";
КонецЕсли;
НовыеАтрибуты = Новый ОпределениеГруппыАтрибутовXS;
Если НовыеАтрибуты.Содержимое.Количество() <> 0 Тогда
ВызватьИсключение "Неподтверждённый native default новой группы: не очищаем";
КонецЕсли;
НовыеАтрибуты.Имя = "Identity";
НовыеАтрибуты.Содержимое.Добавить(КопияИспользования);
ЗаменитьСвойКомпонент85(Живая.Содержимое, ИсходныеАтрибуты, НовыеАтрибуты);
Корень = Живая.ОбъявленияЭлементов.Получить("invoice", "");
Если Корень.ОграниченияИдентичности.Количество() <> 0 Тогда
ВызватьИсключение "У своего исходного invoice не должно быть готовых ограничений идентичности";
КонецЕсли;
Ограничение = Новый ОпределениеОграниченияИдентичностиXS;
Если Ограничение.Поля.Количество() <> 0 Тогда
ВызватьИсключение "Неподтверждённое начальное поле native constraint: не очищаем";
КонецЕсли;
Селектор = Новый ОпределенияXPathXS;
Селектор.Вариант = ВариантXPathXS.Селектор;
Селектор.XPath = "item";
Поле = Новый ОпределенияXPathXS;
Поле.Вариант = ВариантXPathXS.Поле;
Поле.XPath = "@sku";
Ограничение.Имя = "OwnUniqueSku";
Ограничение.Категория = КатегорияОграниченияИдентичностиXS.Уникальность;
Ограничение.Селектор = Селектор;
Ограничение.Поля.Добавить(Поле);
Корень.ОграниченияИдентичности.Добавить(Ограничение);
НоваяГруппа.ОбновитьЭлементDOM();
НовыеАтрибуты.ОбновитьЭлементDOM();
Ограничение.ОбновитьЭлементDOM();
Корень.ОбновитьЭлементDOM();
Живая.ОбновитьЭлементDOM();
Если НоваяГруппа.Имя <> "Amounts" Или НоваяГруппа.ГруппаМодели <> КопияМодели
Или НовыеАтрибуты.Имя <> "Identity" Или НовыеАтрибуты.Содержимое.Количество() <> 1
Или НовыеАтрибуты.Содержимое.Получить(0) <> КопияИспользования
Или Корень.ОграниченияИдентичности.Количество() <> 1 Или Корень.ОграниченияИдентичности.Получить(0) <> Ограничение
Или Ограничение.Селектор <> Селектор Или Ограничение.Поля.Количество() <> 1 Или Ограничение.Поля.Получить(0) <> Поле
Или Селектор.XPath <> "item" Или Поле.XPath <> "@sku" Тогда
ВызватьИсключение "Не подтверждён полный собственный live binding";
КонецЕсли;
КонецПроцедуры
Функция УстановитьСвоиКопииФасетов85(Оригинал, Живая)
Исходные = НайтиСвоиФасеты85(Оригинал);
Длина = Исходные.Длина;
Образец = Исходные.Образец;
Если Длина.Значение <> 4 Или Образец.Значение <> "[A-Z_]{4}"
Или ТипЗнч(Длина.Аннотация) <> Тип("АннотацияXS") Или ТипЗнч(Образец.Аннотация) <> Тип("АннотацияXS")
Или Не Длина.Содержит(Длина.Аннотация) Или Не Образец.Содержит(Образец.Аннотация) Тогда
ВызватьИсключение "Нет собственных исходных фасетов и принадлежащих им аннотаций";
КонецЕсли;
КопияДлины = Длина.КлонироватьКомпоненту(Истина);
КопияОбразца = Образец.КлонироватьКомпоненту(Истина);
Если ТипЗнч(КопияДлины) <> Тип("ФасетДлиныXS") Или ТипЗнч(КопияОбразца) <> Тип("ФасетОбразцаXS")
Или ТипЗнч(КопияДлины.Аннотация) <> Тип("АннотацияXS") Или ТипЗнч(КопияОбразца.Аннотация) <> Тип("АннотацияXS") Тогда
ВызватьИсключение "Native clone вернул неожиданный тип";
КонецЕсли;
Если Не КопияДлины.Содержит(КопияДлины.Аннотация) Или Не КопияОбразца.Содержит(КопияОбразца.Аннотация)
Или Длина.Содержит(КопияДлины.Аннотация) Или Образец.Содержит(КопияОбразца.Аннотация) Тогда
ВызватьИсключение "Независимость этих двух копий аннотаций не подтверждена";
КонецЕсли;
Текущие = НайтиСвоиФасеты85(Живая);
Фасеты = Текущие.Коллекция;
Если Фасеты.Содержит(КопияДлины) Или Фасеты.Содержит(КопияОбразца)
Или Фасеты.Получить(Текущие.ИндексДлины) <> Текущие.Длина Или Фасеты.Получить(Текущие.ИндексОбразца) <> Текущие.Образец Тогда
ВызватьИсключение "Исходное собственное состояние live list не подтверждено";
КонецЕсли;
Фасеты.Установить(Текущие.ИндексДлины, КопияДлины);
Фасеты.Установить(Текущие.ИндексОбразца, КопияОбразца);
Если Фасеты.Количество() <> 2 Или Не Фасеты.Содержит(КопияДлины) Или Не Фасеты.Содержит(КопияОбразца)
Или Фасеты.Содержит(Текущие.Длина) Или Фасеты.Содержит(Текущие.Образец)
Или Фасеты.Получить(Текущие.ИндексДлины) <> КопияДлины Или Фасеты.Получить(Текущие.ИндексОбразца) <> КопияОбразца Тогда
ВызватьИсключение "Native Set не подтвердил точную замену своих двух фасетов";
КонецЕсли;
Возврат НайтиСвоиФасеты85(Живая);
КонецФункции
Функция ТекстСвоейМодели85(Схема)
Схема.ОбновитьЭлементDOM();
Если ТипЗнч(Схема.ЭлементDOM) <> Тип("ЭлементDOM") Тогда
ВызватьИсключение "Нет синхронизированного native элемента модели";
КонецЕсли;
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
ПисательDOM = Новый ЗаписьDOM;
ПисательDOM.Записать(Схема.ЭлементDOM, Запись);
Возврат Запись.Закрыть();
КонецФункции
Функция СобратьСвежийНабор85(Живая, ДлинаАртикула, ОбразецАртикула, СУникальностью)
Текущие = НайтиСвоиФасеты85(Живая);
Если Текущие.Длина.Значение <> ДлинаАртикула Или Текущие.Образец.Значение <> ОбразецАртикула Тогда
ВызватьИсключение "Ожидаемые изменения live политики не подтверждены";
КонецЕсли;
Текущие.Длина.ОбновитьЭлементDOM();
Текущие.Образец.ОбновитьЭлементDOM();
Свежая = ПостроитьСвоюСхему85(ТекстСвоейМодели85(Живая));
Прочитанные = НайтиСвоиФасеты85(Свежая);
Если Прочитанные.Длина.Значение <> ДлинаАртикула Или Прочитанные.Образец.Значение <> ОбразецАртикула Тогда
ВызватьИсключение "Native reread не увидел live изменения, старый cached набор не используем";
КонецЕсли;
Корень = Свежая.ОбъявленияЭлементов.Получить("invoice", "");
Если Корень.ОграниченияИдентичности.Количество() <> ?(СУникальностью, 1, 0) Тогда
ВызватьИсключение "Не подтвердилось собственное ограничение в новом фактическом DOM";
КонецЕсли;
Если СУникальностью Тогда
Ограничение = Корень.ОграниченияИдентичности.Получить(0);
Если ТипЗнч(Ограничение) <> Тип("ОпределениеОграниченияИдентичностиXS") Или Ограничение.Имя <> "OwnUniqueSku"
Или Ограничение.Категория <> КатегорияОграниченияИдентичностиXS.Уникальность
Или Ограничение.Селектор.Вариант <> ВариантXPathXS.Селектор Или Ограничение.Селектор.XPath <> "item"
Или Ограничение.Поля.Количество() <> 1 Или Ограничение.Поля.Получить(0).Вариант <> ВариантXPathXS.Поле
Или Ограничение.Поля.Получить(0).XPath <> "@sku" Тогда
ВызватьИсключение "Новый compiled исходник не содержит свои реальные XPath";
КонецЕсли;
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Свежая);
Если Набор.Количество() <> 1 Или Не Набор.Проверить() Тогда
ВызватьИсключение "Свежий собственный набор схем не прошёл native Validate";
КонецЕсли;
Возврат Набор;
КонецФункции
Функция ПрочитатьРеальныйСчет85(ТекстXML, Набор, ПервыйАртикул, ВторойАртикул)
Документ = ПрочитатьСвойDOM85(ТекстXML, Набор);
Корень = Документ.ЭлементДокумента;
Если Корень.ИмяУзла <> "invoice" Или Корень.ДочерниеУзлы.Количество() <> 2 Тогда
ВызватьИсключение "Реальный XML должен содержать ровно две строки своего счёта";
КонецЕсли;
ВсегоКоличество = 0;
ВсегоСумма = 0;
Для Индекс = 0 По 1 Цикл
СтрокаСчета = Корень.ДочерниеУзлы.Элемент(Индекс);
Если ТипЗнч(СтрокаСчета) <> Тип("ЭлементDOM") Или СтрокаСчета.ИмяУзла <> "item"
Или СтрокаСчета.ПолучитьАтрибут("sku") <> ?(Индекс = 0, ПервыйАртикул, ВторойАртикул)
Или СтрокаСчета.ДочерниеУзлы.Количество() <> 2 Тогда
ВызватьИсключение "Не совпала целая фактическая строка своего XML";
КонецЕсли;
УзелКоличество = СтрокаСчета.ДочерниеУзлы.Элемент(0);
УзелЦена = СтрокаСчета.ДочерниеУзлы.Элемент(1);
Если ТипЗнч(УзелКоличество) <> Тип("ЭлементDOM") Или ТипЗнч(УзелЦена) <> Тип("ЭлементDOM")
Или УзелКоличество.ИмяУзла <> "quantity" Или УзелЦена.ИмяУзла <> "price" Тогда
ВызватьИсключение "Реальная модель Amounts не дала свои числовые поля";
КонецЕсли;
Количество = Число(УзелКоличество.ТекстовоеСодержимое);
Цена = Число(УзелЦена.ТекстовоеСодержимое);
Если Количество <> ?(Индекс = 0, 3, 2) Или Цена <> ?(Индекс = 0, 250, 150) Тогда
ВызватьИсключение "В XML прочитаны другие числа";
КонецЕсли;
ВсегоКоличество = ВсегоКоличество + Количество;
ВсегоСумма = ВсегоСумма + Количество * Цена;
КонецЦикла;
Если ВсегоКоличество <> 5 Или ВсегоСумма <> 1050 Тогда
ВызватьИсключение "Не подтвердились суммы из настоящих native DOM значений";
КонецЕсли;
Возврат Новый Структура("Количество,Сумма", ВсегоКоличество, ВсегоСумма);
КонецФункции
Функция ОжидатьNativeОтказ85(Набор, Плохой, Контроль, ПервыйКонтроль, ВторойКонтроль)
ПрочитатьСвойDOM85(Плохой);
ПрочитатьРеальныйСчет85(Контроль, Набор, ПервыйКонтроль, ВторойКонтроль);
Чтение = Новый ЧтениеXML;
Параметры = ПараметрыЧтения85(Истина);
Отказ = Ложь;
Диагностика = "";
Попытка
Чтение.УстановитьСтроку(Плохой, Параметры, Набор);
Пока Чтение.Прочитать() Цикл
КонецЦикла;
Исключение
Отказ = Истина;
Диагностика = ОписаниеОшибки();
КонецПопытки;
Чтение.Закрыть();
Если Не Отказ Или Диагностика = "" Тогда
ВызватьИсключение "Ожидался наблюдаемый native отказ для своего отрицательного XML";
КонецЕсли;
ПрочитатьРеальныйСчет85(Контроль, Набор, ПервыйКонтроль, ВторойКонтроль);
Возврат Диагностика;
КонецФункции
Процедура ПроверитьОригинал85(Оригинал, Снимок)
ПроверитьКаркас85(Оригинал);
Исходные = НайтиСвоиФасеты85(Оригинал);
Если Исходные.Длина.Значение <> 4 Или Исходные.Образец.Значение <> "[A-Z_]{4}"
Или Оригинал.ОбъявленияЭлементов.Получить("invoice", "").ОграниченияИдентичности.Количество() <> 0
Или ТекстСвоейМодели85(Оригинал) <> Снимок Тогда
ВызватьИсключение "Изменился исходный собственный typed модельный или DOM снимок";
КонецЕсли;
НаборОригинала = СобратьСвежийНабор85(Оригинал, 4, "[A-Z_]{4}", Ложь);
ПрочитатьРеальныйСчет85(Счет85("BOOK", "TEA_"), НаборОригинала, "BOOK", "TEA_");
КонецПроцедуры
Функция ВыполнитьСвойУрок85() Экспорт
ПроверитьСвойСтенд85();
Оригинал = ПостроитьСвоюСхему85(ИсходнаяСхема85());
Снимок = ТекстСвоейМодели85(Оригинал);
Живая = ПостроитьСвоюСхему85(ИсходнаяСхема85());
ПроверитьОригинал85(Оригинал, Снимок);
УстановитьСвоиОпределения85(Живая);
Свои = УстановитьСвоиКопииФасетов85(Оригинал, Живая);
Длина = Свои.Длина;
Образец = Свои.Образец;
Набор = СобратьСвежийНабор85(Живая, 4, "[A-Z_]{4}", Истина);
До = ПрочитатьРеальныйСчет85(Счет85("BOOK", "TEA_"), Набор, "BOOK", "TEA_");
Дубликат = ОжидатьNativeОтказ85(Набор, Счет85("BOOK", "BOOK"), Счет85("BOOK", "TEA_"), "BOOK", "TEA_");
ЛишнийСимвол = ОжидатьNativeОтказ85(Набор, Счет85("BOOKS", "TEA_"), Счет85("BOOK", "TEA_"), "BOOK", "TEA_");
НижнийРегистр = ОжидатьNativeОтказ85(Набор, Счет85("BOOK", "tea_"), Счет85("BOOK", "TEA_"), "BOOK", "TEA_");
ПроверитьОригинал85(Оригинал, Снимок);
Если Длина.Значение <> 4 Или Образец.Значение <> "[A-Z_]{4}" Тогда
ВызватьИсключение "Нельзя менять неподтверждённое текущее состояние своей live политики";
КонецЕсли;
Длина.Значение = 5;
Образец.Значение = "[A-Z_]{5}";
НаборПяти = СобратьСвежийНабор85(Живая, 5, "[A-Z_]{5}", Истина);
ДлинаПять = ОжидатьNativeОтказ85(НаборПяти, Счет85("BOOK", "TEA_"), Счет85("BOOKS", "TEA_X"), "BOOKS", "TEA_X");
ПроверитьОригинал85(Оригинал, Снимок);
Если Длина.Значение <> 5 Или Образец.Значение <> "[A-Z_]{5}"
Или Не Свои.Коллекция.Содержит(Длина) Или Не Свои.Коллекция.Содержит(Образец) Тогда
ВызватьИсключение "Не подтверждено своё состояние5; никакого слепого восстановления";
КонецЕсли;
Длина.Значение = 4;
Образец.Значение = "[A-Z_]{4}";
ФинальныйНабор = СобратьСвежийНабор85(Живая, 4, "[A-Z_]{4}", Истина);
После = ПрочитатьРеальныйСчет85(Счет85("BOOK", "TEA_"), ФинальныйНабор, "BOOK", "TEA_");
ПроверитьОригинал85(Оригинал, Снимок);
Если До.Количество <> После.Количество Или До.Сумма <> После.Сумма Тогда
ВызватьИсключение "Реальный счёт изменился после собственной подтверждённой смены политики";
КонецЕсли;
Возврат "Ожидаемый ручной протокол: native счёт2строки, количество5, сумма1050; политика4→5→4."
+ Символы.ПС + "Дубликат: " + Дубликат + Символы.ПС + "Артикул5 при длине4: " + ЛишнийСимвол
+ Символы.ПС + "Нижний регистр: " + НижнийРегистр + Символы.ПС + "Артикул4 при длине5: " + ДлинаПять;
КонецФункцииПолный модуль своей управляемой общей формы
Общие → Общие формы → ПолитикаСчетаXS85 → Модуль
Windows thick managed client/server own form; sticky guard at both boundaries.
&НаКлиенте
Процедура Проверить85(Команда)
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если Остановка85 Или ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда <> Команды.Проверить85 Тогда
ВызватьИсключение "Своя форма остановлена или команда не принадлежит ей";
КонецЕсли;
Попытка
ПроверитьНаСервере85();
Исключение
Остановка85 = Истина;
Протокол85 = "Отказ: закройте форму. Никакого автоматического повтора или отката.";
ВызватьИсключение;
КонецПопытки;
#Иначе
ВызватьИсключение "Урок только для своего толстого управляемого клиента";
#КонецЕсли
КонецПроцедуры
&НаСервере
Процедура ПроверитьНаСервере85()
Если Остановка85 Тогда
ВызватьИсключение "Серверная граница запрещает повтор после частичной ошибки";
КонецЕсли;
Попытка
Протокол85 = УчебныйСчетXS85.ВыполнитьСвойУрок85();
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыПолный модуль своего управляемого приложения
Своя конфигурация → Модуль управляемого приложения
Windows thick managed own application, real OnStart0.
Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентУправляемоеПриложение Тогда
ОткрытьФорму("ОбщаяФорма.ПолитикаСчетаXS85");
#Иначе
ВызватьИсключение "Учебный сценарий только для своего толстого управляемого клиента";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Подготовьте только свой exact FileCF/пользователя/модули/управляемую форму. Запуск вручную один раз своей настоящей кнопкой.
Создайте Original и Live отдельными native чтениями полного своего XSD. Зафиксируйте original typed/DOM snapshot и positive1050.
Постройте новые Amounts/Identity definition, замените только соответствующие own components по найденным индексам. Добавьте свой настоящий Unique constraint selector item/field @sku.
Клонируйте настоящие annotated facets, проверьте actual types/containment/отсутствие shared annotation, затем native Set только в exact live список.
Постройте fresh SchemaSet из актуального native DOM. Реальные BOOK/TEA_ дают qty5/total1050; duplicateBOOK, SKU5 и lower-case вызывают наблюдаемый native отказ при двух successful controls.
Только подтверждённые live clones переведите на length5/pattern5. Контроль BOOKS/TEA_X успешен1050, оригинальный4char счёт rejected. Original всё ещё прежний.
При exact own state5 и подтверждённом containment верните4. Ещё один fresh model/set даёт actual1050; original snapshot остаётся точным.
Как проверить результат
Будущая ручная positive проверка: реальные2 DOM item, quantity3/2, price250/150, totalQuantity5, totalSum1050 до/после.
Live Components5 и Facets2 не меняют количество при Set; новые definition реально присутствуют, старые отсутствуют. Fresh native XPath Unique присутствует ровно1 только в Live.
Четыре наблюдаемых native отказа: duplicateBOOK, BOOKS при length4, tea_, BOOK/TEA_ при length5. Каждый bad XML синтаксически проверен отдельно, каждый актуальный good control успешен до/после.
В own отрицательной проверке подмените index/type/arity/readonly/clone binding/unknown default: явный fail-stop до продолжения, не условный пропуск или подставленный исходный объект.
Статические/native-source проверки не подтверждают реальный запуск, compile/XSD engine behavior, default emptiness, конкретную диагностику или GUI rendering.
Ожидаемый результат
Ожидаемый будущий ручной результат: actual XML-счёт2строки, qty5/total1050, live политика4→5→4,4 наблюдаемых отрицательных проверки, исходная модель без изменений. RuntimeVerified=False; actual1C/compile/DB/UI/XMLfiles/network/backup0.
На что обратить внимание
Contains принимает XS компонент, а не артикул и не регулярное выражение. Лексические ограничения реально применяет XMLReader с ТипПроверкиXML.СхемаXML.
Новый НаборСхемXML после изменения нельзя заменить старым checkedSet. UpdateDOM/native serialization/fresh parsing/readback фиксируют фактическую текущую модель.
Readonly child collections не равны readonly элементам: Фасеты/Поля/ОграниченияИдентичности/Содержимое не присваиваются, используются только documented own methods.
Нельзя выдумывать параметры нулевых конструкторов/возвращаемый объект у Set/UpdateDOM/Add. Broad clone return требует проверки actual Type.
Не используются DTD/DOM entity maps, undocumented canonicalization, неоднозначные ResolveTypeDefinition/IsSubset/HTMLCompare/DeleteCell; count10 не расширяется ими.
Свои literal XML/XSD и контролируемые аргументы не заменяются внешним вводом. Это учебный in-memory контракт, не безопасный универсальный XML-парсер/импорт/производственная миграция.
Наблюдаемая ошибка XML без документированного errorcode не является универсальным доказательством именно XSD нарушения; будущую фактическую диагностику нужно читать. Здесь runtime0.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Изменять отдельные копии модели, фрагмента и атрибута
После сборки preview создаются три независимые рекурсивные копии его частей. Исходная группа, обязательность label и валюта RUB сохраняются.
Где и как запускать
Полный модуль серверного общего модуля УчебныеЗадачи (флаг Сервер) в учебной базе. Вызовите ВыполнитьПример() из серверного обработчика своей обработки. Вставляйте обе процедуры на уровне модуля.
Подготовка
Выполните каждый полный модуль отдельно на сервере учебной базы. Вызовите ВыполнитьПример(); функция чтения схемы включена ниже в том же модуле.
Схема включена строкой. note — учебное примечание, currency — фиксированная валюта, wrapper содержит ссылки на них. Обмен и рабочие объекты не используются.
Нет DTD, импорта, файлов, сети или записи данных базы. Проверить проверяет XSD, а не XML-экземпляр товара.
Имена и namespace берите из собственной схемы. Не заменяйте их случайным узлом внешнего сервиса.
Процедура ВыполнитьПример() Экспорт
ТекстXSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:declarations"" targetNamespace=""urn:guide:declarations"" elementFormDefault=""qualified"" attributeFormDefault=""unqualified""><xs:element name=""note"" type=""xs:string"" default=""Без примечания"" nillable=""true""><xs:annotation><xs:documentation xml:lang=""ru"">Учебное примечание</xs:documentation></xs:annotation></xs:element><xs:attribute name=""currency"" type=""xs:string"" fixed=""RUB""><xs:annotation><xs:documentation xml:lang=""ru"">Учебная валюта</xs:documentation></xs:annotation></xs:attribute><xs:element name=""wrapper""><xs:complexType><xs:sequence><xs:element ref=""g:note""><xs:annotation><xs:documentation>Ссылка на примечание</xs:documentation></xs:annotation></xs:element></xs:sequence><xs:attribute ref=""g:currency"" use=""optional""><xs:annotation><xs:documentation>Использование валюты</xs:documentation></xs:annotation></xs:attribute></xs:complexType></xs:element></xs:schema>";
Схема = ПрочитатьСвоюСхему(ТекстXSD);
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Исходная собственная XSD не прошла проверку";
КонецЕсли;
НоваяМетка = Новый ОбъявлениеЭлементаXS;
НоваяМетка.Имя = "label";
НоваяМетка.ИмяТипа = Новый РасширенноеИмяXML("http://www.w3.org/2001/XMLSchema", "string");
НоваяМетка.Форма = ФормаПредставленияXS.Квалифицированная;
ФрагментМетки = Новый ФрагментXS;
ФрагментМетки.МинимальноВходит = 1;
ФрагментМетки.МаксимальноВходит = 1;
ФрагментМетки.Часть = НоваяМетка;
Группа = Новый ГруппаМоделиXS;
Группа.ВидГруппы = ВидГруппыМоделиXS.Последовательность;
Группа.Фрагменты.Добавить(ФрагментМетки);
ФрагментГруппы = Новый ФрагментXS;
ФрагментГруппы.МинимальноВходит = 1;
ФрагментГруппы.МаксимальноВходит = 1;
ФрагментГруппы.Часть = Группа;
НоваяВалюта = Новый ОбъявлениеАтрибутаXS;
НоваяВалюта.Имя = "currency";
НоваяВалюта.ИмяТипа = Новый РасширенноеИмяXML("http://www.w3.org/2001/XMLSchema", "string");
НоваяВалюта.Форма = ФормаПредставленияXS.Неквалифицированная;
ИспользованиеВалюты = Новый ИспользованиеАтрибутаXS;
ИспользованиеВалюты.ОбъявлениеАтрибута = НоваяВалюта;
ИспользованиеВалюты.Использование = КатегорияИспользованияАтрибутаXS.НеОбязательно;
ИспользованиеВалюты.Ограничение = ОграничениеЗначенияXS.Фиксированное;
ИспользованиеВалюты.ЛексическоеЗначение = "RUB";
НовыйТип = Новый ОпределениеСоставногоТипаXS;
НовыйТип.МодельСодержимого = МодельСодержимогоXS.Составная;
НовыйТип.Содержимое = ФрагментГруппы;
НовыйТип.Атрибуты.Добавить(ИспользованиеВалюты);
НовыйКорень = Новый ОбъявлениеЭлементаXS;
НовыйКорень.Имя = "preview";
НовыйКорень.АнонимноеОпределениеТипа = НовыйТип;
Схема.Содержимое.Добавить(НовыйКорень);
Схема.ОбновитьЭлементDOM();
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Составная собственная XSD не прошла проверку";
КонецЕсли;
КопияГруппы = Группа.КлонироватьКомпоненту(Истина);
Если ТипЗнч(КопияГруппы) <> Тип("ГруппаМоделиXS") Или КопияГруппы.Фрагменты.Количество() <> 1 Тогда
ВызватьИсключение "Не получена копия собственной группы";
КонецЕсли;
КопияГруппы.Фрагменты.Очистить();
Сообщить(КопияГруппы.Фрагменты.Количество() = 0);
Сообщить(Группа.Фрагменты.Количество() = 1);
КопияФрагмента = ФрагментМетки.КлонироватьКомпоненту(Истина);
Если ТипЗнч(КопияФрагмента) <> Тип("ФрагментXS") Или ТипЗнч(КопияФрагмента.Часть) <> Тип("ОбъявлениеЭлементаXS") Тогда
ВызватьИсключение "Не получена копия фрагмента с элементом";
КонецЕсли;
КопияФрагмента.МинимальноВходит = 0;
КопияФрагмента.Часть.Имя = "labelCopy";
Сообщить(КопияФрагмента.МинимальноВходит = 0 И КопияФрагмента.Часть.Имя = "labelCopy");
Сообщить(ФрагментМетки.МинимальноВходит = 1 И НоваяМетка.Имя = "label");
КопияИспользования = ИспользованиеВалюты.КлонироватьКомпоненту(Истина);
Если ТипЗнч(КопияИспользования) <> Тип("ИспользованиеАтрибутаXS") Или КопияИспользования.ОбъявлениеАтрибута = Неопределено Тогда
ВызватьИсключение "Не получена копия локального использования атрибута";
КонецЕсли;
КопияИспользования.ЛексическоеЗначение = "USD";
КопияИспользования.ОбъявлениеАтрибута.Имя = "currencyCopy";
Сообщить(КопияИспользования.Содержит(КопияИспользования.ОбъявлениеАтрибута));
Сообщить(ИспользованиеВалюты.ЛексическоеЗначение = "RUB" И НоваяВалюта.Имя = "currency");
Сообщить(Набор.Проверить());КонецПроцедуры
Функция ПрочитатьСвоюСхему(ТекстXSD)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXSD);
Попытка
ПостроительДерева = Новый ПостроительDOM;
ДокументСхемы = ПостроительДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
ПостроительСхем = Новый ПостроительСхемXML;
Результат = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Результат = Неопределено Тогда
ВызватьИсключение "Не построена собственная схема";
КонецЕсли;
Возврат Результат;
КонецФункцииРазбор по шагам
Исходная preview собирается точно как в предыдущем уроке и проходит проверку.
Рекурсивная копия ГруппаМоделиXS имеет собственные фрагменты. Очистить применяется только к коллекции копии, а исходный фрагмент остаётся.
Копия ФрагментXS получает minOccurs=0 и другое локальное имя своего элемента; исходные 1 и label не меняются.
Копия локального ИспользованиеАтрибутаXS получает USD и currencyCopy. Это не копирование глобального ref и не изменение общей валюты схемы.
Ни одна из трёх копий не присоединяется к XSD. Повторная проверка исходного набора подтверждает сохранение собственной схемы.
Как проверить результат
Семь сообщений Истина; в исходной preview по-прежнему обязательная label и фиксированная RUB.
Отдельные копии являются черновиками: их не следует объявлять новыми действующими типами основной схемы.
Ожидаемый результат
Рекурсивные копии собственных частей изменяются без изменения исходной модели.
На что обратить внимание
Не применяйте Очистить к исходной Группа.Фрагменты.
Изолированная копия фрагмента ещё не становится валидной глобальной XSD.
ЯвляетсяПодмножеством не вызывается: в локальной справке отсутствует параметр сравниваемого фрагмента, сигнатуру не угадываем.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.