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