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