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