Различить абстрактный головной элемент и конкретный член группы

Учебные задачи

head нельзя использовать как самостоятельный конкретный элемент. book имеет тот же строковый тип и ссылается на head как член группы подстановки.

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

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

Подготовка

  1. Выполните каждый полный модуль отдельно на сервере учебной базы. Вызовите ВыполнитьПример(); функция чтения схемы включена ниже в том же модуле.

  2. Схема включена строкой. note — учебное примечание, currency — фиксированная валюта, wrapper содержит ссылки на них. Обмен и рабочие объекты не используются.

  3. Нет DTD, импорта, файлов, сети или записи данных базы. Проверить проверяет XSD, а не XML-экземпляр товара.

  4. Имена и 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(ДокументСхемы.ЭлементДокумента);
    Если Результат = Неопределено Тогда
        ВызватьИсключение "Не построена собственная схема";
    КонецЕсли;
    Возврат Результат;
КонецФункции

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

  1. В собственной XSD head объявлен abstract=true, book — конкретным глобальным элементом.

  2. ПрисоединениеКГруппеПодстановки содержит QName головного элемента, не ссылку ref и не строку имени.

  3. URI и локальное имя проверяются отдельно. book не превращается в head и сохраняет собственное имя.

  4. ЭтоОбъявлениеЗациклено проверяет объявление, но не валидирует экземпляр XML с фактическими данными.

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

  1. Пять сообщений Истина.

  2. При отдельной стандартной проверке <book xmlns="urn:guide:declarations">Книга</book> проходит; такой же конкретный <head> не проходит из-за abstract=true.

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

Абстрактность и членство подстановки показаны на двух конкретных объявлениях.

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

  1. Правила блокировки и совместимости типов тоже влияют на допустимость подстановок.

  2. Группа подстановки не является выборкой справочника 1С.

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

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

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

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

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