ФасетДлиныXS.По умолчанию

Конструкторы

Синтаксис и применение ФасетДлиныXS.По умолчанию в платформе 1С:Предприятие. Описание и примеры кода.

Синтаксис

Новый ФасетДлиныXS
Полное описание, параметры и ограничения

ФасетДлиныXS.По умолчанию

ФасетДлиныXS (XSLengthFacet)

По умолчанию

Синтаксис:
Новый ФасетДлиныXS
Методическая информация

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

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

Базовый Code допускает длину 1..8. Переопределение с тем же именем ограничивает его тремя символами и шаблоном A01.

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

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

Подготовка

  1. Каждый урок выполните отдельно в учебной базе. Две XSD включены строками: основная схема и её собственная часть.

  2. urn:guide:owned-xsd-part — условное расположение собственной части. РазрешеннаяСхема присваивается непосредственно, дополнительно передаётся собственный НаборСхемXML как разыменователь.

  3. В коде нет файлового чтения, http URL, DTD или загрузки внешней XSD. Не заменяйте URN рабочими URL и не используйте непроверенную внешнюю схему.

  4. Проверить проверяет схемы. Он не проверяет XML с фактической ценой или кодом; проверку экземпляра выполняйте отдельно.

Процедура ВыполнитьПример() Экспорт
    ОсновнаяXSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:directives"" targetNamespace=""urn:guide:directives""><xs:element name=""code"" type=""xs:string""/></xs:schema>";
    ЧастьXSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""urn:guide:directives""><xs:simpleType name=""Code""><xs:restriction base=""xs:string""><xs:minLength value=""1""/><xs:maxLength value=""8""/></xs:restriction></xs:simpleType></xs:schema>";
    Основная = ПрочитатьСвоюСхему(ОсновнаяXSD);
    Часть = ПрочитатьСвоюСхему(ЧастьXSD);
    Часть.РасположениеСхемы = "urn:guide:owned-xsd-part";
    Директива = Новый ПереопределениеXS;
    Директива.РасположениеСхемы = "urn:guide:owned-xsd-part";
    Директива.РазрешеннаяСхема = Часть;
    Если Основная.ПространствоИмен <> Часть.ПространствоИмен Тогда
        ВызватьИсключение "Для переопределения нужны одинаковые namespace";
    КонецЕсли;
    НовыйКод = Новый ОпределениеПростогоТипаXS;
    НовыйКод.Имя = "Code";
    НовыйКод.Вариант = ВариантПростогоТипаXS.Атомарная;
    НовыйКод.ИмяБазовогоТипа = Новый РасширенноеИмяXML("urn:guide:directives", "Code");
    Длина = Новый ФасетДлиныXS;
    Длина.Значение = 3;
    Образец = Новый ФасетОбразцаXS;
    Образец.Значение = "[A-Z][0-9]{2}";
    НовыйКод.Фасеты.Добавить(Длина);
    НовыйКод.Фасеты.Добавить(Образец);
    Директива.Содержимое.Добавить(НовыйКод);
    Сообщить(Директива.Содержимое.Количество() = 1);
    Сообщить(Директива.Содержит(НовыйКод));
    Аннотация = Новый АннотацияXS;
    Пояснение = Новый ДокументацияXS;
    Пояснение.Источник = "urn:guide:directive-note";
    Пояснение.Язык = "ru";
    Аннотация.Состав.Добавить(Пояснение);
    Директива.Аннотация = Аннотация;
    Основная.Содержимое.Вставить(0, Директива);
    Корень = Основная.ОбъявленияЭлементов.Получить("code", "urn:guide:directives");
    Если Корень = Неопределено Тогда
        ВызватьИсключение "Не найден собственный корень code";
    КонецЕсли;
    Корень.ИмяТипа = Новый РасширенноеИмяXML("urn:guide:directives", "Code");
    Директива.ОбновитьЭлементDOM();
    Основная.ОбновитьЭлементDOM();
    Разыменователь = Новый НаборСхемXML;
    Разыменователь.Добавить(Часть);
    Набор = Новый НаборСхемXML;
    Набор.Добавить(Основная);
    Если Не Набор.Проверить(Разыменователь) Тогда
        ВызватьИсключение "Собственные связанные XSD не прошли проверку";
    КонецЕсли;
    Сообщить(Основная.Директивы.Количество() = 1);
    Сообщить(Директива.Контейнер = Основная);
    Сообщить(Директива.КорневойКонтейнер = Основная);
    Сообщить(Директива.Схема = Основная);
    Сообщить(Директива.ТипКомпоненты = ТипКомпонентыXS.Переопределение);
    Сообщить(Директива.ЭлементDOM <> Неопределено);
    Сообщить(Директива.Содержит(Директива.Аннотация));
    Сообщить(Директива.Компоненты.Количество() > 0);
    Сообщить(Директива.РазрешеннаяСхема = Часть);
    Сообщить(Директива.РасположениеСхемы = "urn:guide:owned-xsd-part");
    Сообщить(Корень.ИмяТипа.URIПространстваИмен = "urn:guide:directives" И Корень.ИмяТипа.ЛокальноеИмя = "Code");
    ИсходныйТип = Часть.ОпределенияТипов.Получить("Code", "urn:guide:directives");
    Если ИсходныйТип = Неопределено Тогда
        ВызватьИсключение "Не найден тип в собственной части";
    КонецЕсли;
    Копия = Директива.КлонироватьКомпоненту(Истина);
    Если ТипЗнч(Копия) <> Тип("ПереопределениеXS") Или Копия.Аннотация = Неопределено Тогда
        ВызватьИсключение "Не скопирована директива с аннотацией";
    КонецЕсли;
    Если Копия.Аннотация.Состав.Количество() <> 1 Тогда
        ВызватьИсключение "В копии должна быть одна собственная документация";
    КонецЕсли;
    ПояснениеКопии = Копия.Аннотация.Состав.Получить(0);
    Если ТипЗнч(ПояснениеКопии) <> Тип("ДокументацияXS") Тогда
        ВызватьИсключение "В копии получен не тот компонент";
    КонецЕсли;
    ПояснениеКопии.Источник = "urn:guide:directive-note:copy";
    ПояснениеКопии.Язык = "en";
    Сообщить(Пояснение.Источник = "urn:guide:directive-note" И Пояснение.Язык = "ru");
    Сообщить(ПояснениеКопии.Источник = "urn:guide:directive-note:copy" И ПояснениеКопии.Язык = "en");
    Сообщить(Основная.Директивы.Количество() = 1);
КонецПроцедуры

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

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

  1. Базовая собственная схема содержит Code с minLength=1 и maxLength=8, основная — корень code.

  2. ПереопределениеXS имеет изменяемое Содержимое, хотя само свойство коллекции только для чтения.

  3. Новое определение тоже называется Code. В xs:redefine ссылка restriction на то же имя обозначает прежнее определение из подключаемой схемы, а не произвольную циклическую ссылку.

  4. Два фасета сужают допустимые значения: длина 3 и шаблон заглавная буква плюс две цифры.

  5. Содержимое.Добавить присоединяет новый тип директиве, сама директива вставляется первой в основную схему.

  6. Проверить получает собственную базовую часть. Рекурсивная копия документации не присоединяется вторым redefine.

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

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

  2. В отдельной проверке экземпляра A01 проходит; A1, A001 и a01 не проходят новый тип. В базовой части ограничения остаются 1..8.

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

Переопределён конкретный собственный тип, с сохранением базовой части и без внешнего источника.

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

  1. Переопределение требует правил стандарта XSD, это не простое добавление второго одноимённого типа.

  2. Нельзя ослаблять базовые ограничения произвольным фасетом.

  3. Не присваивайте новый список свойству Содержимое: изменяйте полученную коллекцию.

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

Собрать новый атомарный тип и скопировать только его

Новый ShortSku основан на xs:string и содержит длину 3 плюс образец. Проверяем связи, копируем тип и удаляем только созданные компоненты.

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

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

Подготовка

  1. Каждый фрагмент выполните отдельно на сервере учебной базы. Полная собственная XSD включена в код; используются только namespace urn:guide:product и встроенные типы языка XSD.

  2. Sku описывает код, SkuList — список кодов, SkuOrQuantity — выбор допустимого типа значения. Product и Price — разные составные типы.

  3. Нет DTD, include/import, чтения или записи файла и сетевого доступа. НаборСхемXML.Проверить проверяет собственную схему, не XML-экземпляр товара.

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:simpleType name=""SkuList""><xs:list itemType=""g:Sku""/></xs:simpleType>
| <xs:simpleType name=""SkuOrQuantity""><xs:union memberTypes=""g:Sku xs:nonNegativeInteger""/></xs:simpleType>
| <xs:complexType name=""Price""><xs:simpleContent>
|  <xs:annotation><xs:documentation source=""urn:guide:price-content"">Цена — число с атрибутом валюты</xs:documentation></xs:annotation>
|  <xs:extension base=""xs:decimal"">
|   <xs:annotation><xs:documentation source=""urn:guide:price-extension"">Расширение простого decimal</xs:documentation></xs:annotation>
|   <xs:attribute name=""currency"" type=""xs:string"" default=""RUB""/>
|  </xs:extension>
| </xs:simpleContent></xs:complexType>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
    ЧтениеДерева = Новый ПостроительDOM;
    ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
    Чтение.Закрыть();
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
    ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
    ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
НовыйТип = Новый ОпределениеПростогоТипаXS;
НовыйТип.Имя = "ShortSku";
НовыйТип.Вариант = ВариантПростогоТипаXS.Атомарная;
НовыйТип.ИмяБазовогоТипа = Новый РасширенноеИмяXML("http://www.w3.org/2001/XMLSchema", "string");
Длина = Новый ФасетДлиныXS;
Длина.Значение = 3;
Образец = Новый ФасетОбразцаXS;
Образец.Значение = "[A-Z][0-9]{2}";
НовыйТип.Фасеты.Добавить(Длина);
НовыйТип.Фасеты.Добавить(Образец);
АннотацияОграничения = Новый АннотацияXS;
Примечание = Новый ДокументацияXS;
Примечание.Источник = "urn:guide:short-code-rule";
Примечание.Язык = "ru";
АннотацияОграничения.Состав.Добавить(Примечание);
НовыйТип.АннотацияВарианта = АннотацияОграничения;
Схема.Содержимое.Добавить(НовыйТип);
Схема.ОбновитьЭлементDOM();
Если Не Набор.Проверить() Тогда
    ВызватьИсключение "Собственная схема с ShortSku не прошла проверку";
КонецЕсли;
Сообщить(НовыйТип.Фасеты.Количество() = 2);
Сообщить(НовыйТип.Содержит(Образец));
Сообщить(НовыйТип.АннотацияВарианта = АннотацияОграничения);
Базовый = НовыйТип.ОпределениеБазовогоТипа;
Примитивный = НовыйТип.ОпределениеПримитивногоТипа;
Корневой = НовыйТип.КорневойТип;
Если Базовый = Неопределено Или Примитивный = Неопределено Или Корневой = Неопределено Тогда
    ВызватьИсключение "Не разрешена иерархия собственного атомарного типа";
КонецЕсли;
Сообщить(Базовый.Имя = "string");
Сообщить(Примитивный.Имя = "string");
Сообщить("Корневой тип: " + Корневой.Имя);
Копия = НовыйТип.КлонироватьКомпоненту(Истина);
Если ТипЗнч(Копия) <> Тип("ОпределениеПростогоТипаXS") Тогда
    ВызватьИсключение "Не получена копия ShortSku";
КонецЕсли;
Копия.Имя = "ShortSkuCopy";
Схема.Содержимое.Добавить(Копия);
Схема.ОбновитьЭлементDOM();
Сообщить(Схема.ОпределенияТипов.Количество() = 7);
Сообщить(НовыйТип.Имя = "ShortSku");
Если Не Набор.Проверить() Тогда
    ВызватьИсключение "Собственная схема с копией типа не прошла проверку";
КонецЕсли;
Схема.Содержимое.Удалить(Копия);
Схема.Содержимое.Удалить(НовыйТип);
Сообщить(Схема.ОпределенияТипов.Количество() = 5);

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

  1. Конструктор простого типа создаёт отдельный компонент, который ещё не относится к схеме.

  2. Атомарный вариант с базовым QName xs:string задаёт restriction. Два фасета добавляются в собственный тип.

  3. Длина 3 задаёт полную длину, образец — структуру буква A–Z и две цифры. В этом уроке проверяется модель схемы, не набор строк.

  4. АннотацияВарианта относится к restriction. Через Состав добавляется собственная документация источника правила.

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

  6. Копия получает уникальное имя. Исходные пять типов остаются после удаления только двух созданных типов.

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

  1. Восемь логических проверок Истина и диагностическое имя корневого типа.

  2. Количество глобальных типов 5→6→7→5; исходный Sku не переименован и не удалён.

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

Конструкторы типа и двух фасетов встроены в полный проверяемый цикл сборки и удаления.

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

  1. Проверка набора схем не доказывает, что A12 или другая строка успешно провалидирована как XML-экземпляр.

  2. После удаления Копия и НовыйТип не используются; не переносите удаление на чужую модель.

  3. Корневой и примитивный тип — разные уровни иерархии, их имена не объявлены одинаковыми.

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

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

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

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

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