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

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

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

Разберем основные методы решения этой задачи, начиная от простых вариантов и заканчивая более гибкими настройками.

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

Самый распространенный и простой способ установить отбор при открытии формы — это использование стандартного параметра Отбор, который существует у расширений форм динамических списков. Этот метод идеально подходит, когда условие равенства однозначное (например, поле "Склад" равно конкретному складу).

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

Рассмотрим пример кода, который открывает форму списка номенклатуры с отбором по виду номенклатуры:


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

// Упаковываем это в структуру параметров формы под ключом "Отбор"
ПараметрыФормы = Новый Структура("Отбор", ПараметрыОтбора);

// Открываем форму, передавая параметры
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", ПараметрыФормы);

Проанализируем этот код:

  1. Мы формируем структуру ПараметрыОтбора, где задаем конкретные поля.
  2. Вкладываем эту структуру в другую структуру ПараметрыФормы с зарезервированным ключом Отбор.
  3. Платформа 1С при открытии формы автоматически распознает этот ключ и применяет фильтр к основному реквизиту формы (обычно это Список).

Важно: Этот метод работает как для формы списка, так и для формы выбора. Если вы открываете форму выбора из поля ввода, механизм остается тем же.

Множественный отбор

Если нам нужно установить отбор сразу по нескольким полям, мы просто добавляем их в структуру. Рассмотрим ситуацию, когда нужно отобрать товары по виду и по ставке НДС:


ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("ВидНоменклатуры", НужныйВид);
ПараметрыОтбора.Вставить("СтавкаНДС", НужнаяСтавка);

ПараметрыФормы = Новый Структура("Отбор", ПараметрыОтбора);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы);

Сложные отборы через ПользовательскиеНастройки или ФиксированныеНастройки

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

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

Но есть и способ сделать это "снаружи", используя механизм ФиксированныеНастройки, если мы работаем с динамическим списком. Тем не менее, наиболее надежный способ для сложных условий — это программная установка отбора в событии ПриСозданииНаСервере самой формы.

Посмотрим, как передать данные для сложного отбора и обработать их:

Шаг 1. Передача параметров при открытии:


// Передаем список складов для отбора
СписокСкладов = Новый СписокЗначений;
СписокСкладов.Добавить(Склад1);
СписокСкладов.Добавить(Склад2);

ПараметрыФормы = Новый Структура("ОтборПоСкладам", СписокСкладов);
ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.ФормаСписка", ПараметрыФормы);

Шаг 2. Обработка в модуле формы (событие ПриСозданииНаСервере):


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

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

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

Особенности работы с иерархией

Часто возникает вопрос: как открыть список сразу внутри определенной группы (папки)? Для этого в платформе 1С предусмотрены специальные параметры.

Рассмотрим, как это сделать правильно. Разберем особенности работы с иерархией: если мы установим отбор по полю Родитель, список покажет только содержимое этой папки, но сама структура дерева может быть скрыта или отображаться некорректно в режиме "Дерево".

Для позиционирования и отображения содержимого группы лучше использовать параметры ТекущаяСтрока или настроить режим просмотра.


// Отбор по родителю (покажет только содержимое папки, "плоский" вид фильтрации)
ПараметрыОтбора = Новый Структура("Родитель", СсылкаНаПапку);
ПараметрыФормы = Новый Структура("Отбор", ПараметрыОтбора);
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", ПараметрыФормы);

Подводные камни и рекомендации

При реализации программных отборов обратите внимание на следующие моменты:

  1. Имена полей: Убедитесь, что имена ключей в структуре Отбор в точности совпадают с именами полей в динамическом списке. Если в запросе динамического списка поле имеет псевдоним (например, ВЫБРАТЬ Ссылка КАК Объект), использовать нужно именно псевдоним.
  2. Типы данных: Значения отбора должны строго соответствовать типу данных поля. Если поле ссылочного типа, нельзя передавать туда строку с названием или код.
  3. Режим открытия формы выбора: Если вы открываете форму выбора для поля ввода программно, не забудьте про параметр РежимВыбора = Истина, хотя метод ОткрытьФорму с именем "...ФормаВыбора" обычно устанавливает его автоматически.

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

← На главную