СписокРасширенныхИменXML.Установить

Методы · Set

Устанавливает расширенное имя XML в коллекцию по указанному индексу.

Синтаксис

Установить(<Индекс>, <Имя>)
Полное описание, параметры и ограничения

СписокРасширенныхИменXML.Установить (XMLExpandedNameList.Set)

СписокРасширенныхИменXML (XMLExpandedNameList)

Установить (Set)

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

Синтаксис:
Установить(<Индекс>, <Имя>)
Параметры:

<Индекс> (обязательный)
Тип: Число.
Индекс - позиция для установки имени.

<Имя> (обязательный)
Тип: РасширенноеИмяXML.
Устанавливаемое расширенное имя XML.
Описание:

Устанавливает расширенное имя XML в коллекцию по указанному индексу.

Доступность:

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

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

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

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

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

Отредактировать 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С» и не аффилирован с ней.