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