В процессе разработки интерфейсов на платформе 1С:Предприятие 8.3 часто возникает задача максимально упростить работу пользователя с данными. Одной из самых удобных функций в динамических списках является панель полнотекстового поиска, которая вызывается сочетанием клавиш ALT+F. Однако стандартными средствами встроенного языка долгое время не существовало прямого метода «ОткрытьПанельПоиска()». В этой статье мы подробно разберем, как обойти это ограничение, проанализируем современные возможности платформы и выясним, чем программный поиск отличается от обычного отбора.
Прежде всего, нам необходимо понять, почему разработчики часто ищут именно способ программного нажатия ALT+F, а не используют стандартный ЭлементОтбораКомпоновкиДанных. Стандартный отбор в ДинамическийСписок работает по принципу жесткого SQL-запроса WHERE. Это эффективно, но требует от пользователя понимания, по какому конкретно полю идет фильтрация. Поиск же, вызываемый через ALT+F, выполняет поиск по представлению всех доступных полей списка, что гораздо ближе к привычному поведению поисковых систем.
Проанализируем ситуацию: пользователю нужна та самая «желтая плашка» (панель поиска), потому что она наглядно показывает, по какому слову отфильтрован список, и позволяет быстро очистить поиск одним нажатием. Рассмотрим варианты реализации этой задачи.
Начиная с версии платформы 8.3.15, разработчики получили долгожданный инструмент — свойство динамического списка СтрокаПоиска. Это наиболее «чистый» и правильный метод с точки зрения архитектуры 1С. Мы можем программно назначить текст, который платформа обработает точно так же, как если бы пользователь ввел его в поле поиска вручную.
Посмотрим на пример кода, который устанавливает значение поиска:
&НаКлиенте
Процедура УстановитьПоискПрограммно(ТекстПоиска)
// "Список" — это основной реквизит формы с типом ДинамическийСписок
Список.СтрокаПоиска = ТекстПоиска;
КонецПроцедуры
Важный нюанс: при использовании этого метода фильтрация списка произойдет мгновенно. Однако стоит учитывать, что визуальное состояние панели (та самая желтая полоса) может не развернуться автоматически, если она была скрыта. Тем не менее, данные будут отфильтрованы в соответствии с алгоритмами полнотекстового поиска платформы.
Если перед нами стоит задача именно физически «нажать» кнопки за пользователя, чтобы вызвать системное диалоговое окно поиска или активировать панель, мы можем прибегнуть к использованию Windows Script Host. Этот метод считается «костыльным», так как он привязан к операционной системе Windows и работает только в толстом или тонком клиенте.
Разберем по шагам, как это реализовать:
WScript.Shell через COM-соединение.Alt+F.Рассмотрим пример реализации:
&НаКлиенте
Процедура ВызватьПоискКлавишами()
Попытка
// Устанавливаем фокус на таблицу списка
ТекущийЭлемент = Элементы.Список;
// Создаем объект для отправки нажатий
WshShell = Новый COMОбъект("WScript.Shell");
// Посылаем комбинацию Alt+F
// Символ % в SendKeys соответствует клавише ALT
WshShell.SendKeys("%{f}");
Исключение
Сообщить("Не удалось выполнить нажатие клавиш: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Проанализируем недостатки этого метода. Во-первых, он не будет работать в Веб-клиенте или на Linux-системах. Во-вторых, выполнение SendKeys асинхронно по отношению к интерфейсу 1С, и если фокус в момент выполнения команды перескочит на другой элемент, результат будет непредсказуемым.
Иногда задача заключается не в самом поиске, а в обеспечении постоянного наличия строки поиска на экране, чтобы пользователю не приходилось нажимать ALT+F. В свойствах элемента формы типа Таблица, отображающей список, есть параметр ПоложениеСтрокиПоиска.
Мы можем управлять этим свойством программно, чтобы принудительно отобразить панель:
&НаСервере
Процедура НастроитьОтображениеПоиска()
// Варианты: ПоложениеСтрокиПоискаТаблицы.Верх, Авто, Нет
Элементы.Список.ПоложениеСтрокиПоиска = ПоложениеСтрокиПоискаТаблицы.Верх;
КонецПроцедуры
Комбинируя Список.СтрокаПоиска и принудительное отображение панели в верхней части таблицы, мы добиваемся наиболее стабильного и визуально понятного результата для пользователя, не прибегая к нестабильным методам имитации клавиатуры.
Выясним причину, по которой поиск через СтрокаПоиска может работать медленнее, чем обычный Отбор. Когда мы используем отбор, 1С строит четкий SQL-запрос к конкретным колонкам базы данных. Когда же активируется «плашка» ALT+F, платформа выполняет поиск по всем полям, включенным в состав ПоискаПриВводе. Если список содержит сотни тысяч записей и множество строковых полей, такой поиск может создавать значительную нагрузку.
Рекомендация: Если вам нужно программно отфильтровать список по конкретному значению (например, по артикулу), лучше использовать Список.Отбор. Если же вы хотите предоставить пользователю механизм «быстрого фильтра по всему», используйте Список.СтрокаПоиска.
Подводя итог нашему анализу, выделим основные правила программного управления поиском:
Список.СтрокаПоиска. Это безопасно, кроссплатформенно и предсказуемо.WScript.Shell только в исключительных случаях, когда необходимо вызвать именно системный диалог поиска в специфических условиях работы под Windows.ПоложениеСтрокиПоиска — зачастую проще один раз закрепить панель в верхней части формы, чем программно имитировать её вызов.СтрокаПоиска очищает предыдущие результаты поиска, введенные пользователем вручную.Таким образом, мы выяснили, что хотя прямого метода «нажать кнопку» в API не существует, комбинация свойств СтрокаПоиска и настроек отображения элементов формы полностью перекрывает потребности бизнес-задач.