В разработке на платформе 1С:Предприятие 8.3 часто возникает задача упростить жизнь пользователю, максимально автоматизировав ввод данных. Одной из таких задач является программная активация строки поиска в динамических списках. Начинающие разработчики часто ищут метод вроде АктивизироватьПолеПоиска(), но сталкиваются с тем, что стандартная строка поиска в командной панели не является обычным элементом формы, к которому можно обратиться напрямую.
В этой статье мы подробно разберем, как обойти ограничения платформы, рассмотрим различные методы управления фокусом и выясним, как сделать работу с поиском максимально бесшовной.
Проанализируем стандартное поведение платформы. В 1С 8.3 реализован механизм «поиска при вводе». Если фокус находится на таблице (динамическом списке), то при нажатии любой клавиши система автоматически передает управление в поле поиска. Следовательно, самый простой и эффективный способ «активировать» поиск — это установить фокус на сам элемент списка.
Рассмотрим пример кода, который нужно вызвать, например, при открытии формы или нажатии специальной кнопки:
&НаКлиенте
Процедура АктивизироватьПоиск(Команда)
Элементы.Список.ТекущийЭлемент = Элементы.Список;
КонецПроцедуры
Использование метода УстановитьФокус() также дает желаемый результат:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ТекущийЭлемент = Элементы.Список;
КонецПроцедуры
Важный нюанс: для того чтобы этот метод сработал как «активация поиска», в свойствах динамического списка в конфигураторе должна быть включена опция Использовать поиск при вводе. Если она отключена, фокус просто установится на строку списка, но набор текста не вызовет появление строки поиска.
Иногда задача стоит шире: нужно не просто активировать поле, но и сразу отфильтровать данные. В современных версиях платформы (начиная с 8.3.10) у динамического списка появилось свойство СтрокаПоиска. Мы можем программно записать туда значение, и система сама инициализирует поиск.
Разберем, как это работает на практике:
&НаКлиенте
Процедура НайтиКонтрагента(ИмяПоиска)
Элементы.Список.СтрокаПоиска = ИмяПоиска;
КонецПроцедуры
После выполнения этого кода платформа не только подставит текст в системное поле поиска, но и применит фильтр к данным. Это избавляет пользователя от необходимости вручную нажимать клавиши.
Часто возникает ситуация, когда пользователь ввел данные в строку поиска, нажал Enter, и ему нужно сразу начать перемещаться по найденным строкам с помощью стрелок клавиатуры. Однако фокус может остаться в поле поиска. Чтобы вернуть фокус в таблицу после отработки поиска, можно воспользоваться событием ПриПолученииДанныхНаСервере в связке с обработчиком ожидания.
Выясним причину, по которой прямая установка фокуса в серверных методах невозможна: фокус — это чисто клиентское свойство. Поэтому мы используем «флаг» (переменную формы), чтобы передать сигнал на клиент.
НужноВернутьФокус (тип Булево).
&НаСервере
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Аргументы)
// Если поиск отработал (например, изменились параметры поиска)
НужноВернутьФокус = Истину;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьНеобходимостьФокуса()
Если НужноВернутьФокус Тогда
Элементы.Список.УстановитьФокус();
НужноВернутьФокус = Ложь;
КонецЕсли;
КонецПроцедуры
Использование ПодключитьОбработчикОжидания с минимальным интервалом (например, 0.1 секунды) позволяет платформе завершить перерисовку интерфейса после поиска и избежать визуальных «зависаний» или конфликтов фокуса.
Если стандартное поведение платформенного поиска вас не устраивает (например, нужно нестандартное расположение или особые события при вводе), мы рекомендуем рассмотреть создание собственного поля ввода.
Разберем этот процесс по шагам:
ПользовательскийПоиск.ПриИзменении этого поля будем программно устанавливать отбор в динамическом списке или использовать упомянутое выше свойство СтрокаПоиска.Такой подход дает 100% контроль над фокусом. Вы можете использовать Элементы.ПользовательскийПоиск.УстановитьФокус() в любой момент, так как это ваш собственный элемент формы с уникальным именем. Для программного создания и размещения элементов управления на форме можно использовать обработку с примерами динамического добавления элементов формы.
Проанализируем ситуации, когда стандартные методы могут работать не так, как ожидается:
ПоложениеСтрокиПоиска. Если установлено значение Нет, никакие методы активации не заставят строку поиска появиться.УстановитьФокус() в самом конце процедур.WScript.Shell для отправки Ctrl+F. Мы не рекомендуем использовать этот метод, так как он привязан к ОС Windows, не работает в веб-клиенте и может блокироваться антивирусами.Подводя итог, можно сказать, что наиболее надежным и «чистым» способом активизации поиска является установка фокуса на таблицу списка Элементы.Список.УстановитьФокус() при включенной опции поиска при вводе. Это стандартное поведение, привычное пользователям и поддерживаемое платформой на всех уровнях.