ОпределениеПростогоТипаXS.По умолчанию

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

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

Синтаксис

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

ОпределениеПростогоТипаXS.По умолчанию

ОпределениеПростогоТипаXS (XSSimpleTypeDefinition)

По умолчанию

Синтаксис:
Новый ОпределениеПростогоТипаXS
Методическая информация

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

Синтаксис разыменования определения типа собственной XSD-схемы

Ограниченный образец именно опубликованной двухаргументной сигнатуры: справка дублирует имя аргумента.

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

Сервер или толстый клиент; ограниченный синтаксис XSD.

Подготовка

  1. Сервер или толстый клиент. Создается собственный черновик XSD с именованным простым типом, без чтения внешней схемы. Это не полный валидный бизнес-формат.

Схема = Новый СхемаXML;
Определение = Новый ОпределениеПростогоТипаXS;
Определение.Имя = "Цена";
Схема.Содержимое.Добавить(Определение);
Имя = Новый РасширенноеИмяXML("", "Цена");
Найдено = Схема.РазрешитьОпределениеТипа(Имя, Имя);
Сообщить("Полученное определение: " + Строка(Найдено));

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

  1. Добавьте собственное именованное определение.

  2. Создайте расширенное имя в пустом пространстве имен.

  3. Проверьте опубликованный вызов в своей платформе.

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

  1. Ожидаемый объект должен соответствовать собственному определению Цена.

  2. Если платформа отвергает два аргумента, не объявляйте это успешным поиском.

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

Образец опубликованной сигнатуры на собственных объектах с явно указанным пробелом документации.

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

  1. Страница РазрешитьОпределениеТипа дважды перечисляет Имя типа РасширенноеИмяXML без объяснения различия. Одинаковые аргументы здесь показывают синтаксис, не доказывают роль второго. Проверка в целевой платформе обязательна; это не проверенный автономный поиск.

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

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

Базовый 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. Не присваивайте новый список свойству Содержимое: изменяйте полученную коллекцию.

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

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

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

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

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