Как программно открыть форму выбора с отбором в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике программирования на платформе 1С:Предприятие 8.3 часто возникает задача открыть форму выбора (например, справочника «Номенклатура» или «Контрагенты») не с полным списком элементов, а с предварительно установленным фильтром. Например, при выборе договора нам нужно показывать только договоры конкретного контрагента, или при подборе товара — только товары определенной группы.

Разберем подробно, как правильно использовать функцию глобального контекста ОткрытьФорму для решения этой задачи, какие параметры необходимо передать и как работает механизм отбора в управляемых формах.

Использование параметров открытия формы

В управляемых формах для открытия окон используется метод ОткрытьФорму. Чтобы установить отбор в открываемом списке, нам необходимо задействовать второй параметр этой функции — структуру параметров.

Платформа 1С автоматически обрабатывает параметр с ключом "Отбор" (или Filter). Если мы передадим в него структуру, где ключи соответствуют именам полей списка (реквизитам), а значения — требуемым значениям фильтрации, система автоматически применит этот отбор к динамическому списку основной таблицы формы.

Посмотрим на базовый синтаксис:


// Создаем структуру параметров формы
ПараметрыФормы = Новый Структура;

// Создаем структуру для самого отбора
Отбор = Новый Структура;
Отбор.Вставить("Владелец", Объект.Контрагент); // Пример для договоров
Отбор.Вставить("ВидДоговора", Перечисления.ВидыДоговоров.СПокупателем);

// Вставляем отбор в параметры формы
ПараметрыФормы.Вставить("Отбор", Отбор);

// Открываем форму выбора
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора", ПараметрыФормы, Элемент);

Простой отбор по одному значению

Рассмотрим конкретный пример. Допустим, нам необходимо открыть форму выбора справочника Номенклатура, но показать пользователю только те позиции, которые являются услугами. Предположим, что у номенклатуры есть реквизит ВидНоменклатуры.

Напишем код для обработчика нажатия кнопки или события начала выбора:


&НаКлиенте
Процедура ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отменяем стандартную обработку, так как мы открываем форму вручную
    СтандартнаяОбработка = Ложь;
    
    // Подготовим параметры
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("ВидНоменклатуры", ПредопределенноеЗначение("Справочник.ВидыНоменклатуры.Услуга"));
    
    ПараметрыЗапуска = Новый Структура("Отбор", ПараметрыОтбора);
    
    // Открываем форму и указываем "Элемент" как владельца, чтобы выбор вернулся в поле ввода
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыЗапуска, Элемент);
    
КонецПроцедуры

Обратите внимание на использование ПредопределенноеЗначение. На клиенте мы не можем напрямую обращаться к менеджерам справочников (например, Справочники.ВидыНоменклатуры.Услуга), поэтому используем этот метод или передаем значение с сервера.

Множественный отбор (список значений)

Часто требуется отобрать данные не по одному значению, а по списку. Например, показать документы, находящиеся в статусах "Черновик" или "На согласовании".

Для этого в структуру отбора в качестве значения нужно передать Массив или СписокЗначений. Платформа 8.3 (в актуальных релизах) достаточно умна, чтобы интерпретировать массив как условие "В Списке" (IN).

Проанализируем пример отбора по списку складов:


&НаКлиенте
Процедура ВыбратьСклад(Команда)
    
    МассивСкладов = Новый Массив;
    МассивСкладов.Добавить(ОсновнойСклад);
    МассивСкладов.Добавить(РезервныйСклад);
    
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Склад", МассивСкладов);
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
    
    // Если нужно обработать выбор программно, используем ОписаниеОповещения
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораСклада", ЭтотОбъект);
    
    ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаВыбора", ПараметрыФормы, ЭтотОбъект, , , , Оповещение);

КонецПроцедуры

Сложные отборы через КомпоновщикНастроек

Иногда простого равенства недостаточно. Нам может потребоваться открыть форму с отбором вида "Остаток > 0" или "Наименование содержит 'Клей'". Ключ "Отбор" работает только на равенство.

В таких случаях необходимо использовать передачу пользовательских настроек динамического списка. Но это более сложный путь, требующий вмешательства в код самой открываемой формы (в событие ПриСозданииНаСервере), где мы будем считывать переданные параметры и программно модифицировать Список.КомпоновщикНастроек.ПользовательскиеНастройки.

Однако для большинства типовых задач (фильтрация по владельцу, типу, организации) механизма простой структуры Отбор вполне достаточно.

Важные нюансы

  1. Имена полей: Ключи в структуре Отбор должны в точности совпадать с именами полей в динамическом списке открываемой формы. Если в списке поле называется СсылкаНаКлиента, а вы передадите Клиент, отбор не сработает или вызовет ошибку.
  2. Режим выбора: Если вы открываете форму не через событие поля ввода, а отдельной кнопкой, и вам нужно именно выбрать значение (а не просто открыть список), убедитесь, что форма открывается в режиме выбора. Обычно это происходит автоматически, если передан параметр владельца, но можно явно указать параметр РежимВыбора = Истина.
  3. Владелец формы: Третий параметр в функции ОткрытьФорму (в примерах выше — Элемент или ЭтотОбъект) указывает владельца открываемого окна. Это критически важно для того, чтобы событие выбора (ОбработкаВыбора) сработало корректно в родительской форме.

Используя эти методы, мы делаем интерфейс более дружелюбным для пользователя, избавляя его от необходимости вручную фильтровать огромные списки данных.

← На главную