ОбъявлениеАтрибутаXS.Имя

Свойства · Name

Тип: Строка. Имя компонента схемы XML.

Полное описание, параметры и ограничения

ОбъявлениеАтрибутаXS.Имя (XSAttributeDeclaration.Name)

ОбъявлениеАтрибутаXS (XSAttributeDeclaration)

Имя (Name)

Доступен, начиная с версии 8.1.

Использование:
Чтение и запись.
Описание:
Тип: Строка.
Имя компонента схемы XML.
Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

Использование в версии:

Доступен, начиная с версии 8.1.

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

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

Скопировать фиксированную валюту без изменения RUB

Глобальный currency зафиксирован как RUB. Своя копия currencyCopy получает USD, проверяется и удаляется.

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

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

Подготовка

  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 не прошла проверку";
    КонецЕсли;
    Валюта = Схема.ОбъявленияАтрибутов.Получить("currency", "urn:guide:declarations");
    Если Валюта = Неопределено Или Валюта.Аннотация = Неопределено Тогда
        ВызватьИсключение "Не найден собственный атрибут валюты";
    КонецЕсли;
    Сообщить(Валюта.Ограничение = ОграничениеЗначенияXS.Фиксированное);
    Сообщить(Валюта.ЛексическоеЗначение = "RUB" И Валюта.Значение = "RUB");
    Сообщить(Валюта.ИмяТипа.URIПространстваИмен = "http://www.w3.org/2001/XMLSchema" И Валюта.ИмяТипа.ЛокальноеИмя = "string");
    Сообщить(Валюта.ОбластьВидимости = Схема);
    Сообщить(Валюта.Содержит(Валюта.Аннотация));
    КопияВалюты = Валюта.КлонироватьКомпоненту(Истина);
    Если ТипЗнч(КопияВалюты) <> Тип("ОбъявлениеАтрибутаXS") Тогда
        ВызватьИсключение "Не скопирован атрибут";
    КонецЕсли;
    КопияВалюты.Имя = "currencyCopy";
    КопияВалюты.ЛексическоеЗначение = "USD";
    Схема.Содержимое.Добавить(КопияВалюты);
    Схема.ОбновитьЭлементDOM();
    Если Не Набор.Проверить() Тогда
        ВызватьИсключение "Не прошла схема с копией валюты";
    КонецЕсли;
    Сообщить(КопияВалюты.ЛексическоеЗначение = "USD");
    Сообщить(Валюта.ЛексическоеЗначение = "RUB");
    Сообщить(Схема.ОбъявленияАтрибутов.Количество() = 2);
    Схема.Содержимое.Удалить(КопияВалюты);
    Схема.ОбновитьЭлементDOM();
    Сообщить(Схема.ОбъявленияАтрибутов.Количество() = 1);КонецПроцедуры

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

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

  1. fixed отличается от default: если атрибут присутствует, его значение должно соответствовать фиксированному.

  2. ИмяТипа — QName встроенного xs:string; namespace языка XSD не является namespace атрибута currency.

  3. Копирование рекурсивное, а имя копии уникально. Основной currency продолжает использовать RUB.

  4. Проверка схемы выполняется до удаления своей копии. После удаления проверяем только живую коллекцию.

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

  1. Все девять сообщений Истина; число глобальных атрибутов меняется 1→2→1.

  2. В отдельной проверке wrapper атрибут g:currency="RUB" проходит, g:currency="USD" не проходит. Копия не меняет исходную ссылку.

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

Фиксированная валюта изменена только в своей временной копии объявления.

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

  1. Изменение схемы не конвертирует денежные суммы.

  2. Глобальный атрибут в данном примере квалифицирован через g:currency, а не просто currency.

  3. Копию после Удалить не используйте.

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

Изменять отдельные копии модели, фрагмента и атрибута

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

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

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

  1. Исходная preview собирается точно как в предыдущем уроке и проходит проверку.

  2. Рекурсивная копия ГруппаМоделиXS имеет собственные фрагменты. Очистить применяется только к коллекции копии, а исходный фрагмент остаётся.

  3. Копия ФрагментXS получает minOccurs=0 и другое локальное имя своего элемента; исходные 1 и label не меняются.

  4. Копия локального ИспользованиеАтрибутаXS получает USD и currencyCopy. Это не копирование глобального ref и не изменение общей валюты схемы.

  5. Ни одна из трёх копий не присоединяется к XSD. Повторная проверка исходного набора подтверждает сохранение собственной схемы.

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

  1. Семь сообщений Истина; в исходной preview по-прежнему обязательная label и фиксированная RUB.

  2. Отдельные копии являются черновиками: их не следует объявлять новыми действующими типами основной схемы.

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

Рекурсивные копии собственных частей изменяются без изменения исходной модели.

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

  1. Не применяйте Очистить к исходной Группа.Фрагменты.

  2. Изолированная копия фрагмента ещё не становится валидной глобальной XSD.

  3. ЯвляетсяПодмножеством не вызывается: в локальной справке отсутствует параметр сравниваемого фрагмента, сигнатуру не угадываем.

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

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

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

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

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