Тип значения является списком.
Полное описание, параметры и ограничения
ВариантXDTO.Список (XDTOVariety.List)
ВариантXDTO (XDTOVariety)
Список (List)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип значения является списком.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Три формы XDTO: артикул, список артикулов и число либо артикул
Из собственной XSD строим реальные простые типы, диспетчеризуем три известные формы ВариантXDTO и разбираем readonly КоллекцияЗначенийXDTO. Это не формальный getter и не попытка угадать устройство чужого типа.
Где и как запускать
Полный серверный общий модуль УчебныеXDTO85, отдельная пустая файловая ИБ8.5.1.1343; клиентская форма — только launcher. Runtime0.
Подготовка
Не открывайте УНФ, КА2, БП или УТ: создайте отдельную новую пустую файловую ИБ на платформе ровно8.5.1.1343. Пример не предназначен для production и не меняет конфигурации пользователя.
В Конфигураторе установите имя корня конфигурации УчебныеСкалярныеXDTO85, управляемое приложение и совместимость Не использовать. В конфигурации не должно быть справочников, документов, регистров, общих реквизитов, фоновых заданий, подписок или внешних источников.
Не устанавливайте расширения ни в базу, ни в сеанс. Полный ПроверитьСвойПустойСтенд в каждом основном модуле проверяет все три native-источника расширений, отсутствие активной транзакции.
Создайте общий модуль УчебныеXDTO85: СерверИстина, ВызовСервераЛожь, ГлобальныйЛожь, Клиент(управляемое приложение)Ложь, Клиент(обычное приложение)Ложь, ВнешнееСоединениеЛожь, ПривилегированныйЛожь. Поместите весь основной код этого урока в этот пустой модуль.
Создайте обработку УчебныеXDTO85 с собственной основной управляемой формой. Добавьте команду Выполнить, обработчик Выполнить и кнопку на форме. Поместите полный вспомогательный модуль формы из этого урока; он передаёт только итоговую строку, не фабрику/DOM/XDTO-объект между клиентом и сервером.
Уроки самостоятельны: для следующего урока замените весь собственный общий модуль соответствующим полным основным кодом. Одновременное склеивание модулей с одинаковым ВыполнитьПример85 запрещено.
UUID создается локально для каждого опыта. URI urn:guide:xdto-scalars85:<UUID> и дополнительный URI с :extra — имена пространств, не URL. Схема, DOM, фабрика и XML создаются лишь в памяти: нет import/include, DTD, чтения файлов, сети, обращения к базам или глобальной ФабрикаXDTO конфигурации.
Собственная XSD полностью включена в код: Sku — строка ровно4символа с прописной латинской буквой и3цифрами; SkuList — список Sku; QtyOrSku — union positiveInteger/Sku; Envelope — открытая wildcard-структура; Closed — закрытая структура.
Обновите только свою учебную конфигурацию базы данных. Запустите собственную обработку в тонком управляемом клиенте; API построения схем выполняется на серверном контексте файловой ИБ, а не в клиентском модуле.
Это подготовленный пример, проверенный статически и по установленной справке. Фактических запусков 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();
КонецФункцииРазбор по шагам
Запустите свою управляемую команду: пустой стенд проверяется до построения схемы; создается новый namespace UUID и пять конкретных типов.
Сопоставление Sku/Атомарный, SkuList/Список, QtyOrSku/Объединение задано из нашей собственной XSD. У native ТипЗначенияXDTO нет свойства Вариант: такого обращения в коде нет.
Для атомарного Sku создаем A001, проверяем фактический тип, значение и лексему. a001 не проходит pattern, A01 — length4.
Для SkuList создаем одну list-лексему A001 B002 C003. Читаем ЗначениеXDTO.Список; это readonly КоллекцияЗначенийXDTO, не список повторных свойств объекта.
Количество дает3; Получить(0), Получить(1), Получить(2) возвращают типизированные Sku в исходном порядке. Обращение Получить(Количество()) — проверяемая ошибка границ.
Нельзя присваивать .Список, делать .Добавить/.Удалить на КоллекцияЗначенийXDTO. Чтобы поменять list, нужно заново создать допустимую лексему нужного типа.
Union объявляет ровно2члена. 3 разбирается как положительное число; A001 — как Sku. 0 и bad не подходят ни одной из ветвей и обязаны дать отказ.
Только после всех положительных и отрицательных проверок возвращается отчет UUID с проверенными значениями. Любой пропущенный отказ прерывает урок.
Как проверить результат
В отчете три формы и ровно3элемента list A001/B002/C003; порядок и тип каждого элемента проверены.
Все5неверных лексем и индекс3 отвергнуты; false-positive не маскируется сообщением об успехе.
Enum используются в реальных трех ветвях собственного диспетчера; у непрозрачных сторонних типов форма не угадывается.
Ни один readonly descriptor, список простых значений или enum не изменяется; операции только в памяти своей схемы.
Ожидаемый результат
При будущем ручном успешном запуске: A001, список A001/B002/C003, union3/A001 и подтвержденные отказы. До запуска это ожидаемый результат, не доказанный runtime.
На что обратить внимание
СписокXDTO представляет повторные свойства ОбъектXDTO; КоллекцияЗначенийXDTO представляет простое значение XSD list. Они не взаимозаменяемы.
ВариантXDTO — перечисление, а не свойство ТипЗначенияXDTO. Здесь классификация известна из авторской схемы, не из несуществующего API.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.