ОпределениеОграниченияИдентичностиXS.ИмяСсылочногоКлюча

Свойства · ReferencedKeyName

Тип: РасширенноеИмяXML. Содержит имя ссылочного ключа.

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

ОпределениеОграниченияИдентичностиXS.ИмяСсылочногоКлюча (XSIdentityConstraintDefinition.ReferencedKeyName)

ОпределениеОграниченияИдентичностиXS (XSIdentityConstraintDefinition)

ИмяСсылочногоКлюча (ReferencedKeyName)

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

Использование:
Чтение и запись.
Описание:
Тип: РасширенноеИмяXML.
Содержит имя ссылочного ключа.
Доступность:

Сервер, толстый клиент, внешнее соединение.

Примечание:
Представляет свойство referenced key (http://www.w3.org/TR/xmlschema-1/#referenced_key) информационного пространства определения.
Использование в версии:

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

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

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

Разделить ключ, уникальность и ссылку на ключ в XSD

Три ограничения одной собственной схемы имеют разные категории. Ссылочный ключ CodeRef разрешается в объявленный CodeKey, а не в строку книги.

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

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

Подготовка

  1. Запускайте каждый самостоятельный фрагмент на сервере учебной базы. Полная собственная XSD включена в начало кода. Дисковые файлы, сеть и рабочие документы не используются.

  2. В схеме books содержит book и link. CodeKey описывает ключ book/@code, SupplierUnique — уникальность book/@supplier, CodeRef — ссылку link/@code на ключ книги.

  3. Набор.Проверить проверяет саму схему, а не экземпляр XML с книгами. Эти уроки не выдают анализ схемы за проверку реального импортируемого документа.

XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:keys"" targetNamespace=""urn:guide:keys"" elementFormDefault=""qualified"">
| <xs:element name=""books""><xs:complexType><xs:sequence>
|  <xs:element name=""book"" minOccurs=""0"" maxOccurs=""unbounded""><xs:complexType>
|   <xs:attribute name=""code"" type=""xs:string"" use=""required""/>
|   <xs:attribute name=""supplier"" type=""xs:string""/>
|  </xs:complexType></xs:element>
|  <xs:element name=""link"" minOccurs=""0"" maxOccurs=""unbounded""><xs:complexType>
|   <xs:attribute name=""code"" type=""xs:string"" use=""required""/>
|  </xs:complexType></xs:element>
| </xs:sequence></xs:complexType>
| <xs:key name=""CodeKey""><xs:selector xpath=""g:book""/><xs:field xpath=""@code""/></xs:key>
| <xs:unique name=""SupplierUnique""><xs:selector xpath=""g:book""/><xs:field xpath=""@supplier""/></xs:unique>
| <xs:keyref name=""CodeRef"" refer=""g:CodeKey""><xs:selector xpath=""g:link""/><xs:field xpath=""@code""/></xs:keyref>
| </xs:element>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
    ПостроительDOM = Новый ПостроительDOM;
    DOM = ПостроительDOM.Прочитать(Чтение);
    Чтение.Закрыть();
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(DOM.ЭлементДокумента);
Если Схема = Неопределено Тогда
    ВызватьИсключение "Не построена собственная схема ключей";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
    ВызватьИсключение "Собственная схема ключей не прошла проверку";
КонецЕсли;
Корень = Схема.ОбъявленияЭлементов.Получить("books", "urn:guide:keys");
Если Корень = Неопределено Тогда
    ВызватьИсключение "Не найден собственный корень books";
КонецЕсли;
Ограничения = Корень.ОграниченияИдентичности;
Если Ограничения.Количество() <> 3 Тогда
    ВызватьИсключение "Ожидались три собственных ограничения";
КонецЕсли;
Ключ = Неопределено;
Уникальность = Неопределено;
Ссылка = Неопределено;
Для Каждого Ограничение Из Ограничения Цикл
    Если ТипЗнч(Ограничение) <> Тип("ОпределениеОграниченияИдентичностиXS") Тогда
        ВызватьИсключение "Ожидалось определение собственного ограничения";
    КонецЕсли;
    Если Ограничение.Имя = "CodeKey" Тогда
        Ключ = Ограничение;
    ИначеЕсли Ограничение.Имя = "SupplierUnique" Тогда
        Уникальность = Ограничение;
    ИначеЕсли Ограничение.Имя = "CodeRef" Тогда
        Ссылка = Ограничение;
    КонецЕсли;
КонецЦикла;
Если Ключ = Неопределено Или Уникальность = Неопределено Или Ссылка = Неопределено Тогда
    ВызватьИсключение "Не найдены все три собственных определения";
КонецЕсли;
Сообщить(Ключ.Категория = КатегорияОграниченияИдентичностиXS.Ключ);
Сообщить(Уникальность.Категория = КатегорияОграниченияИдентичностиXS.Уникальность);
Сообщить(Ссылка.Категория = КатегорияОграниченияИдентичностиXS.СсылкаНаКлюч);
Сообщить(Ключ.URIПространстваИмен = "urn:guide:keys");
ИмяКлюча = Ссылка.ИмяСсылочногоКлюча;
Сообщить(ИмяКлюча.ЛокальноеИмя = "CodeKey");
Сообщить(ИмяКлюча.URIПространстваИмен = "urn:guide:keys");
Разрешённый = Ссылка.СсылочныйКлюч;
Если Разрешённый = Неопределено Тогда
    ВызватьИсключение "Не разрешилась собственная ссылка CodeRef";
КонецЕсли;
Сообщить(Разрешённый.Имя = "CodeKey");
Сообщить(Ключ.Контейнер = Корень);
Сообщить(Ключ.КорневойКонтейнер <> Неопределено);
Сообщить(Ключ.Схема.ПространствоИмен = "urn:guide:keys");
Сообщить(Ключ.Аннотация = Неопределено);
Сообщить("Тип компонента: " + Строка(Ключ.ТипКомпоненты));
Сообщить("Дочерних компонентов ключа: " + Строка(Ключ.Компоненты.Количество()));
Ключ.ОбновитьЭлементDOM();
Сообщить(Ключ.ЭлементDOM.ПолучитьАтрибут("name") = "CodeKey");

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

  1. Три определения ищутся по имени в собственной коллекции корневого объявления. Их порядок не предполагается.

  2. Категория показывает разные виды правил; одинаковый XPath селектора не делает категории одинаковыми.

  3. ИмяСсылочногоКлюча — расширенное XML-имя: локальная часть CodeKey и URI, не префикс g как идентификатор.

  4. СсылочныйКлюч возвращает определение ограничения. До чтения имени проверяется отсутствие.

  5. Контейнер и Схема показывают принадлежность своему дереву. После ОбновитьЭлементDOM проверяем реальный XML-атрибут имени.

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

  1. Двенадцать сравнений Истина и две диагностические строки.

  2. CodeRef разрешён в CodeKey своей схемы, а не в произвольный ключ другой схемы.

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

Категории, расширенное имя и разрешённое определение связаны на полной собственной XSD.

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

  1. Этот фрагмент не проверяет существование конкретной книги с кодом A001.

  2. Набор.Проверить не является проверкой XML-экземпляра на дубликаты или висячие ссылки.

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

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

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

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

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