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