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