ОбъявлениеЭлементаXS.Содержит

Методы · Contains

Определяет, содержит ли данный компонент указанный.

Синтаксис

Содержит(<Компонент>)
Полное описание, параметры и ограничения

ОбъявлениеЭлементаXS.Содержит (XSElementDeclaration.Contains)

ОбъявлениеЭлементаXS (XSElementDeclaration)

Содержит (Contains)

Доступен, начиная с версии 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.

Методическая информация

Практические примеры

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

Конструкторы создают preview с обязательной строковой label и необязательной фиксированной currency="RUB". Все компоненты присоединяются к своей схеме.

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

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

Подготовка

  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: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 не прошла проверку";
    КонецЕсли;
    Сообщить(НовыйКорень.АнонимноеОпределениеТипа = НовыйТип);
    Сообщить(НовыйКорень.Содержит(НовыйТип));
    Сообщить(НовыйТип.Содержит(ФрагментГруппы));
    Сообщить(Группа.Содержит(ФрагментМетки));
    Сообщить(ФрагментМетки.Содержит(НоваяМетка));
    Сообщить(Группа.Фрагменты.Количество() = 1);
    Сообщить(НовыйТип.Атрибуты.Количество() = 1);
    Сообщить(Не НоваяМетка.ЭтоГлобальноеОбъявление);
    Сообщить(Не НоваяВалюта.ЭтоГлобальноеОбъявление);
    Сообщить(ИспользованиеВалюты.ЛексическоеЗначение = "RUB");
    Сообщить(Схема.ОбъявленияЭлементов.Количество() = 3);КонецПроцедуры

Функция ПрочитатьСвоюСхему(ТекстXSD)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(ТекстXSD);
    Попытка
        ПостроительДерева = Новый ПостроительDOM;
        ДокументСхемы = ПостроительДерева.Прочитать(Чтение);
        Чтение.Закрыть();
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    ПостроительСхем = Новый ПостроительСхемXML;
    Результат = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
    Если Результат = Неопределено Тогда
        ВызватьИсключение "Не построена собственная схема";
    КонецЕсли;
    Возврат Результат;
КонецФункции

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

  1. ОбъявлениеЭлементаXS label содержит QName xs:string и квалифицированную локальную форму.

  2. ФрагментМетки задаёт обязательность 1..1 и ссылается на label через Часть.

  3. ГруппаМоделиXS с видом Последовательность получает этот фрагмент. Второй ФрагментXS оборачивает саму группу.

  4. ИспользованиеАтрибутаXS хранит локальное объявление currency, необязательное использование и fixed RUB.

  5. ОпределениеСоставногоТипаXS имеет составную модель, Содержимое ссылается на фрагмент группы, Атрибуты содержит использование.

  6. Глобальный preview получает АнонимноеОпределениеТипа и присоединяется к собственной Содержимое схемы. После синхронизации выполняется проверка.

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

  1. Если построение проходит, одиннадцать сообщений Истина; глобальных элементов 3.

  2. Экземпляр preview с label=Книга и currency=RUB допустим; отсутствие label, другая currency или лишний локальный элемент недопустимы в отдельной проверке XML.

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

Создана целая собственная составная модель, а не отдельно неприкреплённый объект конструктора.

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

  1. Имя анонимного типа не используется как глобальный QName.

  2. Объявление атрибута и его использование — разные объекты.

  3. Числа МинимальноВходит и МаксимальноВходит ограничивают XML-структуру, не количество товара в базе.

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

Разделить default, возможность пустого значения и копию элемента

note имеет default и nillable. Копия noteCopy получает другое значение по умолчанию и удаляется после проверки; исходное объявление остаётся.

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

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

Подготовка

  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:schema>";
    Схема = ПрочитатьСвоюСхему(ТекстXSD);
    Набор = Новый НаборСхемXML;
    Набор.Добавить(Схема);
    Если Не Набор.Проверить() Тогда
        ВызватьИсключение "Исходная собственная XSD не прошла проверку";
    КонецЕсли;
    Примечание = Схема.ОбъявленияЭлементов.Получить("note", "urn:guide:declarations");
    Если Примечание = Неопределено Или Примечание.Аннотация = Неопределено Тогда
        ВызватьИсключение "Не найдено собственное примечание с аннотацией";
    КонецЕсли;
    Сообщить(Примечание.URIПространстваИмен = "urn:guide:declarations");
    Сообщить(Примечание.Ограничение = ОграничениеЗначенияXS.ПоУмолчанию);
    Сообщить(Примечание.ЛексическоеЗначение = "Без примечания");
    Сообщить(Примечание.Значение = "Без примечания");
    Сообщить(Примечание.ВозможноПустой);
    Сообщить(Примечание.ЭтоГлобальноеОбъявление);
    Сообщить(Примечание.ОбластьВидимости = Схема);
    Сообщить(Примечание.Содержит(Примечание.Аннотация));
    Копия = Примечание.КлонироватьКомпоненту(Истина);
    Если ТипЗнч(Копия) <> Тип("ОбъявлениеЭлементаXS") Тогда
        ВызватьИсключение "Не скопировано объявление элемента";
    КонецЕсли;
    Копия.Имя = "noteCopy";
    Копия.ЛексическоеЗначение = "Проверить отдельно";
    Схема.Содержимое.Добавить(Копия);
    Схема.ОбновитьЭлементDOM();
    Если Не Набор.Проверить() Тогда
        ВызватьИсключение "Не прошла схема с копией примечания";
    КонецЕсли;
    Сообщить(Копия.ЛексическоеЗначение = "Проверить отдельно");
    Сообщить(Примечание.ЛексическоеЗначение = "Без примечания");
    Схема.Содержимое.Удалить(Копия);
    Схема.ОбновитьЭлементDOM();
    Сообщить(Схема.ОбъявленияЭлементов.Количество() = 2);КонецПроцедуры

Функция ПрочитатьСвоюСхему(ТекстXSD)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(ТекстXSD);
    Попытка
        ПостроительДерева = Новый ПостроительDOM;
        ДокументСхемы = ПостроительДерева.Прочитать(Чтение);
        Чтение.Закрыть();
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    ПостроительСхем = Новый ПостроительСхемXML;
    Результат = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
    Если Результат = Неопределено Тогда
        ВызватьИсключение "Не построена собственная схема";
    КонецЕсли;
    Возврат Результат;
КонецФункции

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

  1. URI и область видимости показывают глобальную принадлежность note собственной схеме.

  2. default задаёт значение по умолчанию элемента с пустым содержимым; nillable допускает xsi:nil. Это не minOccurs и не разрешение убрать обязательный узел.

  3. ЛексическоеЗначение — запись значения в XML, Значение — его типизированное представление. Для xs:string оба здесь содержат одинаковый текст.

  4. Рекурсивная копия включает собственную аннотацию. Новое уникальное имя позволяет присоединить её без дублирования note.

  5. После изменения копии синхронизируем DOM и проверяем схему. Удаляем только копию, после удаления её больше не используем.

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

  1. Если исходная схема построена корректно, все одиннадцать сообщений Истина.

  2. noteCopy временно существует; после удаления глобальных элементов снова два — note и wrapper.

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

У исходного и скопированного элементов разные default без изменения рабочей схемы.

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

  1. nillable не равнозначно необязательному узлу.

  2. Чтение произвольного XML через DOM само не подставляет default из XSD.

  3. Не используйте удалённую копию.

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

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

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

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

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