Компонент, определяющий использование атрибута.
Полное описание, параметры и ограничения
ИспользованиеАтрибутаXS (XSAttributeUse)
ИспользованиеАтрибутаXS (XSAttributeUse)
Доступен, начиная с версии 8.1.
Свойства:
Аннотация (Annotation)
Компоненты (Components)
Контейнер (Container)
КорневойКонтейнер (RootContainer)
Схема (Schema)
ТипКомпоненты (ComponentType)
ЭлементDOM (DOMElement)
Значение (Value)
Использование (Use)
ЛексическоеЗначение (LexicalValue)
ОбъявлениеАтрибута (AttributeDeclaration)
Обязательный (IsRequired)
Ограничение (Constraint)
Методы:
КлонироватьКомпоненту (CloneComponent)
ОбновитьЭлементDOM (UpdateDOMElement)
Содержит (Contains)
Конструкторы:
По умолчанию
Описание:
Компонент, определяющий использование атрибута.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Обойти дерево компонентов собственной схемы и связать его с XML DOM
У схемы, типа, фасета, объявления и аннотации есть общие связи. Обходим конкретный контракт товара с защитой от циклов и показываем владельца компонента, не передаём неизвестную схему.
Где и как запускать
В учебной базе создайте серверный общий модуль УчебныеЗадачи. Вставьте приведённые функции и процедуру целиком в модуль, не внутрь другой процедуры. Вызовите УчебныеЗадачи.ВыполнитьПример() из серверного обработчика команды учебной обработки. Каждый урок запускайте отдельно, без дублирования одноимённых процедур.
Подготовка
Вставьте обе процедуры полностью на уровне серверного общего модуля. ВыполнитьПример создаёт XSD из собственной короткой строки.
Не подменяйте XSD внешней схемой: ограничение 200 компонентов и глубины 20 рассчитано на этот учебный контракт.
Контракт содержит аннотацию/документацию, простой тип с двумя фасетами, составной тип, последовательность элементов и обязательный атрибут.
Процедура ВыполнитьПример() Экспорт
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 не прошла проверку";
КонецЕсли;
Просмотренные = Новый Массив;
Виды = Новый Соответствие;
ПоказатьКомпонентСхемы(Схема, 0, Просмотренные, Виды);
Сообщить("Просмотрено компонентов: " + Строка(Просмотренные.Количество()));
Для Каждого Вид Из Виды Цикл
Сообщить(Вид.Ключ + ": " + Строка(Вид.Значение));
КонецЦикла;
Сообщить(Просмотренные.Количество() > 10);
КонецПроцедуры
Процедура ПоказатьКомпонентСхемы(Компонент, Глубина, Просмотренные, Виды)
Если Глубина > 20 Или Просмотренные.Количество() >= 200 Тогда
ВызватьИсключение "Превышен размер собственного учебного дерева схемы";
КонецЕсли;
Если Просмотренные.Найти(Компонент) <> Неопределено Тогда
Возврат;
КонецЕсли;
Просмотренные.Добавить(Компонент);
ИмяВида = Строка(ТипЗнч(Компонент));
КоличествоВида = Виды.Получить(ИмяВида);
Если КоличествоВида = Неопределено Тогда
КоличествоВида = 0;
КонецЕсли;
Виды.Вставить(ИмяВида, КоличествоВида + 1);
Сообщить(СтрШаблон("Глубина %1: %2; тип компоненты %3", Глубина, ИмяВида, Компонент.ТипКомпоненты));
Если Компонент.Контейнер <> Неопределено Тогда
Сообщить("Контейнер: " + Строка(ТипЗнч(Компонент.Контейнер)));
КонецЕсли;
Если Компонент.КорневойКонтейнер <> Неопределено Тогда
Сообщить("Корневой контейнер: " + Строка(ТипЗнч(Компонент.КорневойКонтейнер)));
КонецЕсли;
Если Компонент.Схема <> Неопределено Тогда
Сообщить("Схема: " + Компонент.Схема.ПространствоИмен);
КонецЕсли;
Если Компонент.Аннотация <> Неопределено Тогда
Сообщить("Есть отдельная аннотация компонента");
КонецЕсли;
// Синхронизируем только своё дерево в памяти, не конфигурацию и не файл.
Компонент.ОбновитьЭлементDOM();
Если Компонент.ЭлементDOM <> Неопределено Тогда
Сообщить("Тег DOM: " + Компонент.ЭлементDOM.ИмяЭлемента);
КонецЕсли;
Дочерние = Компонент.Компоненты;
Для Каждого Дочерний Из Дочерние Цикл
ПоказатьКомпонентСхемы(Дочерний, Глубина + 1, Просмотренные, Виды);
КонецЦикла;
КонецПроцедурыРазбор по шагам
Построитель создаёт конкретное дерево компонентов из нашей XSD. Начальная точка обхода — сама СхемаXML.
Компоненты возвращает только компоненты, которыми владеет текущий компонент. Цикл рекурсивно проходит структуру типов, объявлений и ограничений.
Контейнер и КорневойКонтейнер описывают связи владения. Схема связывает компонент с описанием пространства имён, а Аннотация с пояснением.
Массив Просмотренные предотвращает повторный обход одной ссылки; два ограничителя защищают учебный обработчик от неожиданно большой структуры.
ОбновитьЭлементDOM синхронизирует описание компонента с его XML DOM. ЭлементDOM после синхронизации показывает соответствующий тег.
Итоговая карта Виды показывает реальные классы дерева, а не число товаров. Все изменения происходят только в собственной схеме в памяти.
Как проверить результат
Появляются компоненты схемы, типов Sku/Product, объявлений, фасетов length/pattern и аннотации с документацией.
Теги DOM соответствуют видам: schema, simpleType, complexType, length, pattern, element и другие части данного контракта.
Просмотрено больше десяти компонентов и меньше ограничителя 200; ошибки глубины не возникает на исходной XSD.
Модули конфигурации, справочники и файлы после обхода не изменяются.
Ожидаемый результат
Построена читаемая карта структуры собственной схемы с её владельцами и DOM-представлением.
На что обратить внимание
Компоненты схемы и ДочерниеУзлы XML DOM — разные коллекции с разной моделью владения.
Нельзя переносить этот обход на произвольные внешние схемы без отдельной проверки размера и импортов.
ОбновитьЭлементDOM синхронизирует представление, но не выполняет публикацию, обновление конфигурации или запись товара.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Изменять отдельные копии модели, фрагмента и атрибута
После сборки 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.
ЯвляетсяПодмножеством не вызывается: в локальной справке отсутствует параметр сравниваемого фрагмента, сигнатуру не угадываем.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.