Тип: Произвольный. Значение фасета.
Полное описание, параметры и ограничения
ФасетМаксимальногоВключающегоЗначенияXS.Значение (XSMaxInclusiveFacet.Value)
ФасетМаксимальногоВключающегоЗначенияXS (XSMaxInclusiveFacet)
Значение (Value)
Доступен, начиная с версии 8.1.
Использование:
Чтение и запись.
Описание:
Тип: Произвольный.
Значение фасета.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Проверить цену по диапазону и числу десятичных разрядов XSD
Цена от 0 до 9999.99 включительно, не более шести значащих десятичных цифр и двух дробных. Ограничения читаем из собственной схемы и проверяем на граничных значениях.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Серверная процедура в учебной базе. Весь XSD находится в начале кода; сеть, справочники и файлы не нужны.
Для XML десятичная точка записана как точка. В строках случаев намеренно есть значения за пределами контракта.
XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema""
| xmlns:g=""urn:guide:limits"" targetNamespace=""urn:guide:limits"">
| <xs:simpleType name=""Price""><xs:restriction base=""xs:decimal"">
| <xs:minInclusive value=""0""/><xs:maxInclusive value=""9999.99""/>
| <xs:totalDigits value=""6""/><xs:fractionDigits value=""2""/>
| </xs:restriction></xs:simpleType>
| <xs:simpleType name=""Discount""><xs:restriction base=""xs:decimal"">
| <xs:minExclusive value=""0""/><xs:maxExclusive value=""1""/>
| </xs:restriction></xs:simpleType>
| <xs:simpleType name=""Status""><xs:restriction base=""xs:string"">
| <xs:whiteSpace value=""collapse""/>
| <xs:enumeration value=""draft""/><xs:enumeration value=""published""/>
| <xs:enumeration value=""closed""/>
| </xs:restriction></xs:simpleType>
| <xs:simpleType name=""Description""><xs:restriction base=""xs:string"">
| <xs:minLength value=""3""/><xs:maxLength value=""20""/>
| </xs:restriction></xs:simpleType>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
Документ = Новый ПостроительDOM;
DOM = Документ.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(DOM.ЭлементДокумента);
Если Схема = Неопределено Тогда
ВызватьИсключение "Не построена собственная схема ограничений";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Не прошла проверка собственной схемы";
КонецЕсли;
Фабрика = Новый ФабрикаXDTO(Набор);
Определение = Схема.ОпределенияТипов.Получить("Price", "urn:guide:limits");
ТипМодели = Фабрика.Тип("urn:guide:limits", "Price");
Сообщить(Определение.Фасеты.Количество() = 4);
Для Каждого Фасет Из Определение.Фасеты Цикл
Сообщить(Строка(Фасет.ТипКомпоненты) + ": " + Фасет.ЛексическоеЗначение);
Сообщить("Типизированное значение: " + Строка(Фасет.Значение));
Сообщить("Фиксирован в потомках: " + Строка(Фасет.Фиксированный));
Сообщить(Фасет.ОпределениеПростогоТипа.Имя = Определение.Имя);
Сообщить(Фасет.Контейнер <> Неопределено);
Сообщить(Фасет.КорневойКонтейнер <> Неопределено);
Сообщить(Фасет.Схема.ПространствоИмен = "urn:guide:limits");
Сообщить(Фасет.Аннотация = Неопределено);
Сообщить(Фасет.Компоненты.Количество() = 0);
Фасет.ОбновитьЭлементDOM();
Сообщить("XML-тег ограничения: " + Фасет.ЭлементDOM.ИмяЭлемента);
КопияФасета = Фасет.КлонироватьКомпоненту(Истина);
Сообщить(ТипЗнч(КопияФасета) = ТипЗнч(Фасет));
Сообщить(КопияФасета.ЛексическоеЗначение = Фасет.ЛексическоеЗначение);
Сообщить(Не Фасет.Содержит(КопияФасета));
КонецЦикла;
Для Каждого Граница Из Определение.Фасеты Цикл
Если ТипЗнч(Граница) = Тип("ФасетМинимальногоВключающегоЗначенияXS")
Или ТипЗнч(Граница) = Тип("ФасетМаксимальногоВключающегоЗначенияXS") Тогда
Сообщить(Граница.Включающий И Не Граница.Исключающий);
КонецЕсли;
КонецЦикла;
Случаи = Новый Массив;
Случаи.Добавить(Новый Структура("Текст,Ожидается", "0", Истина));
Случаи.Добавить(Новый Структура("Текст,Ожидается", "9999.99", Истина));
Случаи.Добавить(Новый Структура("Текст,Ожидается", "12.340", Истина));
Случаи.Добавить(Новый Структура("Текст,Ожидается", "-0.01", Ложь));
Случаи.Добавить(Новый Структура("Текст,Ожидается", "10000", Ложь));
Случаи.Добавить(Новый Структура("Текст,Ожидается", "12.345", Ложь));
Для Каждого Случай Из Случаи Цикл
Допустимо = Ложь;
Попытка
ЗначениеМодели = Фабрика.Создать(ТипМодели, Случай.Текст);
Допустимо = Истина;
Исключение
Сообщить("Отклонено: " + Случай.Текст + "; "
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если Допустимо <> Случай.Ожидается Тогда
ВызватьИсключение "Не совпал результат проверки значения: " + Случай.Текст;
КонецЕсли;
Сообщить(СтрШаблон("%1: допустимо = %2", Случай.Текст, Допустимо));
КонецЦикла;Разбор по шагам
Price наследует xs:decimal. Диапазон задают minInclusive/maxInclusive, точность — totalDigits/fractionDigits.
Фасеты показывают лексическую запись, типизированное значение и связь с типом Price; это разные уровни представления.
КлонироватьКомпоненту даёт отдельную копию ограничения в памяти. Копия не добавляется в исходную схему; Содержит проверяет компоненты, а не принадлежность числа диапазону.
Включающий Истина означает, что обе граничные цены разрешены. У исключающих границ правило другое.
Каждый случай проверяет создание настоящего ЗначениеXDTO. Несовпадение с ожидаемым результатом вызывает исключение.
12.340 и 12.34 представляют одно десятичное значение: завершающий ноль не увеличивает число значащих дробных разрядов.
Как проверить результат
Четыре фасета: 0, 9999.99, 6 и 2; обе границы включающие.
0, 9999.99 и 12.340 принимаются; -0.01, 10000 и 12.345 отклоняются.
Не должно быть исключения о несовпадении ожидаемого результата.
Ожидаемый результат
Шесть конкретных значений проверены по собственной модели цены с разбором диапазона и точности.
На что обратить внимание
fractionDigits — максимум значащих дробных разрядов, не требование всегда печатать ровно два знака.
Контракт цены не задаёт валюту, НДС, скидки и округление учётной системы.
Содержит у фасета не проверяет число. Для проверки значения используем тип XDTO.
Ожидаемые исключения перехватываются только вокруг отдельного создания значения, ошибки построения схемы не скрыты.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Собрать новый диапазон цены из четырёх компонентов XSD
Меняем только собственную модель в памяти: вместо максимума 9999.99 задаём 99.99. Новые фасеты создаются конструкторами и присоединяются к Price до повторной проверки схемы.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Схема создана из собственной строки. Не подменяйте Набор пакетом XDTO реальной конфигурации.
Очистить вызывается только для фасетов собственного Price. Остальные типы Discount/Status/Description не меняются.
XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema""
| xmlns:g=""urn:guide:limits"" targetNamespace=""urn:guide:limits"">
| <xs:simpleType name=""Price""><xs:restriction base=""xs:decimal"">
| <xs:minInclusive value=""0""/><xs:maxInclusive value=""9999.99""/>
| <xs:totalDigits value=""6""/><xs:fractionDigits value=""2""/>
| </xs:restriction></xs:simpleType>
| <xs:simpleType name=""Discount""><xs:restriction base=""xs:decimal"">
| <xs:minExclusive value=""0""/><xs:maxExclusive value=""1""/>
| </xs:restriction></xs:simpleType>
| <xs:simpleType name=""Status""><xs:restriction base=""xs:string"">
| <xs:whiteSpace value=""collapse""/>
| <xs:enumeration value=""draft""/><xs:enumeration value=""published""/>
| <xs:enumeration value=""closed""/>
| </xs:restriction></xs:simpleType>
| <xs:simpleType name=""Description""><xs:restriction base=""xs:string"">
| <xs:minLength value=""3""/><xs:maxLength value=""20""/>
| </xs:restriction></xs:simpleType>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
Документ = Новый ПостроительDOM;
DOM = Документ.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(DOM.ЭлементДокумента);
Если Схема = Неопределено Тогда
ВызватьИсключение "Не построена собственная схема ограничений";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Не прошла проверка собственной схемы";
КонецЕсли;
Фабрика = Новый ФабрикаXDTO(Набор);
Определение = Схема.ОпределенияТипов.Получить("Price", "urn:guide:limits");
Минимум = Новый ФасетМинимальногоВключающегоЗначенияXS;
Минимум.ЛексическоеЗначение = "0";
Максимум = Новый ФасетМаксимальногоВключающегоЗначенияXS;
Максимум.ЛексическоеЗначение = "99.99";
Разрядов = Новый ФасетОбщегоКоличестваРазрядовXS;
Разрядов.ЛексическоеЗначение = "6";
Дробных = Новый ФасетКоличестваРазрядовДробнойЧастиXS;
Дробных.ЛексическоеЗначение = "2";
Определение.Фасеты.Очистить();
Определение.Фасеты.Добавить(Минимум);
Определение.Фасеты.Добавить(Максимум);
Определение.Фасеты.Добавить(Разрядов);
Определение.Фасеты.Добавить(Дробных);
Сообщить(Определение.Фасеты.Количество() = 4);
Сообщить(Максимум.ОпределениеПростогоТипа.Имя = "Price");
Сообщить(Максимум.Значение = 99.99);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Изменённая собственная схема не прошла проверку";
КонецЕсли;
// Старая фабрика не обновляется автоматически вслед за изменением XSD.
НоваяФабрика = Новый ФабрикаXDTO(Набор);
ТипЦены = НоваяФабрика.Тип("urn:guide:limits", "Price");
ГраничнаяЦена = НоваяФабрика.Создать(ТипЦены, "99.99");
Сообщить(ГраничнаяЦена.Значение = 99.99);
Отклонено = Ложь;
Попытка
СлишкомДорого = НоваяФабрика.Создать(ТипЦены, "100");
Исключение
Отклонено = Истина;
Сообщить("Ожидаемое отклонение цены 100");
КонецПопытки;
Если Не Отклонено Тогда
ВызватьИсключение "Новый максимум 99.99 не применён к модели";
КонецЕсли;Разбор по шагам
Конструкторы создают четыре самостоятельных компонента ограничения.
ЛексическоеЗначение задаётся в формате XML: точка у десятичного числа, без региональных разделителей групп.
После добавления в Фасеты компоненты принадлежат определению Price; его десятичный базовый тип позволяет интерпретировать 99.99 как число.
Повторная проверка проверяет изменённую схему, не конкретную цену.
Создаём новую фабрику из изменённого набора. Старая Фабрика из подготовки остаётся прежней моделью и не используется для проверки нового диапазона.
99.99 допустимо; 100 должно быть отклонено. Если ограничения не действуют, пример явно сообщает ошибку.
Как проверить результат
Четыре новых фасета; максимум принадлежит Price и имеет числовое значение 99.99.
Граничная цена создаётся, 100 отклоняется.
В конфигураторе и на диске ничего не меняется: работа только с собственным набором в памяти.
Ожидаемый результат
Конструкторы фасетов использованы для реального изменения собственного контракта и проверки новой границы цены.
На что обратить внимание
Установка ЛексическоеЗначение на отдельном компоненте ещё не означает, что ограничение вошло в тип: его нужно присоединить.
Не очищайте фасеты чужой схемы — это может снять необходимые ограничения.
Изменение XSD не обновляет уже созданную фабрику автоматически.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.