Объект динамический список содержит в себе следующие отборы:
- Список.Отбор
- Список.КомпоновщикНастроек.Настройки.Отбор
- Список.КомпоновщикНастроек.ПользовательскиеНастройки.Отбор
- Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор
Возникают вопросы:
- Зачем столько отборов?
- Какой надо использовать?
- Как передать значения отборов при открытии формы?
Пробуем разобраться.
Зачем столько отборов?
Первое о чем хочется сказать, это:
Список.Отбор = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор
Т.е. если вы добавите отбор например вот так:
ЭлементОтбора = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = "Фиксированный отбор из кода";
то фактически увидите примененный отбор и в Список.Отбор.
Таким образом можно говорить о том, что управление отборами в динамическом списке выполняется только через компоновщик настроек. Далее можно рассматривать только три вида отборов:
- Настройки.Отбор
- ПользовательскиеНастройки.Отбор
- ФиксированныеНастройки.Отбор
Рассмотрим их особенности и порядок применения отборов.
ФиксированныеНастройки.Отбор
Это настройки, которые недоступны пользователю для редактирования средствами платформы.
Управление фиксированными настройками выполняется программно в соответствии с логикой прикладного решения.
Пример кода, для открытия формы с условием на "Равно" или "В списке":
Отбор = Новый Структура;
Отбор.Вставить("Наименование", "Отбор ""Равно""");
// ИЛИ
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить("Отбор ""В списке 1""");
СписокЗначений.Добавить("Отбор ""В списке 2""");
Отбор.Вставить("Наименование", СписокЗначений);
// ИЛИ
Массив = Новый Массив;
Массив.Добавить("Отбор ""Массив 1""");
Массив.Добавить("Отбор ""Массив 2""");
Отбор.Вставить("Наименование", Массив);
ПараметрыФормы = Новый Структура("Отбор", Отбор);
ОткрытьФорму(ИмяФормыСписка(), ПараметрыФормы);
Произвольные фиксированные настройки можно передавать в форму списка:
НастройкиКомпоновкиДанных = Новый НастройкиКомпоновкиДанных;
ЭлементОтбора = НастройкиКомпоновкиДанных.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Подобно;
ЭлементОтбора.ПравоеЗначение = "Произвольный фиксированный отбор";
ПараметрыФормы = Новый Структура("ФиксированныеНастройки", НастройкиКомпоновкиДанных);
ОткрытьФорму(ИмяФормыСписка(), ПараметрыФормы);
Настройки.Отбор
Это настройки по умолчанию, они же доступны из конфигуратора в конструкторе формы.
Данные настройки будут применяться если пользователь нажмет "Еще - Установить стандартные настройки".
Способа передать эти настройки в форму через параметры не нашел.
ПользовательскиеНастройки.Отбор
Это настройки, которые доступны для редактирования пользователю через "Еще - Настройки списка ..." на закладке отбор.
Передавать эти настройки в общем случае нельзя, но если очень хочется то можно:
ПользовательскиеНастройкиКомпоновкиДанных = Новый ПользовательскиеНастройкиКомпоновкиДанных;
ОтборКомпоновкиДанных = ПользовательскиеНастройкиКомпоновкиДанных.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки = "dfcece9d-5077-440b-b6b3-45a5cb4538eb";
ЭлементОтбора = ОтборКомпоновкиДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Подобно;
ЭлементОтбора.ПравоеЗначение = "Произвольный отбор";
ПараметрыФормы = Новый Структура("ПользовательскиеНастройки", ПользовательскиеНастройкиКомпоновкиДанных);
ОткрытьФорму(ИмяФормыСписка(), ПараметрыФормы);
Примечание: ГУИД в данном случае является магическим числом без которого не работает и которого нет в документации.
При использовании данного подхода выяснилась еще одна особенность: при открытии формы, переданные таким образом настройки не отображаются в группе пользовательских настроек. Для обновления содержимого группы при открытии формы приходится выполнять:
Список.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Список.КомпоновщикНастроек.ПользовательскиеНастройки);
Причем срабатывает это только "После открытия формы". Поэтому приходится дополнительно использовать "ПодключитьОбработчикОжидания"
Какие есть особенности в использовании отборов?
"Особенности", как известно - это место где дьявол скрывается в мелочах.
1. Пользовательские и фиксированные установки нельзя устанавливать на одно и то же поле.
Причина этого ограничения мне не понятна, возможно было бы меньше проблем если бы отборы фиксированных и пользовательских настроек объединялись через "И", но имеем что имеем:
Если пользователь установил отбор по тому же реквизиту, который используется в фиксированных настройках, то будет отображена ошибка:
Данная ошибка может быть неожиданной для пользователя, т.к. настройки он мог сделать в форме выбора тогда когда она была открыта без фиксированных настроек, а ошибку получит тогда, когда откроет форму с фиксированными настройками.
Возможные решения:
- Передавать фиксированный отбор вместе с пустым отбором в пользовательских настройках с ГУИДом "dfcece9d-5077-440b-b6b3-45a5cb4538eb".
- Научить пользователя отключать лишние отборы в случае появления данной ошибки.
2. Элементы пользовательского отбора имеют настройки.
Данные настройки определяют на какой закладке будет отображаться элемент пользовательской настройки.
Режим редактирования "Быстрый доступ" включает отображение данного отбора в группе пользовательских настроек.
Пользователь это видит вот так:
а в конфигураторе вот так:
3. Отбор пользовательских настроек это элемент коллекции "ПользовательскиеНастройки.Элементы".
В результате вывести на форму отбор пользовательских настроек можно только если на форме уже есть таблица "ПользовательскиеНастройки". Редактировать отбор можно только если элемент "ПользовательскиеНастроки" имеет включенную видимость и текущей строкой в нем является отбор. Возможным решением задачи "предоставить возможность редактирования пользовательских отборов прямо на форме списка" может быть:
- Создать на форме страницы без заголовка (так что бы пользователь не мог переключаться между страницами)
- Вывести на первую страницу таблицу с отборами.
- Вывести на вторую страницу таблицу с пользовательскими настроками.
- Программно установить в таблице пользовательских настроек в качестве текущей строки строку с отборами.
Вот вроде бы и все. Во вложении обработка в которой выведены на форму все отборы.
Обработка и приведенных выше код проверялись на платформе версии 8.3.20, но должны работать и на более младших версиях.