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