ВариантXDTO.Атомарный

Свойства · Atomic

Атомарный вариант содержания типа значения.

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

ВариантXDTO.Атомарный (XDTOVariety.Atomic)

ВариантXDTO (XDTOVariety)

Атомарный (Atomic)

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

Использование:
Только чтение.
Описание:
Атомарный вариант содержания типа значения.
Доступность:

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

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

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

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

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

Три формы XDTO: артикул, список артикулов и число либо артикул

Из собственной XSD строим реальные простые типы, диспетчеризуем три известные формы ВариантXDTO и разбираем readonly КоллекцияЗначенийXDTO. Это не формальный getter и не попытка угадать устройство чужого типа.

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

Полный серверный общий модуль УчебныеXDTO85, отдельная пустая файловая ИБ8.5.1.1343; клиентская форма — только launcher. 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();
    Фабрика = Опыт.Фабрика;
    Контракты = Новый Соответствие;
    Контракты.Вставить("Sku", ВариантXDTO.Атомарный);
    Контракты.Вставить("SkuList", ВариантXDTO.Список);
    Контракты.Вставить("QtyOrSku", ВариантXDTO.Объединение);
    Проверено = 0;
    Для Каждого Контракт Из Контракты Цикл
        ТипЗначения = Фабрика.Тип(Опыт.URI, Контракт.Ключ);
        Если ТипЗнч(ТипЗначения) <> Тип("ТипЗначенияXDTO") Тогда
            ВызватьИсключение "Наши три простых типа должны быть ТипЗначенияXDTO";
        КонецЕсли;
        Если Контракт.Значение = ВариантXDTO.Атомарный Тогда
            Артикул = Фабрика.Создать(ТипЗначения, "A001");
            Если Артикул.Тип() <> ТипЗначения Или Артикул.ЛексическоеЗначение <> "A001"
                Или Артикул.Значение <> "A001" Тогда
                ВызватьИсключение "Нарушен собственный атомарный артикул";
            КонецЕсли;
            ПроверитьОтказСвоегоЗначения85(Фабрика, ТипЗначения, "a001");
            ПроверитьОтказСвоегоЗначения85(Фабрика, ТипЗначения, "A01");
        ИначеЕсли Контракт.Значение = ВариантXDTO.Список Тогда
            СписокАртикулов = Фабрика.Создать(ТипЗначения, "A001 B002 C003");
            Значения = СписокАртикулов.Список;
            Если ТипЗнч(Значения) <> Тип("КоллекцияЗначенийXDTO") Или Значения.Количество() <> 3 Тогда
                ВызватьИсключение "Простой list XSD должен дать три типизированных значения, не СписокXDTO";
            КонецЕсли;
            Ожидания = СтрРазделить("A001,B002,C003", ",");
            Для Индекс = 0 По Значения.Количество() - 1 Цикл
                Элемент = Значения.Получить(Индекс);
                Если ТипЗнч(Элемент) <> Тип("ЗначениеXDTO")
                    Или Элемент.Тип() <> ТипЗначения.ТипЭлементаСписка
                    Или Элемент.Значение <> Ожидания[Индекс] Тогда
                    ВызватьИсключение "Потерян порядок или тип элемента собственного list";
                КонецЕсли;
            КонецЦикла;
            ОтказИндекса = Ложь;
            Попытка
                Значения.Получить(Значения.Количество());
            Исключение
                ОтказИндекса = Истина;
            КонецПопытки;
            Если Не ОтказИндекса Тогда
                ВызватьИсключение "Индекс count обязан быть за пределами собственного списка";
            КонецЕсли;
            ПроверитьОтказСвоегоЗначения85(Фабрика, ТипЗначения, "A001 wrong C003");
        ИначеЕсли Контракт.Значение = ВариантXDTO.Объединение Тогда
            Если ТипЗначения.ТипыЧленовОбъединения.Количество() <> 2 Тогда
                ВызватьИсключение "У нашей union объявлены только positiveInteger и Sku";
            КонецЕсли;
            Числовое = Фабрика.Создать(ТипЗначения, "3");
            Строковое = Фабрика.Создать(ТипЗначения, "A001");
            Если Числовое.Значение <> 3 Или Строковое.Значение <> "A001" Тогда
                ВызватьИсключение "Не подтверждены обе собственные ветви union";
            КонецЕсли;
            ПроверитьОтказСвоегоЗначения85(Фабрика, ТипЗначения, "0");
            ПроверитьОтказСвоегоЗначения85(Фабрика, ТипЗначения, "bad");
        Иначе
            ВызватьИсключение "В собственном контракте есть неизвестный вариант XDTO";
        КонецЕсли;
        Проверено = Проверено + 1;
    КонецЦикла;
    Если Проверено <> 3 Тогда
        ВызватьИсключение "Проверены не все три известные формы собственной XSD";
    КонецЕсли;
    Возврат "UUID " + Опыт.UUIDОпыта + ": SKU A001; list A001/B002/C003; union 3 и A001. Отказы a001, A01, wrong, 0, bad и индекса3 подтверждены";
КонецФункции

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 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(Фабрика, ТипЗначения, Лексема)
    Отказ = Ложь;
    Попытка
        Фабрика.Создать(ТипЗначения, Лексема);
    Исключение
        Отказ = Истина;
    КонецПопытки;
    Если Не Отказ Тогда
        ВызватьИсключение "Недопустимая собственная лексема ошибочно принята: " + Лексема;
    КонецЕсли;
КонецПроцедуры
Полный модуль собственной управляемой формы

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

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

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

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

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

  1. Запустите свою управляемую команду: пустой стенд проверяется до построения схемы; создается новый namespace UUID и пять конкретных типов.

  2. Сопоставление Sku/Атомарный, SkuList/Список, QtyOrSku/Объединение задано из нашей собственной XSD. У native ТипЗначенияXDTO нет свойства Вариант: такого обращения в коде нет.

  3. Для атомарного Sku создаем A001, проверяем фактический тип, значение и лексему. a001 не проходит pattern, A01 — length4.

  4. Для SkuList создаем одну list-лексему A001 B002 C003. Читаем ЗначениеXDTO.Список; это readonly КоллекцияЗначенийXDTO, не список повторных свойств объекта.

  5. Количество дает3; Получить(0), Получить(1), Получить(2) возвращают типизированные Sku в исходном порядке. Обращение Получить(Количество()) — проверяемая ошибка границ.

  6. Нельзя присваивать .Список, делать .Добавить/.Удалить на КоллекцияЗначенийXDTO. Чтобы поменять list, нужно заново создать допустимую лексему нужного типа.

  7. Union объявляет ровно2члена. 3 разбирается как положительное число; A001 — как Sku. 0 и bad не подходят ни одной из ветвей и обязаны дать отказ.

  8. Только после всех положительных и отрицательных проверок возвращается отчет UUID с проверенными значениями. Любой пропущенный отказ прерывает урок.

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

  1. В отчете три формы и ровно3элемента list A001/B002/C003; порядок и тип каждого элемента проверены.

  2. Все5неверных лексем и индекс3 отвергнуты; false-positive не маскируется сообщением об успехе.

  3. Enum используются в реальных трех ветвях собственного диспетчера; у непрозрачных сторонних типов форма не угадывается.

  4. Ни один readonly descriptor, список простых значений или enum не изменяется; операции только в памяти своей схемы.

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

При будущем ручном успешном запуске: A001, список A001/B002/C003, union3/A001 и подтвержденные отказы. До запуска это ожидаемый результат, не доказанный runtime.

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

  1. СписокXDTO представляет повторные свойства ОбъектXDTO; КоллекцияЗначенийXDTO представляет простое значение XSD list. Они не взаимозаменяемы.

  2. ВариантXDTO — перечисление, а не свойство ТипЗначенияXDTO. Здесь классификация известна из авторской схемы, не из несуществующего API.

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

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

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

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

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