РасширенноеИмяXML.По умолчанию

Конструкторы

Создает экземпляр расширенного имени XML.

Синтаксис

Новый РасширенноеИмяXML(<URIПространстваИмен>, <ЛокальноеИмя>)
Полное описание, параметры и ограничения

РасширенноеИмяXML.По умолчанию

РасширенноеИмяXML (XMLExpandedName)

По локальному имени и URI пространства имен

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

Синтаксис:
Новый РасширенноеИмяXML(<URIПространстваИмен>, <ЛокальноеИмя>)
Параметры:

<URIПространстваИмен> (обязательный)
Тип: Строка.
URI пространства имен.

<ЛокальноеИмя> (обязательный)
Тип: Строка.
Локальное имя.
Описание:

Создает экземпляр расширенного имени XML.

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

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

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

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

Синтаксис разыменования определения типа собственной XSD-схемы

Ограниченный образец именно опубликованной двухаргументной сигнатуры: справка дублирует имя аргумента.

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

Сервер или толстый клиент; ограниченный синтаксис XSD.

Подготовка

  1. Сервер или толстый клиент. Создается собственный черновик XSD с именованным простым типом, без чтения внешней схемы. Это не полный валидный бизнес-формат.

Схема = Новый СхемаXML;
Определение = Новый ОпределениеПростогоТипаXS;
Определение.Имя = "Цена";
Схема.Содержимое.Добавить(Определение);
Имя = Новый РасширенноеИмяXML("", "Цена");
Найдено = Схема.РазрешитьОпределениеТипа(Имя, Имя);
Сообщить("Полученное определение: " + Строка(Найдено));

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

  1. Добавьте собственное именованное определение.

  2. Создайте расширенное имя в пустом пространстве имен.

  3. Проверьте опубликованный вызов в своей платформе.

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

  1. Ожидаемый объект должен соответствовать собственному определению Цена.

  2. Если платформа отвергает два аргумента, не объявляйте это успешным поиском.

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

Образец опубликованной сигнатуры на собственных объектах с явно указанным пробелом документации.

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

  1. Страница РазрешитьОпределениеТипа дважды перечисляет Имя типа РасширенноеИмяXML без объяснения различия. Одинаковые аргументы здесь показывают синтаксис, не доказывают роль второго. Проверка в целевой платформе обязательна; это не проверенный автономный поиск.

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

Отредактировать memberTypes своей XSD, не путать QName со строкой

У настоящего union собственной схемы получим коллекцию расширенных имён, пройдём её жизненный цикл и проверим всю схему после правки.

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

Полный модуль управляемой формы ПультXML своего стенда; собственная XSD в памяти, без реквизитов предыдущих Пультов.

Подготовка

  1. Создайте НОВУЮ отдельную файловую базу платформы 8.5.1.1343 с конфигурацией УчебныеДанныеФорм85, совместимость НеИспользовать, управляемое приложение. Не используйте УТ, КА, УНФ, БП или рабочую базу. Здесь 1С не запускалась: runtimeVerifiedScenarios=0.

  2. Используйте свою обработку УчебныеДанные85 с новой пустой управляемой формой ПультXML без основного реквизита. Вручную добавьте только команду Выполнить и её кнопку; реквизиты и таблицы предыдущих уроков не нужны.

  3. Назначьте событие ПриСозданииНаСервере одноимённой процедуре, действию команды Выполнить — процедуру Выполнить. Вставьте полный модуль целиком, F7 и обновление только своего стенда.

  4. Полная XSD включена в модуль строкой: namespace urn:guide:product, код Sku по правилу [A-Z][0-9]{3}, union SkuOrQuantity с Sku и nonNegativeInteger. Не добавляйте DTD, include/import или адреса внешней схемы.

  5. Откройте свой ПультXML в тонком или управляемом толстом клиенте. Весь разбор/редактирование выполняется на сервере в памяти; клиент получает только итоговую строку. Файлы, HTTP, база и XDTO-объекты товара не создаются.

  6. Промежуточный пустой/экспериментальный union не проверяется и не публикуется. Набор.Проверить вызывается только для исходной полной и окончательной восстановленной схемы. Здесь 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: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 не прошла проверку";
    КонецЕсли;
    ТипОбъединения = Схема.ОпределенияТипов.Получить("SkuOrQuantity", "urn:guide:product");
    Если ТипОбъединения = Неопределено Тогда
        ВызватьИсключение "В собственной схеме не найден тип SkuOrQuantity";
    КонецЕсли;
    Если ТипЗнч(ТипОбъединения) <> Тип("ОпределениеПростогоТипаXS") Тогда
        ВызватьИсключение "У SkuOrQuantity другой вид определения типа";
    КонецЕсли;
    Имена = ТипОбъединения.ИменаТиповОбъединения;
    Если ТипЗнч(Имена) <> Тип("СписокРасширенныхИменXML") Или ТипОбъединения.Вариант <> ВариантПростогоТипаXS.Объединение Тогда
        ВызватьИсключение "Нужен настоящий список memberTypes собственного union";
    КонецЕсли;
    Имена.Очистить();
    Если Имена.Количество() <> 0 Тогда
        ВызватьИсключение "Своя коллекция должна стать пустой";
    КонецЕсли;
    URIЯзыкаXSD = "http://www.w3.org/2001/XMLSchema";
    Имена.Добавить(Новый РасширенноеИмяXML(URIЯзыкаXSD, "string"));
    Имена.Добавить(Новый РасширенноеИмяXML(URIЯзыкаXSD, "nonNegativeInteger"));
    Имена.Вставить(1, Новый РасширенноеИмяXML(URIЯзыкаXSD, "boolean"));
    Если Имена.Количество() <> 3 Или Имена[1].ЛокальноеИмя <> "boolean" Тогда
        ВызватьИсключение "Временный boolean должен находиться между string и nonNegativeInteger";
    КонецЕсли;
    ПервоеИмя = Имена.Получить(0);
    Если ТипЗнч(ПервоеИмя) <> Тип("РасширенноеИмяXML")
        Или ПервоеИмя.URIПространстваИмен <> URIЯзыкаXSD Или ПервоеИмя.ЛокальноеИмя <> "string" Тогда
        ВызватьИсключение "Имя XML — это пара URI и локального имени, не строка с префиксом";
    КонецЕсли;
    Имена.Установить(0, Новый РасширенноеИмяXML("urn:guide:product", "Sku"));
    Если Имена.Количество() <> 3 Или Имена.Получить(0).ЛокальноеИмя <> "Sku" Тогда
        ВызватьИсключение "Установить заменяет существующий элемент, не вставляет четвёртый";
    КонецЕсли;
    Имена.Удалить(1);
    Если Имена.Количество() <> 2 Или Имена[1].ЛокальноеИмя <> "nonNegativeInteger" Тогда
        ВызватьИсключение "Удалён только временный boolean по числовому индексу";
    КонецЕсли;
    ПарыИмен = Новый Массив;
    Для Каждого ИмяТипа Из Имена Цикл
        ПарыИмен.Добавить(ИмяТипа.URIПространстваИмен + "#" + ИмяТипа.ЛокальноеИмя);
    КонецЦикла;
    Если СтрСоединить(ПарыИмен, ";") <> "urn:guide:product#Sku;http://www.w3.org/2001/XMLSchema#nonNegativeInteger" Тогда
        ВызватьИсключение "Проверяется собственный явно построенный порядок и обе части QName";
    КонецЕсли;
    Схема.ОбновитьЭлементDOM();
    Если Не Набор.Проверить() Тогда
        ВызватьИсключение "После правки собственного memberTypes весь набор схем должен остаться корректным";
    КонецЕсли;
    Возврат "Своя XSD проверена: union Sku или nonNegativeInteger. Временный boolean удалён; шесть операций коллекции выполнены только в памяти.";
КонецФункции

&НаСервереБезКонтекста
Процедура ПроверитьСвойКонтекст()
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужен собственный стенд УчебныеДанныеФорм85 платформы 8.5.1.1343";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
    КонецЕсли;
КонецПроцедуры

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

  1. Переиспользуется полный подготовленный контракт товара. ЧтениеXML получает строку, закрывается при успехе и исключении; DOM и ПостроительСхемXML создают настоящую схему, исходный НаборСхемXML проверяется.

  2. SkuOrQuantity ищется по имени И URI. Проверяется ОпределениеПростогоТипаXS с Вариант=Объединение. ИменаТиповОбъединения — readonly-свойство, но его собственная возвращённая коллекция изменяема; выдуманного конструктора СписокРасширенныхИменXML нет.

  3. Очистить удаляет элементы своего memberTypes, а не определения Sku/Product в общей схеме. После очистки ноль; до сборки нового списка схема может быть временно некорректной, это не конечный результат.

  4. Добавить принимает готовый РасширенноеИмяXML. Порядок конструктора URI, затем локальное имя; строка xs:string не является объектом расширенного имени. HTTP-подобный URI здесь идентификатор языка, не сетевой запрос.

  5. Вставить(1, boolean) помещает временный QName между string и nonNegativeInteger. Получить(0) читает объект, [1] читает другой по индексу; перед доступом проверен размер.

  6. Установить(0, Sku) заменяет string, не добавляя элемент. Новый Sku использует urn:guide:product, а не namespace языка XSD; локального имени без URI недостаточно.

  7. Удалить(1) принимает числовой индекс и удаляет только временный boolean. Итоговый список из двух QName обходится циклом; порядок здесь известен, потому что его построили мы, а не предположили порядок исходной схемы.

  8. ОбновитьЭлементDOM синхронизирует компонентную модель и DOM. Повторный Набор.Проверить подтверждает корректность набора схем, не проверяет XML-экземпляр товара или строку кода A001.

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

  1. Будущий тест: F7 → ПультXML → Выполнить. Временный размер 3 после Вставить, тот же 3 после Установить, итоговый 2 после Удалить.

  2. Первый QName сначала {http://www.w3.org/2001/XMLSchema}string, после замены {urn:guide:product}Sku. Не сравнивайте только представление префикса.

  3. Итоговые пары строго Sku из urn:guide:product и nonNegativeInteger из namespace языка XSD. boolean отсутствует.

  4. Обе проверки полного набора схем должны пройти. Если повторная проверка возвращает Ложь, сообщение об успешном результате не выводится.

  5. Нажмите повторно: полная XSD строится заново, изменения прошлого набора не накапливаются. Исходные уроки и строковый контракт не изменяются.

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

Будущий результат: шесть операций настоящей коллекции QName на собственной схеме; окончательный memberTypes=Sku/nonNegativeInteger и повторная проверка схемы.

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

  1. Readonly у свойства ИменаТиповОбъединения запрещает переприсваивать коллекцию, но не её документированные операции. URIПространстваИмен и ЛокальноеИмя отдельного QName тоже readonly: для замены создаётся новое имя.

  2. Union означает альтернативу типов, не два поля объекта и не список значений. Список имён компонентов не равен списку экземпляров данных.

  3. Очистить/Удалить меняют только свою схему в памяти. Нет записи XSD на диск, публикации контракта или изменения внешнего API.

  4. Проверка набора схем и статические проверки кода не доказывают испытание XML-экземпляра или запуск урока в 1С. runtimeVerifiedScenarios=0.

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

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

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

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

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