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