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