head нельзя использовать как самостоятельный конкретный элемент. book имеет тот же строковый тип и ссылается на head как член группы подстановки.
Где и как запускать
Полный модуль серверного общего модуля УчебныеЗадачи (флаг Сервер) в учебной базе. Вызовите ВыполнитьПример() из серверного обработчика своей обработки. Вставляйте обе процедуры на уровне модуля.
Подготовка
Выполните каждый полный модуль отдельно на сервере учебной базы. Вызовите ВыполнитьПример(); функция чтения схемы включена ниже в том же модуле.
Схема включена строкой. 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:element name=""head"" type=""xs:string"" abstract=""true""/><xs:element name=""book"" type=""xs:string"" substitutionGroup=""g:head""/></xs:schema>";
Схема = ПрочитатьСвоюСхему(ТекстXSD);
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Исходная собственная XSD не прошла проверку";
КонецЕсли;
Головной = Схема.ОбъявленияЭлементов.Получить("head", "urn:guide:declarations");
Книга = Схема.ОбъявленияЭлементов.Получить("book", "urn:guide:declarations");
Если Головной = Неопределено Или Книга = Неопределено Тогда
ВызватьИсключение "Не найдена собственная группа подстановки";
КонецЕсли;
Сообщить(Головной.Абстрактный);
Сообщить(Не Книга.Абстрактный);
Принадлежность = Книга.ПрисоединениеКГруппеПодстановки;
Если Принадлежность = Неопределено Тогда
ВызватьИсключение "У book не указана группа подстановки";
КонецЕсли;
Сообщить(Принадлежность.URIПространстваИмен = "urn:guide:declarations" И Принадлежность.ЛокальноеИмя = "head");
Сообщить(Не Книга.ЭтоОбъявлениеЗациклено());
Сообщить(Головной.ЭтоГлобальноеОбъявление И Книга.ЭтоГлобальноеОбъявление);КонецПроцедуры
Функция ПрочитатьСвоюСхему(ТекстXSD)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXSD);
Попытка
ПостроительДерева = Новый ПостроительDOM;
ДокументСхемы = ПостроительДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
ПостроительСхем = Новый ПостроительСхемXML;
Результат = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Результат = Неопределено Тогда
ВызватьИсключение "Не построена собственная схема";
КонецЕсли;
Возврат Результат;
КонецФункцииРазбор по шагам
В собственной XSD head объявлен abstract=true, book — конкретным глобальным элементом.
ПрисоединениеКГруппеПодстановки содержит QName головного элемента, не ссылку ref и не строку имени.
URI и локальное имя проверяются отдельно. book не превращается в head и сохраняет собственное имя.
ЭтоОбъявлениеЗациклено проверяет объявление, но не валидирует экземпляр XML с фактическими данными.
Как проверить результат
Пять сообщений Истина.
При отдельной стандартной проверке <book xmlns="urn:guide:declarations">Книга</book> проходит; такой же конкретный <head> не проходит из-за abstract=true.
Ожидаемый результат
Абстрактность и членство подстановки показаны на двух конкретных объявлениях.
На что обратить внимание
Правила блокировки и совместимости типов тоже влияют на допустимость подстановок.
Группа подстановки не является выборкой справочника 1С.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.