ФасетXDTO

Типы · XDTOFacet

Фасет типа значения модели XDTO.

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

ФасетXDTO (XDTOFacet)

ФасетXDTO (XDTOFacet)

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

Свойства:
Вид (Type)
Значение (Value)

Описание:

Фасет типа значения модели XDTO.

Доступность:

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

См. также:
КоллекцияФасетовXDTO, метод Получить

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

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

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

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

Прочитать фасеты артикула и цвета, затем проверить свои значения

Артикул A001 ограничен длиной и XSD-образцом, цвет — перечислением red/blue. Фасеты XDTO читаются из уже построенной модели, не из вручную сочинённого описания.

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

Полный серверный общий модуль собственной отдельной учебной конфигурации.

Подготовка

  1. Создайте отдельную собственную конфигурацию с именем УчебнаяКонфигурацияСинтаксиса. Не используйте рабочую КА2, УНФ, УТ или БП.

  2. Создайте неглобальный общий модуль УчебнаяМодельXDTO85 с флагом Сервер. Вставьте весь выбранный пример, включая вспомогательные функции, если они присутствуют.

  3. Из серверной команды своей учебной обработки вызовите УчебнаяМодельXDTO85.ВыполнитьПример(). Передавать неизвестный объект или реквизиты чужой конфигурации не нужно.

  4. XSD целиком встроена в код: артикул Sku, цвет Color, список артикулов, объединение, абстрактный Base, строка Item, производный Order и смешанный Note.

  5. Справочники, документы и пакеты XDTO метаданных создавать не нужно. Схема и фабрика принадлежат только этому выполнению в памяти.

  6. urn:guide:model85 и URI стандартной XML Schema — идентификаторы пространств имён. Код не загружает их из Интернета; import/include, DTD и внешних файлов нет.

  7. Проверки Истина относятся к приведённой неизменённой учебной XSD. После её изменения сначала пересмотрите ожидаемые типы, границы и обязательность.

  8. Это полный учебный исходник с проверенными статически API, но запуск в 1С не проверялся. Ошибку подготовки схемы не следует принимать за успешную проверку данных.

Процедура ВыполнитьПример() Экспорт
    XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:model85"" targetNamespace=""urn:guide:model85"" elementFormDefault=""qualified"" attributeFormDefault=""unqualified"">
    |<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:simpleType name=""Color""><xs:restriction base=""xs:string""><xs:enumeration value=""red""/><xs:enumeration value=""blue""/></xs:restriction></xs:simpleType>
    |<xs:simpleType name=""SkuList""><xs:list itemType=""g:Sku""/></xs:simpleType>
    |<xs:simpleType name=""QuantityOrCode""><xs:union memberTypes=""xs:positiveInteger g:Sku""/></xs:simpleType>
    |<xs:complexType name=""Base"" abstract=""true""><xs:attribute name=""code"" type=""g:Sku"" use=""required""/></xs:complexType>
    |<xs:complexType name=""Item""><xs:sequence><xs:element name=""name"" type=""xs:string""/><xs:element name=""quantity"" type=""xs:nonNegativeInteger""/></xs:sequence></xs:complexType>
    |<xs:complexType name=""Order""><xs:complexContent><xs:extension base=""g:Base""><xs:sequence><xs:element name=""item"" type=""g:Item"" minOccurs=""0"" maxOccurs=""unbounded""/></xs:sequence></xs:extension></xs:complexContent></xs:complexType>
    |<xs:complexType name=""Note"" mixed=""true""><xs:sequence><xs:element name=""amount"" type=""xs:decimal"" minOccurs=""0"" maxOccurs=""unbounded""/></xs:sequence></xs:complexType>
    |<xs:element name=""order"" type=""g:Order""/><xs:element name=""note"" type=""g:Note""/>
    |</xs:schema>";
    ЧтениеСхемы = Новый ЧтениеXML;
    ЧтениеСхемы.УстановитьСтроку(XSD);
    Попытка
        Дерево = Новый ПостроительDOM;
        ДокументСхемы = Дерево.Прочитать(ЧтениеСхемы);
    Исключение
        ОшибкаСхемы = ОписаниеОшибки();
        Попытка
            ЧтениеСхемы.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаСхемы + Символы.ПС + "Закрытие: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаСхемы;
    КонецПопытки;
    ЧтениеСхемы.Закрыть();
    ПостроительСхем = Новый ПостроительСхемXML;
    Схема = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
    Если Схема = Неопределено Тогда
        ВызватьИсключение "Не построена собственная схема коллекций";
    КонецЕсли;
    НаборСхем = Новый НаборСхемXML;
    НаборСхем.Добавить(Схема);
    Если НЕ НаборСхем.Проверить() Тогда
        ВызватьИсключение "Собственная схема не прошла проверку";
    КонецЕсли;
    Фабрика = Новый ФабрикаXDTO(НаборСхем);
    ТипАртикула = Фабрика.Тип("urn:guide:model85", "Sku");
    ТипЦвета = Фабрика.Тип("urn:guide:model85", "Color");
    ТипСтроки = Фабрика.Тип("http://www.w3.org/2001/XMLSchema", "string");
    ТипКоличества = Фабрика.Тип("http://www.w3.org/2001/XMLSchema", "nonNegativeInteger");
    Если ТипАртикула = Неопределено ИЛИ ТипЦвета = Неопределено
        ИЛИ ТипСтроки = Неопределено ИЛИ ТипКоличества = Неопределено Тогда
        ВызватьИсключение "Не найдены типы собственных проверок";
    КонецЕсли;
    Сообщить(ТипСтроки.ЭтоПотомок(ТипАртикула));
    Сообщить(НЕ ТипАртикула.ЭтоПотомок(ТипСтроки));
    ФасетыАртикула = ТипАртикула.Фасеты;
    ФасетДлины = ФасетыАртикула.Получить(ВидФасетаXDTO.Длина);
    Если ФасетДлины = Неопределено Тогда
        ВызватьИсключение "Не получен фасет длины собственного Sku";
    КонецЕсли;
    Сообщить(ФасетДлины.Вид = ВидФасетаXDTO.Длина);
    Сообщить(ФасетДлины.Значение = "4");
    Образцы = ФасетыАртикула.Образцы;
    Сообщить(Образцы.Количество() = 1);
    Сообщить(Образцы.Получить(0).Значение = "[A-Z][0-9]{3}");
    Для Индекс = 0 По ФасетыАртикула.Количество() - 1 Цикл
        Фасет = ФасетыАртикула.Получить(Индекс);
        Сообщить(Строка(Фасет.Вид) + ": " + Фасет.Значение);
    КонецЦикла;
    Перечисления = ТипЦвета.Фасеты.Перечисления;
    Цвета = Новый Соответствие;
    Для Индекс = 0 По Перечисления.Количество() - 1 Цикл
        Цвета.Вставить(Перечисления.Получить(Индекс).Значение, Истина);
    КонецЦикла;
    Сообщить(Цвета.Количество() = 2);
    Сообщить(Цвета.Получить("red") = Истина И Цвета.Получить("blue") = Истина);
    ТипАртикула.Проверить("A001");
    ТипЦвета.Проверить("red");
    ТипКоличества.Проверить(3);
    Артикул = Фабрика.Создать(ТипАртикула, "A001");
    Цвет = Фабрика.Создать(ТипЦвета, "red");
    Сообщить(Артикул.Значение = "A001" И Цвет.Значение = "red");
    ПроверитьОтклонениеСвоегоЗначения(Фабрика, ТипАртикула, "A01");
    ПроверитьОтклонениеСвоегоЗначения(Фабрика, ТипАртикула, "a001");
    ПроверитьОтклонениеСвоегоЗначения(Фабрика, ТипЦвета, "green");
    ПроверитьОтклонениеСвоегоЗначения(Фабрика, ТипКоличества, "-1");
КонецПроцедуры

Процедура ПроверитьОтклонениеСвоегоЗначения(Фабрика, ТипЗначения, ЛексическоеЗначение)
    Отклонено = Ложь;
    Попытка
        Неподходящее = Фабрика.Создать(ТипЗначения, ЛексическоеЗначение);
        Сообщить("Неожиданно принято: " + Неподходящее.ЛексическоеЗначение);
    Исключение
        Отклонено = Истина;
    КонецПопытки;
    Если НЕ Отклонено Тогда
        ВызватьИсключение "Не отклонено учебное значение: " + ЛексическоеЗначение;
    КонецЕсли;
    Сообщить("Отклонено по собственному контракту: " + ЛексическоеЗначение);
КонецПроцедуры

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

  1. Получить собственные Sku/Color и стандартные типы, на которые реально ссылается XSD. Проверить найденные типы до использования.

  2. Подтвердить, что Sku — потомок string, но string не потомок Sku. Ограничения делают допустимое множество уже.

  3. Получить length по ВидФасетаXDTO.Длина. Его Значение здесь строка "4", в отличие от числового значения отдельного компонента XSD ФасетДлиныXS.

  4. Образцы — отдельная коллекция фасетов pattern. У собственного Sku один образец, поэтому индекс 0 проверяется после количества.

  5. Обойти все фасеты через индексную перегрузку Получить и вывести реальные вид/значение.

  6. Перечисления Color преобразовать в карту для проверки двух значений без предположения о порядке коллекции.

  7. Проверить допустимые лексические строки A001/red и платформенное число 3 без присваивания результата метода Проверить.

  8. Создать типизированные допустимые значения. Четыре недопустимых значения проверять в узкой вспомогательной процедуре, после успешной подготовки всей модели.

  9. Если недопустимое значение неожиданно принято, явно остановить пример. Диагностику схемы или фабрики не скрывать общим обработчиком вокруг всего урока.

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

  1. A001 и red созданы с ожидаемыми значениями. На неизменённой XSD булевы сравнения дают Истина.

  2. Напечатаны четыре сообщения об отклонении: A01, a001, green, -1. Порядок фасетов/перечислений не используется для проверки.

  3. Фасет длины имеет строковое значение 4, единственный образец — [A-Z][0-9]{3}, два цвета — red и blue.

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

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

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

  1. Проверить простого типа не имеет документированного результата Булево: не пишите Если ТипАртикула.Проверить(...).

  2. ФасетыXDTO и компоненты ФасетДлиныXS — разные объекты с разным типом поля Значение.

  3. XSD pattern не заменяется произвольным JavaScript- или BSL-регулярным выражением.

  4. red/blue и форма A001 — только наши учебные ограничения, а не правила артикулов и цветов реальной конфигурации.

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

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

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

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

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

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