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