Разберем ситуацию, с которой часто сталкиваются разработчики и пользователи при работе в конфигурациях на базе 1С:Предприятие 8.3 (управляемые формы, интерфейс Такси). Представим, что у нас есть форма списка регистра сведений (или справочника, или документа), основанная на динамическом списке. Пользователи создали несколько удобных отборов через меню Ещё — Настроить список.
Проблема заключается в том, что для переключения между этими сохраненными настройками пользователю приходится совершать слишком много действий мышью: открывать меню Ещё, выбирать пункт Выбрать настройки... и искать нужный вариант в открывшемся диалоговом окне. Естественное желание — вывести на форму удобный контрол (выпадающий список), как это реализовано в отчетах на Системе Компоновки Данных (СКД). Давайте проанализируем, как можно решить эту задачу штатными средствами и с помощью программирования.
Прежде чем приступать к реализации, выясним причину, почему платформа не предоставляет готовой галочки для вывода вариантов на форму. Многие путают работу с конкретными отборами и работу с глобальными вариантами настроек.
Если мы зайдем в настройки списка, выберем конкретный отбор (например, по контрагенту), затем через кнопку Ещё откроем Свойства элемента пользовательских настроек и установим Режим редактирования в значение Быстрый доступ, то на форме действительно появится контрол. Также можно включить галочку Группа пользовательских настроек в меню изменения формы.
Однако, Быстрый доступ выводит на форму поле для установки значения только одного конкретного фильтра. Нам же требуется переключение целых Вариантов, которые содержат наборы разных отборов, сортировок, условного оформления и группировок. Штатным функционалом платформы переключение глобальных вариантов реализовано исключительно через открытие дополнительного окна настроек. Вывести их стандартным переключателем прямо на форму без написания кода невозможно.
Если мы хотим обойтись без конфигурирования, мы можем сократить количество кликов, вынеся стандартную кнопку выбора настроек ближе к пользователю. Рассмотрим по шагам, как это сделать:
В командной панели в Да (или выберем нужный вариант отображения).В результате на верхней панели формы (над таблицей) появится кнопка. При нажатии на нее все равно будет открываться окно выбора настроек динамического списка, но пользователю больше не придется искать ее в глубинах меню Ещё. Это компромиссное решение, экономящее время.
Если заказчик или пользователи настаивают на том, чтобы интерфейс переключения фильтров выглядел ровно так же, как в отчетах СКД (классический выпадающий список прямо над таблицей), нам потребуется доработать форму в конфигураторе. Проанализируем один из самых популярных способов визуальной реализации.
ТекущийВариантНастроек) с типом Строка или Число.РежимВыбораИзСписка = Истина.СписокВыбора нужными нам наименованиями вариантов (например: "Все записи", "Только актуальные", "С ошибками").ПриИзменении для этого поля.Внутри обработчика мы должны программно проанализировать выбранное значение и применить нужные фильтры к динамическому списку. Посмотрим на пример кода:
&НаКлиенте
Процедура ТекущийВариантНастроекПриИзменении(Элемент)
// Очищаем текущие отборы (упрощенный пример)
Элементы.Список.Отбор.Элементы.Очистить();
Если ТекущийВариантНастроек = "Только актуальные" Тогда
// Программно добавляем нужный отбор
НовыйОтбор = Элементы.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статус");
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.ПравоеЗначение = ПредопределенноеЗначение("Перечисление.Статусы.Актуально");
НовыйОтбор.Использование = Истина;
ИначеЕсли ТекущийВариантНастроек = "С ошибками" Тогда
// Применяем другой набор отборов
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что отборы жестко зафиксированы разработчиком, и логика полностью прозрачна. Но он не позволяет пользователям сохранять свои собственные, новые варианты.
Рассмотрим альтернативный UI-подход. Если мы не хотим занимать место отдельным полем на форме, мы можем сделать аккуратную командную кнопку (например, с иконкой "воронки" или шестеренки), по нажатию на которую будет разворачиваться выпадающее меню.
В этом случае на форму добавляется команда, а в ее обработчике формируется СписокЗначений. Затем вызывается платформенный метод ПоказатьВыборИзМеню, который отобразит меню прямо под курсором или кнопкой. Разберем пример реализации:
&НаКлиенте
Процедура ВыбратьБыструюНастройку(Команда)
СписокНастроек = Новый СписокЗначений;
СписокНастроек.Добавить("Основная", "Стандартный вид списка");
СписокНастроек.Добавить("Необработанные", "Только новые и необработанные");
Оповещение = Новый ОписаниеОповещения("ПослеВыбораНастройки", ЭтаФорма);
// Выводим меню под кнопкой, вызвавшей процедуру
ПоказатьВыборИзМеню(Оповещение, СписокНастроек, Элементы.КнопкаВыбораНастройки);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораНастройки(ВыбранныйПункт, Параметры) Экспорт
Если ВыбранныйПункт = Неопределено Тогда
Возврат; // Пользователь кликнул мимо меню
КонецЕсли;
// Вызываем процедуру применения отборов, аналогичную Решению 2
ПрименитьФильтрыПоИмени(ВыбранныйПункт.Значение);
КонецПроцедуры
Разберем самый сложный, но самый правильный с архитектурной точки зрения вариант. Что если пользователи хотят сами создавать варианты в типовом окне "Настроить список", сохранять их, а мы должны лишь подтягивать эти названия в наш выпадающий список для быстрого переключения?
Варианты настроек сохраняются в системном хранилище. Чтобы предоставить к ним доступ через наш кастомный выпадающий список, нам потребуется:
ПриСозданииНаСервере обратиться к объекту ХранилищеСистемныхНастроек.СписокВыбора нашего реквизита на форме.ЗагрузитьНастройки() объекта КомпоновщикНастроекКомпоновкиДанных).Этот путь потребует уверенных навыков работы с программной модификацией схемы компоновки данных. По факту это эмуляция работы типовой подсистемы "Варианты отчетов" из БСП (Библиотеки стандартных подсистем), но адаптированная под динамический список.
Подводя итог: если вам нужно простое решение — выносите штатную кнопку на панель команд. Если нужно реализовать жестко заданные фильтры с быстрым доступом — используйте выпадающий список с программным заполнением отборов. А если требуется полномасштабная замена типовому механизму с сохранением пользовательских вариантов — готовьтесь к глубокой интеграции с системным хранилищем настроек 1С.