СвойствоXDTO.ЗначениеПоУмолчанию

Свойства · DefaultValue

Тип: ЗначениеXDTO. Значение по умолчанию для данного свойства.

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

СвойствоXDTO.ЗначениеПоУмолчанию (XDTOProperty.DefaultValue)

СвойствоXDTO (XDTOProperty)

ЗначениеПоУмолчанию (DefaultValue)

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

Использование:
Только чтение.
Описание:
Тип: ЗначениеXDTO.
Значение по умолчанию для данного свойства.
Доступность:

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

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

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

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

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

Открытый XDTO: две заметки, default схемы, владелец свойства и XML roundtrip

Собственный открытый Envelope получает реальное произвольное свойство двумя native-формами Добавить. Проверяем default draft, отдельное значение ready, владельца динамического свойства, сериализацию и два запрета.

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

Полный серверный общий модуль собственной пустой файловой ИБ; все XDTO/XML остаются на серверном контексте в памяти. Runtime0.

Подготовка

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

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

  3. Не устанавливайте расширения ни в базу, ни в сеанс. Полный ПроверитьСвойПустойСтенд в каждом основном модуле проверяет все три native-источника расширений, отсутствие активной транзакции.

  4. Создайте общий модуль УчебныеXDTO85: СерверИстина, ВызовСервераЛожь, ГлобальныйЛожь, Клиент(управляемое приложение)Ложь, Клиент(обычное приложение)Ложь, ВнешнееСоединениеЛожь, ПривилегированныйЛожь. Поместите весь основной код этого урока в этот пустой модуль.

  5. Создайте обработку УчебныеXDTO85 с собственной основной управляемой формой. Добавьте команду Выполнить, обработчик Выполнить и кнопку на форме. Поместите полный вспомогательный модуль формы из этого урока; он передаёт только итоговую строку, не фабрику/DOM/XDTO-объект между клиентом и сервером.

  6. Уроки самостоятельны: для следующего урока замените весь собственный общий модуль соответствующим полным основным кодом. Одновременное склеивание модулей с одинаковым ВыполнитьПример85 запрещено.

  7. UUID создается локально для каждого опыта. URI urn:guide:xdto-scalars85:<UUID> и дополнительный URI с :extra — имена пространств, не URL. Схема, DOM, фабрика и XML создаются лишь в памяти: нет import/include, DTD, чтения файлов, сети, обращения к базам или глобальной ФабрикаXDTO конфигурации.

  8. Собственная XSD полностью включена в код: Sku — строка ровно4символа с прописной латинской буквой и3цифрами; SkuList — список Sku; QtyOrSku — union positiveInteger/Sku; Envelope — открытая wildcard-структура; Closed — закрытая структура.

  9. Обновите только свою учебную конфигурацию базы данных. Запустите собственную обработку в тонком управляемом клиенте; API построения схем выполняется на серверном контексте файловой ИБ, а не в клиентском модуле.

  10. Это подготовленный пример, проверенный статически и по установленной справке. Фактических запусков 1С здесь0; если ручной тест выдает исключение, сохраните его текст и не убирайте защитные проверки ради продолжения.

Функция ВыполнитьПример85() Экспорт
    Опыт = ПодготовитьСвойКонтракт85();
    Фабрика = Опыт.Фабрика;
    ТипОткрытого = Фабрика.Тип(Опыт.URI, "Envelope");
    ТипЗакрытого = Фабрика.Тип(Опыт.URI, "Closed");
    Если Не ТипОткрытого.Открытый Или ТипЗакрытого.Открытый Тогда
        ВызватьИсключение "Требуются собственные wildcard Envelope и закрытый Closed";
    КонецЕсли;
    ТипСтроки = Фабрика.Тип("http://www.w3.org/2001/XMLSchema", "string");
    Объект = Фабрика.Создать(ТипОткрытого);
    Свойства = Объект.Свойства();
    Код = Свойства.Получить("code");
    Статус = Свойства.Получить("status");
    ПоУмолчанию = Статус.ЗначениеПоУмолчанию;
    Если ТипЗнч(ПоУмолчанию) <> Тип("ЗначениеXDTO") Или ПоУмолчанию.Значение <> "draft" Тогда
        ВызватьИсключение "Default draft должен происходить из собственной XSD, а не из присваивания descriptor";
    КонецЕсли;
    Объект.Установить(Код, Фабрика.Создать(Код.Тип, "A001"));
    Объект.Установить(Статус, Фабрика.Создать(Статус.Тип, "ready"));
    URIДополнения = Опыт.URI + ":extra";
    Объект.Добавить(ФормаXML.Элемент, URIДополнения, "note", Фабрика.Создать(ТипСтроки, "Первая заметка"), НазначениеТипаXML.Явное);
    Произвольное = Объект.Свойства().Получить("note");
    Если Произвольное = Неопределено Или Произвольное.ОбъектВладелец <> Объект
        Или Произвольное.URIПространстваИмен <> URIДополнения
        Или Произвольное.Тип <> Фабрика.Тип("http://www.w3.org/2001/XMLSchema", "anyType") Тогда
        ВызватьИсключение "Новое свойство должно принадлежать именно своему открытому объекту и иметь native anyType";
    КонецЕсли;
    Объект.Добавить(Произвольное.Имя, Фабрика.Создать(ТипСтроки, "Вторая заметка"), НазначениеТипаXML.Явное);
    Заметки = Объект.ПолучитьСписок(Произвольное);
    Если ТипЗнч(Заметки) <> Тип("СписокXDTO") Или Заметки.Количество() <> 2
        Или СвоеПростоеЗначение85(Заметки.Получить(0)) <> "Первая заметка"
        Или СвоеПростоеЗначение85(Заметки.Получить(1)) <> "Вторая заметка"
        Или Статус.ЗначениеПоУмолчанию.Значение <> "draft" Тогда
        ВызватьИсключение "Порядок двух повторных значений или неизменность default нарушены";
    КонецЕсли;
    Объект.Проверить();
    Снимок = СохранитьПрочитатьСвойОбъект85(Опыт, Объект);
    Копия = Снимок.Копия;
    СвойствоКопии = Копия.Свойства().Получить("note");
    ЗаметкиКопии = Копия.ПолучитьСписок(СвойствоКопии);
    Если Копия.Получить("code") <> "A001" Или Копия.Получить("status") <> "ready"
        Или СвойствоКопии.ОбъектВладелец <> Копия
        Или ЗаметкиКопии.Количество() <> 2
        Или СвоеПростоеЗначение85(ЗаметкиКопии.Получить(0)) <> "Первая заметка"
        Или СвоеПростоеЗначение85(ЗаметкиКопии.Получить(1)) <> "Вторая заметка" Тогда
        ВызватьИсключение "Roundtrip потерял свой код, статус, владельца или заметки";
    КонецЕсли;
    ОтказОтсутствующего = Ложь;
    Попытка
        Объект.Добавить("missing", Фабрика.Создать(ТипСтроки, "Не добавлять"), НазначениеТипаXML.Явное);
    Исключение
        ОтказОтсутствующего = Истина;
    КонецПопытки;
    Закрытый = Фабрика.Создать(ТипЗакрытого);
    Закрытый.Установить("code", Фабрика.Создать(Фабрика.Тип(Опыт.URI, "Sku"), "A001"));
    Закрытый.Проверить();
    ОтказЗакрытого = Ложь;
    Попытка
        Закрытый.Добавить(ФормаXML.Элемент, URIДополнения, "note", Фабрика.Создать(ТипСтроки, "Не добавлять"));
    Исключение
        ОтказЗакрытого = Истина;
    КонецПопытки;
    Если Не ОтказОтсутствующего Или Не ОтказЗакрытого Тогда
        ВызватьИсключение "Не подтверждены оба обязательных native отказа Добавить";
    КонецЕсли;
    Возврат "UUID " + Опыт.UUIDОпыта + ": свой default draft; status ready; две заметки; свой владелец; XML roundtrip; оба отказа подтверждены" + Символы.ПС + Снимок.XML;
КонецФункции

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Функция ПодготовитьСвойКонтракт85()
    ПроверитьСвойПустойСтенд();
    UUIDОпыта = Строка(Новый УникальныйИдентификатор);
    Если UUIDОпыта = "00000000-0000-0000-0000-000000000000" Тогда
        ВызватьИсключение "Нужен собственный ненулевой UUID опыта";
    КонецЕсли;
    URI = "urn:guide:xdto-scalars85:" + UUIDОпыта;
    XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:xdto-scalars85:__UUID__"" targetNamespace=""urn:guide:xdto-scalars85:__UUID__"" elementFormDefault=""qualified"">
    |<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=""SkuList""><xs:list itemType=""g:Sku""/></xs:simpleType>
    |<xs:simpleType name=""QtyOrSku""><xs:union memberTypes=""xs:positiveInteger g:Sku""/></xs:simpleType>
    |<xs:complexType name=""Envelope""><xs:sequence><xs:any namespace=""##other"" processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded""/></xs:sequence><xs:attribute name=""code"" type=""g:Sku"" use=""required""/><xs:attribute name=""status"" type=""xs:string"" default=""draft""/><xs:anyAttribute namespace=""##other"" processContents=""lax""/></xs:complexType>
    |<xs:complexType name=""Closed""><xs:attribute name=""code"" type=""g:Sku"" use=""required""/></xs:complexType>
    |<xs:element name=""sku"" type=""g:Sku""/><xs:element name=""skuList"" type=""g:SkuList""/><xs:element name=""qtyOrSku"" type=""g:QtyOrSku""/><xs:element name=""envelope"" type=""g:Envelope""/><xs:element name=""closed"" type=""g:Closed""/>
    |</xs:schema>";
    XSD = СтрЗаменить(XSD, "__UUID__", UUIDОпыта);
    ЧтениеСхемы = Новый ЧтениеXML;
    ЧтениеСхемы.УстановитьСтроку(XSD);
    Попытка
        Дерево = Новый ПостроительDOM;
        ДокументСхемы = Дерево.Прочитать(ЧтениеСхемы);
    Исключение
        ОшибкаСхемы = ОписаниеОшибки();
        Попытка
            ЧтениеСхемы.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаСхемы + Символы.ПС + "Закрытие XML: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаСхемы;
    КонецПопытки;
    ЧтениеСхемы.Закрыть();
    ПостроительСхем = Новый ПостроительСхемXML;
    Схема = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
    Набор = Новый НаборСхемXML;
    Набор.Добавить(Схема);
    Если Набор.Количество() <> 1 Или Не Набор.Проверить() Тогда
        ВызватьИсключение "Не подтверждена единственная собственная схема без внешних ссылок";
    КонецЕсли;
    Фабрика = Новый ФабрикаXDTO(Набор);
    Для Каждого Имя Из СтрРазделить("Sku,SkuList,QtyOrSku,Envelope,Closed", ",") Цикл
        Если Фабрика.Тип(URI, Имя) = Неопределено Тогда
            ВызватьИсключение "Собственный тип схемы не создан: " + Имя;
        КонецЕсли;
    КонецЦикла;
    Возврат Новый Структура("UUIDОпыта,URI,XSD,ДокументСхемы,Схема,Набор,Фабрика",
        UUIDОпыта, URI, XSD, ДокументСхемы, Схема, Набор, Фабрика);
КонецФункции

Функция СохранитьПрочитатьСвойОбъект85(Опыт, Объект)
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    Попытка
        Опыт.Фабрика.ЗаписатьXML(Запись, Объект, "envelope", Опыт.URI, ФормаXML.Элемент, НазначениеТипаXML.Явное);
    Исключение
        ОшибкаЗаписи = ОписаниеОшибки();
        Попытка
            Запись.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаЗаписи + Символы.ПС + "Закрытие записи: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаЗаписи;
    КонецПопытки;
    XML = Запись.Закрыть();
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(XML);
    Попытка
        Копия = Опыт.Фабрика.ПрочитатьXML(Чтение, Объект.Тип(), НазначениеТипаXML.Явное);
    Исключение
        ОшибкаЧтения = ОписаниеОшибки();
        Попытка
            Чтение.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаЧтения + Символы.ПС + "Закрытие чтения: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаЧтения;
    КонецПопытки;
    Чтение.Закрыть();
    Копия.Проверить();
    Возврат Новый Структура("XML,Копия", XML, Копия);
КонецФункции

Функция СвоеПростоеЗначение85(Элемент)
    Если ТипЗнч(Элемент) = Тип("ЗначениеXDTO") Тогда
        Возврат Элемент.Значение;
    КонецЕсли;
    Возврат Элемент;
КонецФункции
Полный модуль собственной управляемой формы

Обработка УчебныеXDTO85: полный модуль собственной управляемой формы

Управляемая форма обработки УчебныеXDTO85: единственная команда и кнопка Выполнить; общий модуль только серверный.

&НаКлиенте
Процедура Выполнить(Команда)
    Результат = ВыполнитьНаСервере();
    Сообщить(Результат);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
    Возврат УчебныеXDTO85.ВыполнитьПример85();
КонецФункции

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

  1. Строим свою схему и получаем реальные Envelope/Closed. Проверяем Открытый у первого и его отсутствие у второго; флаг не присваивается.

  2. Из статического descriptor status читаем ЗначениеПоУмолчанию: typed ЗначениеXDTO со значением draft. Это значение собственной XSD; свойство descriptor только для чтения.

  3. В экземпляре Envelope явно устанавливаем code=A001 и status=ready. Изменение значения экземпляра не меняет default draft в типе.

  4. Первый Добавить принимает ФормаXML.Элемент, свой namespace :extra, имя note, настоящее typed string и Явное. Native descriptor новой динамической note имеет anyType, а не тип строки.

  5. Получаем реально добавленный descriptor note и проверяем ОбъектВладелец равным этому экземпляру. Это свойство относится к пользовательскому открытому свойству, не к каждому статическому полю.

  6. Следующий Добавить сразу использует реальное Имя descriptor note: второй текст превращает свойство в повторный список. ПолучитьСписок и Получить подтверждают оба значения по порядку.

  7. Проверяем объект, записываем его в XML-строку с явным типом, закрываем writer, читаем той же фабрикой и закрываем reader. Проверяем копию: A001, ready, две заметки и владельца равного копии.

  8. Отдельно проверяем отказы: существующая форма Добавить не может создавать missing; закрытый Closed не разрешает никакой произвольной note.

  9. Итог и настоящий построенный XML выводятся только после успешного roundtrip и обоих отрицательных тестов. Исходный и прочитанный объекты независимы.

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

  1. Default descriptor остается draft, текущее собственное поле равно ready; никакого присваивания ЗначениеПоУмолчанию.

  2. Динамический descriptor имеет anyType, свой UUID namespace, своего владельца и две реальные заметки.

  3. Копия XML сохраняет код, статус, порядок заметок; ее descriptor принадлежит копии, не оригиналу.

  4. Отказы missing и closed обязательны; XML reader/writer закрываются также при исключении. Нет сети или записи файлов.

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

Будущий ручной успешный результат: draft в схеме, ready в объекте, две заметки, новый владелец у XML-копии и оба отказа. Вывод содержит реальную XML-строку своей UUID-схемы.

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

  1. После первого Добавить следующий должен продолжать то же произвольное свойство, иначе повторная вставка может вызвать исключение. Между двумя Добавить нет установки другого динамического значения.

  2. СвойствоXDTO.ОбъектВладелец не следует читать как паспорт статического поля: native определяет его для пользовательских свойств открытого типа.

  3. Закрытый тип нельзя сделать открытым присваиванием .Открытый: типовые descriptor readonly. Открытость задается авторской wildcard-схемой.

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

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

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

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

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