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