Как программно передать сложный отбор в динамический список формы выбора 1С

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

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

Рассмотрим подробнее, как передать не только простые равенства, но и сложные условия (например, «больше», «в списке», «группы И/ИЛИ») в динамический список вызываемой формы.

Метод 1: Простые отборы через структуру «Отбор»

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

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


&НаКлиенте
Процедура ОткрытьВыборПростымиФильтрами()
    
    // Создаем структуру для простых отборов
    СтруктураОтбора = Новый Структура;
    
    // 1. Отбор на равенство
    СтруктураОтбора.Вставить("ВидНоменклатуры", ПредопределенноеЗначение("Справочник.ВидыНоменклатуры.Товар"));
    
    // 2. Отбор "В списке" (передаем Массив или СписокЗначений)
    СписокБрендов = Новый Массив;
    СписокБрендов.Добавить(СсылкаНаБрендSamsung);
    СписокБрендов.Добавить(СсылкаНаБрендLG);
    СтруктураОтбора.Вставить("Производитель", СписокБрендов);
    
    ПараметрыФормы = Новый Структура("Отбор", СтруктураОтбора);
    
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораНоменклатуры", ЭтаФорма);
    
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, ЭтаФорма, , , , ОписаниеОповещения);
    
КонецПроцедуры

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

Метод 2: Сложные отборы через «ФиксированныеНастройки»

Выясним, как быть, если задача требует более гибких условий: например, найти товары, цена которых больше определенного значения, или сгруппировать условия по логике «ИЛИ». В этом случае стандартной структуры Отбор будет недостаточно. Нам потребуется использовать объект НастройкиКомпоновкиДанных и передавать его через параметр ФиксированныеНастройки.

Разберем по шагам создание сложных настроек программно:


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

Этот метод позволяет полностью имитировать возможности конструктора настроек компоновки данных. Главное преимущество ФиксированныеНастройки в том, что пользователь не сможет случайно отключить эти фильтры в интерфейсе через меню «Настроить список», так как они накладываются платформой «жестко».

Метод 3: Использование «ПользовательскихНастроек»

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

Посмотрим на отличия:

Метод 4: Предварительная выборка ссылок

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


&НаСервере
Функция ПолучитьМассивПодходящихТоваров()
    Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ ...");
    Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецФункции

&НаКлиенте
Процедура КомандаВыбрать(Команда)
    МассивСсылок = ПолучитьМассивПодходящихТоваров();
    
    // Используем ФиксированныйМассив для стабильности передачи
    СтруктураОтбора = Новый Структура("Ссылка", Новый ФиксированныйМассив(МассивСсылок));
    ПараметрыОткрытия = Новый Структура("Отбор", СтруктураОтбора);
    
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыОткрытия);
КонецПроцедуры

Рассмотрим нюансы: если массив содержит тысячи элементов, это может замедлить открытие формы, так как СУБД придется обрабатывать огромный оператор IN в SQL-запросе. В таких случаях лучше передавать параметры в сам запрос динамического списка (если список основан на произвольном запросе).

Особенности работы с произвольными запросами

Если ваш динамический список в форме выбора построен на произвольном запросе, содержащем параметры (например, ГДЕ Дата >= &ДатаНачала), то передача через структуру Отбор может не сработать для этих параметров. В этом случае необходимо использовать ФиксированныеНастройки, но обращаться не к Отбор.Элементы, а к свойству ПараметрыДанных объекта НастройкиКомпоновкиДанных.

Рассмотрим пример установки параметра запроса:


Настройки = Новый НастройкиКомпоновкиДанных;
ПараметрДанных = Настройки.ПараметрыДанных.Элементы.Найти("ДатаНачала");
Если ПараметрДанных <> Неопределено Тогда
    ПараметрДанных.Значение = Объект.ПериодС;
    ПараметрДанных.Использование = Истина;
КонецЕсли;

Таким образом, мы обеспечиваем корректную работу динамического списка на уровне серверного запроса, что значительно повышает производительность системы.

Подведем итоги

Для эффективного управления формой выбора в немодальном режиме мы должны:

  1. Определить сложность отбора: для равенств достаточно Отбор, для условий «Больше/Меньше/ИЛИ» — только ФиксированныеНастройки.
  2. Убедиться, что поля, по которым идет отбор, доступны в схеме компоновки динамического списка.
  3. При использовании произвольных запросов не забывать про передачу ПараметрыДанных.

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

← На главную