Тип: Булево. Указывает, является ли данное объявление ссылкой.
Полное описание, параметры и ограничения
ОбъявлениеЭлементаXS.ЭтоСсылка (XSElementDeclaration.IsReference)
ОбъявлениеЭлементаXS (XSElementDeclaration)
ЭтоСсылка (IsReference)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: Булево.
Указывает, является ли данное объявление ссылкой.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Примечание:
Истина - объявление является ссылкой.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Разрешить две ссылки из анонимного типа wrapper
Локальные ref указывают на глобальные note и currency. Ссылка, использование атрибута и реальное объявление — разные объекты.
Где и как запускать
Полный модуль серверного общего модуля УчебныеЗадачи (флаг Сервер) в учебной базе. Вызовите ВыполнитьПример() из серверного обработчика своей обработки. Вставляйте обе процедуры на уровне модуля.
Подготовка
Выполните каждый полный модуль отдельно на сервере учебной базы. Вызовите ВыполнитьПример(); функция чтения схемы включена ниже в том же модуле.
Схема включена строкой. 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 не прошла проверку";
КонецЕсли;
Обёртка = Схема.ОбъявленияЭлементов.Получить("wrapper", "urn:guide:declarations");
Если Обёртка = Неопределено Тогда
ВызватьИсключение "Не найден wrapper";
КонецЕсли;
ТипОбёртки = Обёртка.АнонимноеОпределениеТипа;
Если ТипЗнч(ТипОбёртки) <> Тип("ОпределениеСоставногоТипаXS") Тогда
ВызватьИсключение "У wrapper нужен анонимный составной тип";
КонецЕсли;
Группа = ТипОбёртки.Содержимое.Часть;
Если ТипЗнч(Группа) <> Тип("ГруппаМоделиXS") Или Группа.Фрагменты.Количество() <> 1 Тогда
ВызватьИсключение "В wrapper должна быть одна собственная ссылка элемента";
КонецЕсли;
СсылкаЭлемента = Группа.Фрагменты.Получить(0).Часть;
Если ТипЗнч(СсылкаЭлемента) <> Тип("ОбъявлениеЭлементаXS") Тогда
ВызватьИсключение "Получен не элемент схемы";
КонецЕсли;
Сообщить(СсылкаЭлемента.ЭтоСсылка);
Сообщить(СсылкаЭлемента.Ссылка.URIПространстваИмен = "urn:guide:declarations" И СсылкаЭлемента.Ссылка.ЛокальноеИмя = "note");
РеальноеПримечание = СсылкаЭлемента.РазрешитьСсылку();
Если РеальноеПримечание = Неопределено Тогда
ВызватьИсключение "Не разрешена ссылка на note";
КонецЕсли;
Сообщить(РеальноеПримечание = Схема.ОбъявленияЭлементов.Получить("note", "urn:guide:declarations"));
Если ТипОбёртки.Атрибуты.Количество() <> 1 Тогда
ВызватьИсключение "В wrapper нужен один атрибут";
КонецЕсли;
Использование = ТипОбёртки.Атрибуты.Получить(0);
СсылкаАтрибута = Использование.ОбъявлениеАтрибута;
Если СсылкаАтрибута = Неопределено Тогда
ВызватьИсключение "Не получено объявление использования атрибута";
КонецЕсли;
Сообщить(СсылкаАтрибута.ЭтоСсылка);
Сообщить(СсылкаАтрибута.Ссылка.URIПространстваИмен = "urn:guide:declarations" И СсылкаАтрибута.Ссылка.ЛокальноеИмя = "currency");
РеальнаяВалюта = СсылкаАтрибута.РазрешитьСсылку();
Если РеальнаяВалюта = Неопределено Тогда
ВызватьИсключение "Не разрешена ссылка на currency";
КонецЕсли;
Сообщить(РеальнаяВалюта = Схема.ОбъявленияАтрибутов.Получить("currency", "urn:guide:declarations"));
Сообщить(Использование.ЛексическоеЗначение);
Сообщить(Использование.Значение);
КопияИспользования = Использование.КлонироватьКомпоненту(Истина);
Если ТипЗнч(КопияИспользования) <> Тип("ИспользованиеАтрибутаXS") Или КопияИспользования.Аннотация = Неопределено Тогда
ВызватьИсключение "Не получена копия использования с аннотацией";
КонецЕсли;
Сообщить(КопияИспользования.Содержит(КопияИспользования.Аннотация));КонецПроцедуры
Функция ПрочитатьСвоюСхему(ТекстXSD)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXSD);
Попытка
ПостроительДерева = Новый ПостроительDOM;
ДокументСхемы = ПостроительДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
ПостроительСхем = Новый ПостроительСхемXML;
Результат = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Результат = Неопределено Тогда
ВызватьИсключение "Не построена собственная схема";
КонецЕсли;
Возврат Результат;
КонецФункцииРазбор по шагам
АнонимноеОпределениеТипа берётся у wrapper и проверяется как составной тип.
В последовательности ровно один фрагмент, поэтому после проверки безопасно получить индекс 0.
Локальное объявление ref содержит QName, РазрешитьСсылку возвращает реальное глобальное объявление note.
Атрибуты составного типа содержат ИспользованиеАтрибутаXS. Сначала читаем его ОбъявлениеАтрибута, затем разрешаем ref на currency.
ЛексическоеЗначение и Значение использования показываются фактически: фиксированное RUB объявлено в глобальном атрибуте, а не добавлено локальному ref.
Рекурсивная копия локального использования содержит свою аннотацию, но не присоединяется к исходной схеме.
Как проверить результат
Первые шесть проверочных сообщений Истина. Затем показываются фактические поля значения локального использования; они не объявляются обязательной копией fixed глобального атрибута.
Последнее сообщение Истина о принадлежности аннотации копии. Оба РазрешитьСсылку возвращают исходные глобальные объявления.
Ожидаемый результат
Ссылки разрешаются через API, без угадывания имени по строковому префиксу.
На что обратить внимание
Не считайте локальное ref самостоятельным новым глобальным объявлением.
Не путайте атрибут XML с ИспользованиеАтрибутаXS в модели схемы.
Копирование ref не выдается за независимое копирование всех глобальных объявлений.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Прочитать порядок полей товара и кратность необязательного примечания
Разбираем составной тип Product собственной схемы: sequence, три элемента, обязательные name/quantity и необязательный note.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В начале приведена полная XSD. Не заменяйте её внешней схемой: проверки типов и количества рассчитаны на Product из этого урока.
Используйте серверную учебную процедуру. Составной тип не является объектом документа 1С.
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:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
ЧтениеДерева = Новый ПостроительDOM;
ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
ТипТовара = Схема.ОпределенияТипов.Получить("Product", "urn:guide:product");
Сообщить(ТипТовара.Имя = "Product");
Сообщить(ТипТовара.URIПространстваИмен = "urn:guide:product");
Сообщить(Не ТипТовара.Абстрактный);
Сообщить(Не ТипТовара.Смешанный);
Сообщить(Не ТипТовара.ЭтоОпределениеЗациклено());
Сообщить("Модель содержимого: " + Строка(ТипТовара.МодельСодержимого));
Сообщить("Метод наследования: " + Строка(ТипТовара.МетодНаследования));
Фрагмент = ТипТовара.Содержимое;
Если ТипЗнч(Фрагмент) <> Тип("ФрагментXS") Тогда
ВызватьИсключение "Ожидался фрагмент sequence собственной схемы";
КонецЕсли;
Группа = Фрагмент.Часть;
Если ТипЗнч(Группа) <> Тип("ГруппаМоделиXS") Тогда
ВызватьИсключение "Ожидалась группа модели собственной схемы";
КонецЕсли;
Сообщить("Вид группы: " + Строка(Группа.ВидГруппы));
Сообщить(Группа.Фрагменты.Количество() = 3);
Для Каждого ЧастьПолей Из Группа.Фрагменты Цикл
Объявление = ЧастьПолей.Часть;
Если ТипЗнч(Объявление) <> Тип("ОбъявлениеЭлементаXS") Тогда
ВызватьИсключение "Ожидался элемент собственной последовательности";
КонецЕсли;
Сообщить(СтрШаблон("%1: минимум %2, максимум %3", Объявление.Имя,
ЧастьПолей.МинимальноВходит, ЧастьПолей.МаксимальноВходит));
Сообщить("Тип: " + Объявление.ОпределениеТипа().Имя);
Сообщить(Не Объявление.ЭтоГлобальноеОбъявление);
Сообщить(Не Объявление.ЭтоСсылка);
Сообщить(Не Объявление.ВозможноПустой);
Сообщить(Не Объявление.ЭтоОбъявлениеЗациклено());
Если Объявление.Имя = "note" Тогда
Сообщить(ЧастьПолей.МинимальноВходит = 0);
Сообщить(ЧастьПолей.ДопускаетсяПустой());
Иначе
Сообщить(ЧастьПолей.МинимальноВходит = 1);
Сообщить(Не ЧастьПолей.ДопускаетсяПустой());
КонецЕсли;
Сообщить(ЧастьПолей.МаксимальноВходит = 1);
КонецЦикла;Разбор по шагам
Содержимое составного типа даёт ФрагментXS, а Часть этого фрагмента — ГруппаМоделиXS последовательности.
Фрагменты группы содержат отдельные объявления name, quantity и note в порядке sequence.
Кратность относится к фрагменту: минимум 1 требует элемент, минимум 0 разрешает его отсутствие, максимум 1 запрещает повторение.
ОпределениеТипа раскрывает тип поля: string или nonNegativeInteger. Все три объявления локальные, без ref.
ВозможноПустой относится к xsi:nil. Отсутствующий note и элемент с xsi:nil — разные случаи; minOccurs=0 не включает nillable автоматически.
Как проверить результат
Выводятся name, quantity, note в таком порядке; фрагментов три.
Для name/quantity минимум 1 и пустой фрагмент не допускается; для note минимум 0 и допускается отсутствие.
Максимум у каждого поля 1; ВозможноПустой Ложь для всех трёх.
Ожидаемый результат
Порядок XML-полей, обязательность, повторяемость и xsi:nil разделены на конкретном контракте товара.
На что обратить внимание
Не путайте minimum occurrences и разрешение xsi:nil: это разные ограничения.
Группа sequence отличается от choice/all; этот пример не универсальный обход любой модели.
Поля схемы читаются, данные товара в базе не создаются.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.