Разобрать список кодов отдельно от одного кода

Учебные задачи

SkuList ссылается на Sku как тип элемента списка. Читаем QName и разрешённое определение, не путаем список со строкой одного кода.

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

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Каждый фрагмент выполните отдельно на сервере учебной базы. Полная собственная XSD включена в код; используются только namespace urn:guide:product и встроенные типы языка XSD.

  2. Sku описывает код, SkuList — список кодов, SkuOrQuantity — выбор допустимого типа значения. Product и Price — разные составные типы.

  3. Нет DTD, include/import, чтения или записи файла и сетевого доступа. НаборСхемXML.Проверить проверяет собственную схему, не XML-экземпляр товара.

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:simpleType name=""SkuList""><xs:list itemType=""g:Sku""/></xs:simpleType>
| <xs:simpleType name=""SkuOrQuantity""><xs:union memberTypes=""g:Sku xs:nonNegativeInteger""/></xs:simpleType>
| <xs:complexType name=""Price""><xs:simpleContent>
|  <xs:annotation><xs:documentation source=""urn:guide:price-content"">Цена — число с атрибутом валюты</xs:documentation></xs:annotation>
|  <xs:extension base=""xs:decimal"">
|   <xs:annotation><xs:documentation source=""urn:guide:price-extension"">Расширение простого decimal</xs:documentation></xs:annotation>
|   <xs:attribute name=""currency"" type=""xs:string"" default=""RUB""/>
|  </xs:extension>
| </xs:simpleContent></xs:complexType>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
    ЧтениеДерева = Новый ПостроительDOM;
    ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
    Чтение.Закрыть();
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
    ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
    ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
ТипСписка = Схема.ОпределенияТипов.Получить("SkuList", "urn:guide:product");
Если ТипСписка = Неопределено Тогда
    ВызватьИсключение "В собственной схеме не найден тип SkuList";
КонецЕсли;
Если ТипЗнч(ТипСписка) <> Тип("ОпределениеПростогоТипаXS") Тогда
    ВызватьИсключение "У SkuList другой вид определения типа";
КонецЕсли;
Сообщить(ТипСписка.Вариант = ВариантПростогоТипаXS.Список);
ИмяЭлемента = ТипСписка.ИмяТипаЭлемента;
Если ИмяЭлемента = Неопределено Тогда
    ВызватьИсключение "У собственного списка нет itemType";
КонецЕсли;
Сообщить(ИмяЭлемента.URIПространстваИмен = "urn:guide:product");
Сообщить(ИмяЭлемента.ЛокальноеИмя = "Sku");
ТипЭлемента = ТипСписка.ОпределениеТипаЭлемента;
Если ТипЭлемента = Неопределено Тогда
    ВызватьИсключение "Не разрешён собственный itemType Sku";
КонецЕсли;
Сообщить(ТипЭлемента.Имя = "Sku");
Сообщить(ТипЭлемента.Вариант = ВариантПростогоТипаXS.Атомарная);
Сообщить(ТипСписка.Фасеты.Количество() = 0);
Сообщить("Лексическая запись двух кодов: A001 B002");

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

  1. Получить получает имя и URI namespace; два типа с одинаковым коротким именем в разных пространствах не равны.

  2. Вариант Список отличает list от restriction атомарного типа.

  3. ИмяТипаЭлемента содержит QName itemType; ОпределениеТипаЭлемента — связанное определение Sku.

  4. В данном списке нет собственных фасетов длины списка. Фасеты длины 4 у Sku относятся к каждому коду, не числу кодов.

  5. Сообщение A001 B002 поясняет лексическую запись; оно не объявляется результатом проверки XML-экземпляра.

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

  1. Шесть сообщений Истина и строка о записи A001 B002.

  2. Тип списка — Список, тип его элемента — Атомарная.

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

QName элемента списка связан с собственным определением Sku.

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

  1. Не разделяйте список кодов запятыми без контракта: XSD list использует пробельные разделители.

  2. Чтение определения списка само по себе не проверяет присланную строку.

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

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

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

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

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