Тип: Булево. Указывает возможность установки значения элемента в nil.
Полное описание, параметры и ограничения
ОбъявлениеЭлементаXS.ВозможноПустой (XSElementDeclaration.Nillable)
ОбъявлениеЭлементаXS (XSElementDeclaration)
ВозможноПустой (Nillable)
Доступен, начиная с версии 8.1.
Использование:
Чтение и запись.
Описание:
Тип: Булево.
Указывает возможность установки значения элемента в nil.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Примечание:
Истина - данное свойство может быть установлено в nil.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Разделить default, возможность пустого значения и копию элемента
note имеет default и nillable. Копия noteCopy получает другое значение по умолчанию и удаляется после проверки; исходное объявление остаётся.
Где и как запускать
Полный модуль серверного общего модуля УчебныеЗадачи (флаг Сервер) в учебной базе. Вызовите ВыполнитьПример() из серверного обработчика своей обработки. Вставляйте обе процедуры на уровне модуля.
Подготовка
Выполните каждый полный модуль отдельно на сервере учебной базы. Вызовите ВыполнитьПример(); функция чтения схемы включена ниже в том же модуле.
Схема включена строкой. note — учебное примечание, currency — фиксированная валюта, wrapper содержит ссылки на них. Обмен и рабочие объекты не используются.
Нет DTD, импорта, файлов, сети или записи данных базы. Проверить проверяет XSD, а не XML-экземпляр товара.
Имена и namespace берите из собственной схемы. Не заменяйте их случайным узлом внешнего сервиса.
Процедура ВыполнитьПример() Экспорт
ТекстXSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:declarations"" targetNamespace=""urn:guide:declarations"" elementFormDefault=""qualified"" attributeFormDefault=""unqualified""><xs:element name=""note"" type=""xs:string"" default=""Без примечания"" nillable=""true""><xs:annotation><xs:documentation xml:lang=""ru"">Учебное примечание</xs:documentation></xs:annotation></xs:element><xs:attribute name=""currency"" type=""xs:string"" fixed=""RUB""><xs:annotation><xs:documentation xml:lang=""ru"">Учебная валюта</xs:documentation></xs:annotation></xs:attribute><xs:element name=""wrapper""><xs:complexType><xs:sequence><xs:element ref=""g:note""><xs:annotation><xs:documentation>Ссылка на примечание</xs:documentation></xs:annotation></xs:element></xs:sequence><xs:attribute ref=""g:currency"" use=""optional""><xs:annotation><xs:documentation>Использование валюты</xs:documentation></xs:annotation></xs:attribute></xs:complexType></xs:element></xs:schema>";
Схема = ПрочитатьСвоюСхему(ТекстXSD);
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Исходная собственная XSD не прошла проверку";
КонецЕсли;
Примечание = Схема.ОбъявленияЭлементов.Получить("note", "urn:guide:declarations");
Если Примечание = Неопределено Или Примечание.Аннотация = Неопределено Тогда
ВызватьИсключение "Не найдено собственное примечание с аннотацией";
КонецЕсли;
Сообщить(Примечание.URIПространстваИмен = "urn:guide:declarations");
Сообщить(Примечание.Ограничение = ОграничениеЗначенияXS.ПоУмолчанию);
Сообщить(Примечание.ЛексическоеЗначение = "Без примечания");
Сообщить(Примечание.Значение = "Без примечания");
Сообщить(Примечание.ВозможноПустой);
Сообщить(Примечание.ЭтоГлобальноеОбъявление);
Сообщить(Примечание.ОбластьВидимости = Схема);
Сообщить(Примечание.Содержит(Примечание.Аннотация));
Копия = Примечание.КлонироватьКомпоненту(Истина);
Если ТипЗнч(Копия) <> Тип("ОбъявлениеЭлементаXS") Тогда
ВызватьИсключение "Не скопировано объявление элемента";
КонецЕсли;
Копия.Имя = "noteCopy";
Копия.ЛексическоеЗначение = "Проверить отдельно";
Схема.Содержимое.Добавить(Копия);
Схема.ОбновитьЭлементDOM();
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Не прошла схема с копией примечания";
КонецЕсли;
Сообщить(Копия.ЛексическоеЗначение = "Проверить отдельно");
Сообщить(Примечание.ЛексическоеЗначение = "Без примечания");
Схема.Содержимое.Удалить(Копия);
Схема.ОбновитьЭлементDOM();
Сообщить(Схема.ОбъявленияЭлементов.Количество() = 2);КонецПроцедуры
Функция ПрочитатьСвоюСхему(ТекстXSD)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстXSD);
Попытка
ПостроительДерева = Новый ПостроительDOM;
ДокументСхемы = ПостроительДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
ПостроительСхем = Новый ПостроительСхемXML;
Результат = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Результат = Неопределено Тогда
ВызватьИсключение "Не построена собственная схема";
КонецЕсли;
Возврат Результат;
КонецФункцииРазбор по шагам
URI и область видимости показывают глобальную принадлежность note собственной схеме.
default задаёт значение по умолчанию элемента с пустым содержимым; nillable допускает xsi:nil. Это не minOccurs и не разрешение убрать обязательный узел.
ЛексическоеЗначение — запись значения в XML, Значение — его типизированное представление. Для xs:string оба здесь содержат одинаковый текст.
Рекурсивная копия включает собственную аннотацию. Новое уникальное имя позволяет присоединить её без дублирования note.
После изменения копии синхронизируем DOM и проверяем схему. Удаляем только копию, после удаления её больше не используем.
Как проверить результат
Если исходная схема построена корректно, все одиннадцать сообщений Истина.
noteCopy временно существует; после удаления глобальных элементов снова два — note и wrapper.
Ожидаемый результат
У исходного и скопированного элементов разные default без изменения рабочей схемы.
На что обратить внимание
nillable не равнозначно необязательному узлу.
Чтение произвольного XML через DOM само не подставляет default из XSD.
Не используйте удалённую копию.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Прочитать порядок полей товара и кратность необязательного примечания
Разбираем составной тип Product собственной схемы: sequence, три элемента, обязательные name/quantity и необязательный note.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В начале приведена полная XSD. Не заменяйте её внешней схемой: проверки типов и количества рассчитаны на Product из этого урока.
Используйте серверную учебную процедуру. Составной тип не является объектом документа 1С.
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:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
ЧтениеДерева = Новый ПостроительDOM;
ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
ТипТовара = Схема.ОпределенияТипов.Получить("Product", "urn:guide:product");
Сообщить(ТипТовара.Имя = "Product");
Сообщить(ТипТовара.URIПространстваИмен = "urn:guide:product");
Сообщить(Не ТипТовара.Абстрактный);
Сообщить(Не ТипТовара.Смешанный);
Сообщить(Не ТипТовара.ЭтоОпределениеЗациклено());
Сообщить("Модель содержимого: " + Строка(ТипТовара.МодельСодержимого));
Сообщить("Метод наследования: " + Строка(ТипТовара.МетодНаследования));
Фрагмент = ТипТовара.Содержимое;
Если ТипЗнч(Фрагмент) <> Тип("ФрагментXS") Тогда
ВызватьИсключение "Ожидался фрагмент sequence собственной схемы";
КонецЕсли;
Группа = Фрагмент.Часть;
Если ТипЗнч(Группа) <> Тип("ГруппаМоделиXS") Тогда
ВызватьИсключение "Ожидалась группа модели собственной схемы";
КонецЕсли;
Сообщить("Вид группы: " + Строка(Группа.ВидГруппы));
Сообщить(Группа.Фрагменты.Количество() = 3);
Для Каждого ЧастьПолей Из Группа.Фрагменты Цикл
Объявление = ЧастьПолей.Часть;
Если ТипЗнч(Объявление) <> Тип("ОбъявлениеЭлементаXS") Тогда
ВызватьИсключение "Ожидался элемент собственной последовательности";
КонецЕсли;
Сообщить(СтрШаблон("%1: минимум %2, максимум %3", Объявление.Имя,
ЧастьПолей.МинимальноВходит, ЧастьПолей.МаксимальноВходит));
Сообщить("Тип: " + Объявление.ОпределениеТипа().Имя);
Сообщить(Не Объявление.ЭтоГлобальноеОбъявление);
Сообщить(Не Объявление.ЭтоСсылка);
Сообщить(Не Объявление.ВозможноПустой);
Сообщить(Не Объявление.ЭтоОбъявлениеЗациклено());
Если Объявление.Имя = "note" Тогда
Сообщить(ЧастьПолей.МинимальноВходит = 0);
Сообщить(ЧастьПолей.ДопускаетсяПустой());
Иначе
Сообщить(ЧастьПолей.МинимальноВходит = 1);
Сообщить(Не ЧастьПолей.ДопускаетсяПустой());
КонецЕсли;
Сообщить(ЧастьПолей.МаксимальноВходит = 1);
КонецЦикла;Разбор по шагам
Содержимое составного типа даёт ФрагментXS, а Часть этого фрагмента — ГруппаМоделиXS последовательности.
Фрагменты группы содержат отдельные объявления name, quantity и note в порядке sequence.
Кратность относится к фрагменту: минимум 1 требует элемент, минимум 0 разрешает его отсутствие, максимум 1 запрещает повторение.
ОпределениеТипа раскрывает тип поля: string или nonNegativeInteger. Все три объявления локальные, без ref.
ВозможноПустой относится к xsi:nil. Отсутствующий note и элемент с xsi:nil — разные случаи; minOccurs=0 не включает nillable автоматически.
Как проверить результат
Выводятся name, quantity, note в таком порядке; фрагментов три.
Для name/quantity минимум 1 и пустой фрагмент не допускается; для note минимум 0 и допускается отсутствие.
Максимум у каждого поля 1; ВозможноПустой Ложь для всех трёх.
Ожидаемый результат
Порядок XML-полей, обязательность, повторяемость и xsi:nil разделены на конкретном контракте товара.
На что обратить внимание
Не путайте minimum occurrences и разрешение xsi:nil: это разные ограничения.
Группа sequence отличается от choice/all; этот пример не универсальный обход любой модели.
Поля схемы читаются, данные товара в базе не создаются.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.