ГруппаЭлементовОтбораКомпоновкиДанных.ИдентификаторПользовательскойНастройки

Свойства · UserSettingID

Тип: Строка. Предназначен для идентификации пользовательской настройки. Если идентификатор не пустой, объект включается в состав пользовательских настроек.

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

ГруппаЭлементовОтбораКомпоновкиДанных.ИдентификаторПользовательскойНастройки (DataCompositionFilterItemGroup.UserSettingID)

ГруппаЭлементовОтбораКомпоновкиДанных (DataCompositionFilterItemGroup)

ИдентификаторПользовательскойНастройки (UserSettingID)

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

Использование:
Чтение и запись.
Описание:
Тип: Строка.
Предназначен для идентификации пользовательской настройки.
Если идентификатор не пустой, объект включается в состав пользовательских настроек.
Доступность:

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

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

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

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

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

Вложенная группа отбора: родитель, пользовательский флаг и реальные строки

Создаем свой отбор (Сумма>0) И (Сумма>100 ИЛИ Количество>2). Проверяем настоящих родителей основных групп, отдельно выносим вложенную группу в пользовательский состав и выключаем/включаем ее без чтения недоступных вложенных свойств.

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

Полный серверный общий модуль собственного нового стенда УчебныеГруппыНастроек85; каждый урок запускается отдельно.

Подготовка

  1. Создать НОВУЮ отдельную пустую учебную базу, не рабочую и не ее копию: точно8.5.1.1343; конфигурация УчебныеГруппыНастроек85, совместимость Не использовать. Без бизнес-объектов, регистров, подписок, заданий и расширений.

  2. Конфигуратор → Общие → Общие модули → УчебныеГруппыНастроек85: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставить ВЕСЬ код одного выбранного урока. Одноименные ВыполнитьПример разных уроков не смешивать.

  3. Конфигуратор → Обработки → УчебныеГруппыНастроек85 → Формы → Пульт: управляемая форма, команда Выполнить и кнопка с этой командой; действие команды Выполнить. Полный модуль формы дан отдельно ниже; реквизиты не нужны.

  4. Сохранить и обновить собственную конфигурацию базы данных (F7). Запустить свежий свой клиент и открыть учебную обработку. Это будущие ручные шаги: здесь F7 и1С не запускались.

  5. Схема полностью создается в памяти: Local-запрос Книга3×250=750 / Ручка1×50=50. Никаких записей справочников, документов или регистров не нужно.

  6. Редактор обязательно связывается с настоящим источником доступных настроек. Пользовательский объект ищется в его реальной коллекции по своему ID и проверяется по точному типу.

  7. В опыте выбранных полей используется стандартный генератор табличного документа. Проверка координат рассчитана только на эту собственную маленькую таблицу без ресурсов, итоговых строк, других групп и макетов оформления.

  8. runtimeVerifiedScenarios=0. Выполнены только статические проверки установленной справки и HTML. XML хранится строками памяти: файлов, архивов, резервных копий, сети, печати и production здесь нет.

Функция ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    Схема = Новый СхемаКомпоновкиДанных;
    ЗаполнитьСвоиДанные(Схема);
    ЗаполнитьСвоиНачальныеНастройки(Схема.НастройкиПоУмолчанию);
    КорневаяГруппа = Схема.НастройкиПоУмолчанию.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
    КорневаяГруппа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
    КорневаяГруппа.Использование = Истина;
    Если КорневаяГруппа.Родитель <> Неопределено Тогда
        ВызватьИсключение "Основная верхнеуровневая группа не должна иметь родительскую группу";
    КонецЕсли;
    ФиксированноеУсловие = КорневаяГруппа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ФиксированноеУсловие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сумма");
    ФиксированноеУсловие.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
    ФиксированноеУсловие.ПравоеЗначение = 0;
    ФиксированноеУсловие.Использование = Истина;
    ВложеннаяГруппа = КорневаяГруппа.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
    ВложеннаяГруппа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
    ВложеннаяГруппа.Использование = Истина;
    ВложеннаяГруппа.ИдентификаторПользовательскойНастройки = "КрупныеТовары85";
    ВложеннаяГруппа.ПредставлениеПользовательскойНастройки = "Сумма больше100 или количество больше2";
    ВложеннаяГруппа.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
    Если ВложеннаяГруппа.Родитель <> КорневаяГруппа Тогда
        ВызватьИсключение "Вложенная основная группа должна принадлежать настоящему своему родителю";
    КонецЕсли;
    УсловиеСуммы = ВложеннаяГруппа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    УсловиеСуммы.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сумма");
    УсловиеСуммы.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
    УсловиеСуммы.ПравоеЗначение = 100;
    УсловиеСуммы.Использование = Истина;
    УсловиеКоличества = ВложеннаяГруппа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    УсловиеКоличества.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Количество");
    УсловиеКоличества.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
    УсловиеКоличества.ПравоеЗначение = 2;
    УсловиеКоличества.Использование = Истина;
    ТекстСхемы = СвойОбъектРасшифровкиВСтроку(Схема);
    Редактор = СоздатьСвойРедактор(Схема);
    ТекущийКорень = Редактор.Настройки.Отбор.Элементы.Получить(0);
    ТекущееВложение = ТекущийКорень.Элементы.Получить(1);
    Если ТипЗнч(ТекущийКорень) <> Тип("ГруппаЭлементовОтбораКомпоновкиДанных")
        Или ТипЗнч(ТекущееВложение) <> Тип("ГруппаЭлементовОтбораКомпоновкиДанных")
        Или ТекущийКорень.Родитель <> Неопределено Или ТекущееВложение.Родитель <> ТекущийКорень
        Или ТекущееВложение.ИдентификаторПользовательскойНастройки <> "КрупныеТовары85"
        Или ТекущееВложение.ПредставлениеПользовательскойНастройки <> "Сумма больше100 или количество больше2"
        Или ТекущееВложение.РежимОтображения <> РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда
        ВызватьИсключение "Свое основное дерево и параметры отдельной пользовательской группы должны сохраниться";
    КонецЕсли;
    ПользовательскаяГруппа = ПолучитьСвойПользовательскийРаздел(Редактор, "КрупныеТовары85", Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
    ПользовательскаяГруппа.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
    Если Не ПользовательскаяГруппа.Использование
        Или ПользовательскаяГруппа.РежимОтображения <> РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда
        ВызватьИсключение "В user-группе доступны собственные флаг и режим; начальный флаг должен быть включен";
    КонецЕсли;
    ТекстОсновных = СвойОбъектРасшифровкиВСтроку(Редактор.Настройки);
    ПроверитьСвоиСтроки(Схема, Редактор.ПолучитьНастройки(), Истина, Ложь, "");
    ПользовательскаяГруппа.Использование = Ложь;
    ПроверитьСвоиСтроки(Схема, Редактор.ПолучитьНастройки(), Ложь, Ложь, "");
    ПользовательскаяГруппа.Использование = Истина;
    ПроверитьСвоиСтроки(Схема, Редактор.ПолучитьНастройки(), Истина, Ложь, "");
    Если СвойОбъектРасшифровкиВСтроку(Редактор.Настройки) <> ТекстОсновных
        Или СвойОбъектРасшифровкиВСтроку(Схема) <> ТекстСхемы Тогда
        ВызватьИсключение "User-флаг группы не должен изменять все исходные условия и связи родителей";
    КонецЕсли;
    Возврат ТекущееВложение.ПредставлениеПользовательскойНастройки + ": включена750; выключена800; восстановлена750; основное дерево сохранено";
КонецФункции

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Процедура ЗаполнитьСвоиДанные(Схема)
    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "УчебныйИсточник";
    Источник.ТипИсточникаДанных = "Local";
    Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    Набор.Имя = "УчебныеТовары";
    Набор.ИсточникДанных = Источник.Имя;
    Набор.АвтоЗаполнениеДоступныхПолей = Истина;
    Набор.Запрос = "ВЫБРАТЬ
    |    ""Книга"" КАК Наименование,
    |    3 КАК Количество,
    |    250 КАК Цена,
    |    750 КАК Сумма
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ ""Ручка"", 1, 50, 50";
КонецПроцедуры

Процедура ЗаполнитьСвоиНачальныеНастройки(Настройки)
    Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
        Выбранное = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
        Выбранное.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
        Выбранное.Использование = Истина;
    КонецЦикла;
    Детали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    Детали.Использование = Истина;
    АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    АвтоВыбор.Использование = Истина;
КонецПроцедуры

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

Функция ПолучитьСвойПользовательскийРаздел(Редактор, Идентификатор, ТребуемыйТип)
    Раздел = Редактор.ПользовательскиеНастройки.Элементы.Найти(Идентификатор);
    Если Раздел = Неопределено Тогда
        ВызватьИсключение "Собственный раздел должен реально появиться в пользовательских настройках";
    КонецЕсли;
    Если ТипЗнч(Раздел) <> ТребуемыйТип Или Раздел.ИдентификаторПользовательскойНастройки <> Идентификатор Тогда
        ВызватьИсключение "Найден не тот тип или ID собственного пользовательского раздела";
    КонецЕсли;
    Возврат Раздел;
КонецФункции

Функция СвойОбъектРасшифровкиВСтроку(Объект)
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(Запись, Объект);
    Возврат Запись.Закрыть();
КонецФункции

Процедура ПроверитьСвоиСтроки(Схема, Настройки, ТолькоКнига, БезЦены, ПервыйТовар)
    Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
    Макет = Компоновщик.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    Процессор = Новый ПроцессорКомпоновкиДанных;
    Процессор.Инициализировать(Макет);
    Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    Приемник = Новый ТаблицаЗначений;
    Вывод.ОтображатьПроцентВывода = Ложь;
    Вывод.УстановитьОбъект(Приемник);
    Результат = Вывод.Вывести(Процессор, Ложь);
    Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений") Тогда
        ВызватьИсключение "Нужны настоящие строки собственного вывода, не заранее заполненный приемник";
    КонецЕсли;
    Если Результат.Количество() <> ?(ТолькоКнига, 1, 2) Или Результат.Колонки.Количество() <> ?(БезЦены, 3, 4) Тогда
        ВызватьИсключение "Не совпали фактические строки или пользовательский состав колонок";
    КонецЕсли;
    Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Сумма", ",") Цикл
        Если Результат.Колонки.Найти(ИмяПоля) = Неопределено Тогда
            ВызватьИсключение "Не найдена реальная колонка " + ИмяПоля;
        КонецЕсли;
    КонецЦикла;
    Если БезЦены Тогда
        Если Результат.Колонки.Найти("Цена") <> Неопределено Тогда
            ВызватьИсключение "Пользователь выключил Цена: эта колонка не должна выводиться";
        КонецЕсли;
    ИначеЕсли Результат.Колонки.Найти("Цена") = Неопределено Тогда
        ВызватьИсключение "В первоначальном отчете нужна настоящая колонка Цена";
    КонецЕсли;
    Книга = Результат.Найти("Книга", "Наименование");
    Ручка = Результат.Найти("Ручка", "Наименование");
    Если Книга = Неопределено Тогда
        ВызватьИсключение "В собственном результате должна сохраниться Книга";
    КонецЕсли;
    Если Книга.Количество <> 3 Или Книга.Сумма <> 750 Тогда
        ВызватьИсключение "Неверные настоящие числа Книги";
    КонецЕсли;
    Если ТолькоКнига Тогда
        Если Ручка <> Неопределено Тогда
            ВызватьИсключение "Ручка не должна пройти отбор Сумма больше100";
        КонецЕсли;
    Иначе
        Если Ручка = Неопределено Тогда
            ВызватьИсключение "Пользовательские настройки должны сохранить Ручку";
        КонецЕсли;
        Если Ручка.Количество <> 1 Или Ручка.Сумма <> 50 Тогда
            ВызватьИсключение "Неверные настоящие числа Ручки";
        КонецЕсли;
    КонецЕсли;
    Если Не БезЦены Тогда
        Если Книга.Цена <> 250 Тогда
            ВызватьИсключение "Неверная настоящая цена Книги";
        КонецЕсли;
        Если Не ТолькоКнига И Ручка.Цена <> 50 Тогда
            ВызватьИсключение "Неверная настоящая цена Ручки";
        КонецЕсли;
    КонецЕсли;
    Если Результат.Итог("Количество") <> ?(ТолькоКнига, 3, 4) Или Результат.Итог("Сумма") <> ?(ТолькоКнига, 750, 800) Тогда
        ВызватьИсключение "Итоги должны рассчитываться из фактических отфильтрованных строк";
    КонецЕсли;
    Если ПервыйТовар <> "" И Результат[0].Наименование <> ПервыйТовар Тогда
        ВызватьИсключение "Пользовательская сортировка должна изменить фактическую первую строку";
    КонецЕсли;
КонецПроцедуры
УчебныеГруппыНастроек85.Пульт

УчебныеГруппыНастроек85 → Обработки → УчебныеГруппыНастроек85 → Формы → Пульт → Модуль

Полный модуль собственной управляемой формы; здесь не выполнялся.

&НаКлиенте
Процедура Выполнить(Команда)
    Сообщить(ВыполнитьНаСервере());
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
    Возврат УчебныеГруппыНастроек85.ВыполнитьПример();
КонецФункции

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

  1. Создать настоящую корневую ГруппаИ и фиксированное условие Сумма>0. Родитель корневой группы должен быть Неопределено.

  2. Внутри добавить реальную ГруппаИли с условиями Сумма>100 и Количество>2. Вложенная основная группа должна иметь Родитель=КорневаяГруппа, а не Отбор или весь корень настроек.

  3. Непустой пользовательский ID назначить самой вложенной группе, не всему Отбор. Представление и Обычный режим задать основной группе; пользовательский объект реально найти по этому ID и точному типу.

  4. У пользовательской группы недоступны Родитель, ТипГруппы, Элементы, Представление и Применение. Не копировать к ней обращения к основному дереву. В этом опыте изменяется только доступный флаг Использование; доступный режим устанавливается/читается отдельно.

  5. При включенной вложенной группе результат содержит Книгу3/250/750. Выключить: остается собственное независимое условие Сумма>0, поэтому проходят Книга и Ручка с итогом4/800.

  6. Вернуть Истина и заново сформировать Книгу750. Все три результата получены собственным процессором компоновки, а не внесены заранее в ожидаемый приемник.

  7. Сравнить весь XML основных настроек и всей схемы. Представление читать у основной вложенной группы и вернуть в результат формы; дерево основных родителей/условий не должно быть переписано пользовательским флагом.

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

  1. Будущий запуск должен пройти три реальные компоновки и все проверки числовых данных. Флаг группы или enum расположения сам по себе не заменяет проверку результата.

  2. У отфильтрованной Книги проверяются3/250/750; при выключении user-группы обе строки3/250/750 и1/50/50, количество4 и сумма800. Основное дерево группыИ/группыИли и его реальные родители сохраняются.

  3. Отрицательный контроль будущего отдельного опыта: изменить только число3 на30 в собственном буквальном запросе при прежней сумме750. Числовая проверка должна отказать; наличие заголовка или нужного количества полей недостаточно.

  4. Полный XML собственных основных настроек и всей схемы сохраняется. Пользовательский слой влияет на эффективную копию, а не переписывает исходную схему.

  5. runtimeVerifiedScenarios=0. Числовые и координатные проверки — будущие BSL-условия приемки, а не полученные здесь результаты выполнения1С.

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

Полный код проверяет три состояния реального результата и сохранность своего исходного дерева/папки. Здесь в1С не запускался.

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

  1. Группа отбора и группа выбранных полей — разные типы с разными свойствами. У user-группы отбора недоступны Родитель, Элементы, ТипГруппы и Представление: не обращаться к ним по аналогии с основным деревом.

  2. Поле папки выбранных полей серверное и используется для получения заголовка по умолчанию. Интерактивное изменение заголовка по native-контракту очищает Поле, но этот UI-процесс здесь не запускался.

  3. РежимОтображения подготовлен и проверен как значение модели; внешний вид настоящего редактора не подтвержден. Пользовательский ID задается конкретному основному объекту и ищется в соответствующем редакторе.

  4. Проверка выбранной папки ограничена двумя собственными константными записями. Если применить чужой стиль, объединенные числовые ячейки, итоговые строки или другое размещение записей, требуется отдельный контроль, а не отключение диагностик.

  5. После новой ЗагрузитьНастройки пользовательские объекты следует искать заново. В этих опытах пользовательский состав создается один раз; старые ссылки через перезагрузку не удерживаются.

  6. Выключение своей вложенной группы не означает универсальный сброс всего отбора: независимое условие Сумма>0 продолжает действовать. В опыте нет записи пользовательских настроек между сеансами или изменения рабочих конфигураций.

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

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

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

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

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