Как отфильтровать форму выбора справочника по нескольким значениям?

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

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

Суть проблемы: почему отбор не срабатывает для списка?

Распространенная ошибка начинающих разработчиков при работе с Запрос заключается в использовании конструкции Если РезультатЗапроса.Следующий Тогда Возврат .... Такая логика принудительно прерывает выполнение функции после обнаружения первой же записи. В результате форма выбора получает только одно значение, хотя запрос нашел их гораздо больше.

Для корректной работы необходимо, чтобы функция на сервере собирала все найденные элементы в массив, который затем будет передан в ПараметрыФормы. Платформа 1С самостоятельно распознает массив, переданный в Отбор, и применяет условие вида Где Ссылка В (&Массив).

Реализация: получаем все значения запросом

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

Создадим функцию на сервере, которая выполнит запрос и выгрузит нужные данные в массив:


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

Передача массива в форму выбора

Теперь, когда у нас есть готовый массив, мы можем передать его в ОткрытьФорму. Мы создадим структуру, где ключом будет слово "Отбор", а значением — структура, содержащая наш массив.

Рассмотрим код обработчика на клиенте:


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

Почему это работает правильно?

  1. Использование массива: Когда мы передаем массив в отбор, платформа автоматически применяет оператор В вместо строгого равенства. Это избавляет нас от необходимости вручную перебирать элементы или настраивать сложные фильтры динамического списка.
  2. Метод ВыгрузитьКолонку: Этот метод является наиболее эффективным способом получения списка значений из результата запроса для последующей передачи в параметры формы.
  3. Серверная оптимизация: Мы используем &НаСервереБезКонтекста для минимизации нагрузки на канал передачи данных между клиентом и сервером, так как в функцию передается только ссылка, а возвращается небольшой массив ссылок.

Рекомендации по развитию

Если в будущем количество элементов в вашем справочнике вырастет до тысяч, метод передачи массива в Отбор может стать медленным. В таких случаях мы рекомендуем:

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

← На главную