СписокКомпонентXS.Очистить

Методы · Clear

Очищает список компонентов.

Синтаксис

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

СписокКомпонентXS.Очистить (XSComponentList.Clear)

СписокКомпонентXS (XSComponentList)

Очистить (Clear)

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

Синтаксис:
Очистить()
Описание:

Очищает список компонентов.

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

Сервер, толстый клиент, внешнее соединение.

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

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

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

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

Изменять отдельные копии модели, фрагмента и атрибута

После сборки preview создаются три независимые рекурсивные копии его частей. Исходная группа, обязательность label и валюта RUB сохраняются.

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

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

Подготовка

  1. Выполните каждый полный модуль отдельно на сервере учебной базы. Вызовите ВыполнитьПример(); функция чтения схемы включена ниже в том же модуле.

  2. Схема включена строкой. note — учебное примечание, currency — фиксированная валюта, wrapper содержит ссылки на них. Обмен и рабочие объекты не используются.

  3. Нет DTD, импорта, файлов, сети или записи данных базы. Проверить проверяет XSD, а не XML-экземпляр товара.

  4. Имена и namespace берите из собственной схемы. Не заменяйте их случайным узлом внешнего сервиса.

Процедура ВыполнитьПример() Экспорт
    ТекстXSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:declarations"" targetNamespace=""urn:guide:declarations"" elementFormDefault=""qualified"" attributeFormDefault=""unqualified""><xs:element name=""note"" type=""xs:string"" default=""Без примечания"" nillable=""true""><xs:annotation><xs:documentation xml:lang=""ru"">Учебное примечание</xs:documentation></xs:annotation></xs:element><xs:attribute name=""currency"" type=""xs:string"" fixed=""RUB""><xs:annotation><xs:documentation xml:lang=""ru"">Учебная валюта</xs:documentation></xs:annotation></xs:attribute><xs:element name=""wrapper""><xs:complexType><xs:sequence><xs:element ref=""g:note""><xs:annotation><xs:documentation>Ссылка на примечание</xs:documentation></xs:annotation></xs:element></xs:sequence><xs:attribute ref=""g:currency"" use=""optional""><xs:annotation><xs:documentation>Использование валюты</xs:documentation></xs:annotation></xs:attribute></xs:complexType></xs:element></xs:schema>";
    Схема = ПрочитатьСвоюСхему(ТекстXSD);
    Набор = Новый НаборСхемXML;
    Набор.Добавить(Схема);
    Если Не Набор.Проверить() Тогда
        ВызватьИсключение "Исходная собственная XSD не прошла проверку";
    КонецЕсли;
    НоваяМетка = Новый ОбъявлениеЭлементаXS;
    НоваяМетка.Имя = "label";
    НоваяМетка.ИмяТипа = Новый РасширенноеИмяXML("http://www.w3.org/2001/XMLSchema", "string");
    НоваяМетка.Форма = ФормаПредставленияXS.Квалифицированная;
    ФрагментМетки = Новый ФрагментXS;
    ФрагментМетки.МинимальноВходит = 1;
    ФрагментМетки.МаксимальноВходит = 1;
    ФрагментМетки.Часть = НоваяМетка;
    Группа = Новый ГруппаМоделиXS;
    Группа.ВидГруппы = ВидГруппыМоделиXS.Последовательность;
    Группа.Фрагменты.Добавить(ФрагментМетки);
    ФрагментГруппы = Новый ФрагментXS;
    ФрагментГруппы.МинимальноВходит = 1;
    ФрагментГруппы.МаксимальноВходит = 1;
    ФрагментГруппы.Часть = Группа;
    НоваяВалюта = Новый ОбъявлениеАтрибутаXS;
    НоваяВалюта.Имя = "currency";
    НоваяВалюта.ИмяТипа = Новый РасширенноеИмяXML("http://www.w3.org/2001/XMLSchema", "string");
    НоваяВалюта.Форма = ФормаПредставленияXS.Неквалифицированная;
    ИспользованиеВалюты = Новый ИспользованиеАтрибутаXS;
    ИспользованиеВалюты.ОбъявлениеАтрибута = НоваяВалюта;
    ИспользованиеВалюты.Использование = КатегорияИспользованияАтрибутаXS.НеОбязательно;
    ИспользованиеВалюты.Ограничение = ОграничениеЗначенияXS.Фиксированное;
    ИспользованиеВалюты.ЛексическоеЗначение = "RUB";
    НовыйТип = Новый ОпределениеСоставногоТипаXS;
    НовыйТип.МодельСодержимого = МодельСодержимогоXS.Составная;
    НовыйТип.Содержимое = ФрагментГруппы;
    НовыйТип.Атрибуты.Добавить(ИспользованиеВалюты);
    НовыйКорень = Новый ОбъявлениеЭлементаXS;
    НовыйКорень.Имя = "preview";
    НовыйКорень.АнонимноеОпределениеТипа = НовыйТип;
    Схема.Содержимое.Добавить(НовыйКорень);
    Схема.ОбновитьЭлементDOM();
    Если Не Набор.Проверить() Тогда
        ВызватьИсключение "Составная собственная XSD не прошла проверку";
    КонецЕсли;
    КопияГруппы = Группа.КлонироватьКомпоненту(Истина);
    Если ТипЗнч(КопияГруппы) <> Тип("ГруппаМоделиXS") Или КопияГруппы.Фрагменты.Количество() <> 1 Тогда
        ВызватьИсключение "Не получена копия собственной группы";
    КонецЕсли;
    КопияГруппы.Фрагменты.Очистить();
    Сообщить(КопияГруппы.Фрагменты.Количество() = 0);
    Сообщить(Группа.Фрагменты.Количество() = 1);
    КопияФрагмента = ФрагментМетки.КлонироватьКомпоненту(Истина);
    Если ТипЗнч(КопияФрагмента) <> Тип("ФрагментXS") Или ТипЗнч(КопияФрагмента.Часть) <> Тип("ОбъявлениеЭлементаXS") Тогда
        ВызватьИсключение "Не получена копия фрагмента с элементом";
    КонецЕсли;
    КопияФрагмента.МинимальноВходит = 0;
    КопияФрагмента.Часть.Имя = "labelCopy";
    Сообщить(КопияФрагмента.МинимальноВходит = 0 И КопияФрагмента.Часть.Имя = "labelCopy");
    Сообщить(ФрагментМетки.МинимальноВходит = 1 И НоваяМетка.Имя = "label");
    КопияИспользования = ИспользованиеВалюты.КлонироватьКомпоненту(Истина);
    Если ТипЗнч(КопияИспользования) <> Тип("ИспользованиеАтрибутаXS") Или КопияИспользования.ОбъявлениеАтрибута = Неопределено Тогда
        ВызватьИсключение "Не получена копия локального использования атрибута";
    КонецЕсли;
    КопияИспользования.ЛексическоеЗначение = "USD";
    КопияИспользования.ОбъявлениеАтрибута.Имя = "currencyCopy";
    Сообщить(КопияИспользования.Содержит(КопияИспользования.ОбъявлениеАтрибута));
    Сообщить(ИспользованиеВалюты.ЛексическоеЗначение = "RUB" И НоваяВалюта.Имя = "currency");
    Сообщить(Набор.Проверить());КонецПроцедуры

Функция ПрочитатьСвоюСхему(ТекстXSD)
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(ТекстXSD);
    Попытка
        ПостроительДерева = Новый ПостроительDOM;
        ДокументСхемы = ПостроительДерева.Прочитать(Чтение);
        Чтение.Закрыть();
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    ПостроительСхем = Новый ПостроительСхемXML;
    Результат = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
    Если Результат = Неопределено Тогда
        ВызватьИсключение "Не построена собственная схема";
    КонецЕсли;
    Возврат Результат;
КонецФункции

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

  1. Исходная preview собирается точно как в предыдущем уроке и проходит проверку.

  2. Рекурсивная копия ГруппаМоделиXS имеет собственные фрагменты. Очистить применяется только к коллекции копии, а исходный фрагмент остаётся.

  3. Копия ФрагментXS получает minOccurs=0 и другое локальное имя своего элемента; исходные 1 и label не меняются.

  4. Копия локального ИспользованиеАтрибутаXS получает USD и currencyCopy. Это не копирование глобального ref и не изменение общей валюты схемы.

  5. Ни одна из трёх копий не присоединяется к XSD. Повторная проверка исходного набора подтверждает сохранение собственной схемы.

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

  1. Семь сообщений Истина; в исходной preview по-прежнему обязательная label и фиксированная RUB.

  2. Отдельные копии являются черновиками: их не следует объявлять новыми действующими типами основной схемы.

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

Рекурсивные копии собственных частей изменяются без изменения исходной модели.

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

  1. Не применяйте Очистить к исходной Группа.Фрагменты.

  2. Изолированная копия фрагмента ещё не становится валидной глобальной XSD.

  3. ЯвляетсяПодмножеством не вызывается: в локальной справке отсутствует параметр сравниваемого фрагмента, сигнатуру не угадываем.

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

Собрать новый диапазон цены из четырёх компонентов XSD

Меняем только собственную модель в памяти: вместо максимума 9999.99 задаём 99.99. Новые фасеты создаются конструкторами и присоединяются к Price до повторной проверки схемы.

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

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

Подготовка

  1. Схема создана из собственной строки. Не подменяйте Набор пакетом XDTO реальной конфигурации.

  2. Очистить вызывается только для фасетов собственного Price. Остальные типы Discount/Status/Description не меняются.

XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema""
| xmlns:g=""urn:guide:limits"" targetNamespace=""urn:guide:limits"">
| <xs:simpleType name=""Price""><xs:restriction base=""xs:decimal"">
|  <xs:minInclusive value=""0""/><xs:maxInclusive value=""9999.99""/>
|  <xs:totalDigits value=""6""/><xs:fractionDigits value=""2""/>
| </xs:restriction></xs:simpleType>
| <xs:simpleType name=""Discount""><xs:restriction base=""xs:decimal"">
|  <xs:minExclusive value=""0""/><xs:maxExclusive value=""1""/>
| </xs:restriction></xs:simpleType>
| <xs:simpleType name=""Status""><xs:restriction base=""xs:string"">
|  <xs:whiteSpace value=""collapse""/>
|  <xs:enumeration value=""draft""/><xs:enumeration value=""published""/>
|  <xs:enumeration value=""closed""/>
| </xs:restriction></xs:simpleType>
| <xs:simpleType name=""Description""><xs:restriction base=""xs:string"">
|  <xs:minLength value=""3""/><xs:maxLength value=""20""/>
| </xs:restriction></xs:simpleType>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
    Документ = Новый ПостроительDOM;
    DOM = Документ.Прочитать(Чтение);
    Чтение.Закрыть();
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(DOM.ЭлементДокумента);
Если Схема = Неопределено Тогда
    ВызватьИсключение "Не построена собственная схема ограничений";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
    ВызватьИсключение "Не прошла проверка собственной схемы";
КонецЕсли;
Фабрика = Новый ФабрикаXDTO(Набор);
Определение = Схема.ОпределенияТипов.Получить("Price", "urn:guide:limits");
Минимум = Новый ФасетМинимальногоВключающегоЗначенияXS;
Минимум.ЛексическоеЗначение = "0";
Максимум = Новый ФасетМаксимальногоВключающегоЗначенияXS;
Максимум.ЛексическоеЗначение = "99.99";
Разрядов = Новый ФасетОбщегоКоличестваРазрядовXS;
Разрядов.ЛексическоеЗначение = "6";
Дробных = Новый ФасетКоличестваРазрядовДробнойЧастиXS;
Дробных.ЛексическоеЗначение = "2";
Определение.Фасеты.Очистить();
Определение.Фасеты.Добавить(Минимум);
Определение.Фасеты.Добавить(Максимум);
Определение.Фасеты.Добавить(Разрядов);
Определение.Фасеты.Добавить(Дробных);
Сообщить(Определение.Фасеты.Количество() = 4);
Сообщить(Максимум.ОпределениеПростогоТипа.Имя = "Price");
Сообщить(Максимум.Значение = 99.99);
Если Не Набор.Проверить() Тогда
    ВызватьИсключение "Изменённая собственная схема не прошла проверку";
КонецЕсли;
// Старая фабрика не обновляется автоматически вслед за изменением XSD.
НоваяФабрика = Новый ФабрикаXDTO(Набор);
ТипЦены = НоваяФабрика.Тип("urn:guide:limits", "Price");
ГраничнаяЦена = НоваяФабрика.Создать(ТипЦены, "99.99");
Сообщить(ГраничнаяЦена.Значение = 99.99);
Отклонено = Ложь;
Попытка
    СлишкомДорого = НоваяФабрика.Создать(ТипЦены, "100");
Исключение
    Отклонено = Истина;
    Сообщить("Ожидаемое отклонение цены 100");
КонецПопытки;
Если Не Отклонено Тогда
    ВызватьИсключение "Новый максимум 99.99 не применён к модели";
КонецЕсли;

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

  1. Конструкторы создают четыре самостоятельных компонента ограничения.

  2. ЛексическоеЗначение задаётся в формате XML: точка у десятичного числа, без региональных разделителей групп.

  3. После добавления в Фасеты компоненты принадлежат определению Price; его десятичный базовый тип позволяет интерпретировать 99.99 как число.

  4. Повторная проверка проверяет изменённую схему, не конкретную цену.

  5. Создаём новую фабрику из изменённого набора. Старая Фабрика из подготовки остаётся прежней моделью и не используется для проверки нового диапазона.

  6. 99.99 допустимо; 100 должно быть отклонено. Если ограничения не действуют, пример явно сообщает ошибку.

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

  1. Четыре новых фасета; максимум принадлежит Price и имеет числовое значение 99.99.

  2. Граничная цена создаётся, 100 отклоняется.

  3. В конфигураторе и на диске ничего не меняется: работа только с собственным набором в памяти.

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

Конструкторы фасетов использованы для реального изменения собственного контракта и проверки новой границы цены.

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

  1. Установка ЛексическоеЗначение на отдельном компоненте ещё не означает, что ограничение вошло в тип: его нужно присоединить.

  2. Не очищайте фасеты чужой схемы — это может снять необходимые ограничения.

  3. Изменение XSD не обновляет уже созданную фабрику автоматически.

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

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

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

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

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