Разберем классическую ситуацию, с которой сталкиваются разработчики в 1С. У нас есть форма списка, например, партнеров, и у каждого партнера может быть несколько адресов доставки. Пользователи привыкли просто кликать на список и сразу набирать на клавиатуре нужный адрес. Но вместо мгновенного результата платформа выдает всплывающее окно поиска, в котором пользователю приходится вручную выбирать колонку (где именно искать) и подтверждать действие. Это занимает лишнее время.
Возникает закономерное желание: перехватить ввод пользователя с клавиатуры, отключить стандартное окно и сделать так, чтобы поиск автоматически применялся сразу ко всем адресам партнера. Давайте проанализируем, как это можно реализовать, учитывая архитектуру управляемых форм.
Первое, что приходит на ум — отловить ввод текста "на лету". Однако выясним причину, почему это не сработает в 1С. Штатными средствами платформы принципиально невозможно посимвольно перехватывать нажатия клавиш клавиатуры, когда фокус находится на строке динамического списка. Платформа 1С специально не предоставляет событий вроде OnKeyPress для таблиц. Это сделано намеренно, чтобы избежать огромного количества серверных вызовов и критического падения производительности системы.
События вроде АвтоПодбор или ОкончаниеВводаТекста отлично работают для элементов типа поле ввода, но для объекта ПолеСписка (Таблица формы) стандартное окно поиска — это базовый платформенный механизм. Вклиниться в него "на лету" до его открытия нельзя. Поэтому использование внешних компонент (перехват хуков клавиатуры) — это единственный путь прямого перехвата, но мы крайне не рекомендуем его из-за нестабильности и несовместимости с веб-клиентом.
Если пользователей раздражает, что окно поиска выскакивает само по себе при случайном нажатии клавиш, мы можем это отключить.
ПоискПриВводе.Теперь при наборе текста в пустоту окно появляться не будет. Но как же тогда искать? Рассмотрим следующие штатные механизмы.
Начиная с версии платформы 1С:Предприятие 8.3, разработчикам доступен отличный встроенный механизм — глобальная строка поиска по списку. Главный ее плюс в том, что по умолчанию она осуществляет поиск сразу по всем видимым текстовым колонкам списка. Пользователю больше не нужно тратить время на выбор конкретного поля.
Настроим этот механизм:
ПоложениеСтрокиПоиска устанавливаем в значение Командная панель или Верх.ПоложениеУправленияПоиском.Теперь над списком появится удобное поле. Пользователь ставит туда курсор, пишет "Москва", и платформа сама ищет это слово во всех выведенных на форму колонках адресов.
Проанализируем ситуацию, когда адресов много, они хранятся в связанной таблице, и выводить их все отдельными колонками на форму нецелесообразно. Как заставить глобальный поиск находить партнера по любому его адресу?
Для этого разработчики применяют изящный трюк с конкатенацией (объединением) строк прямо в произвольном запросе динамического списка. Разберем по шагам:
ВЫРАЗИТЬ или соединение строк, если адреса извлекаются вложенным запросом или функцией платформы).СлужебнаяСтрокаАдресов, в список выбранных полей.Так как колонка физически добавлена в элементы формы, стандартная строка поиска 1С (при соответствующих настройках полнотекстового или обычного поиска списка) сможет фильтровать записи по этому скрытому полю. Таким образом, мы получаем поиск по всем адресам одновременно, не загромождая интерфейс десятком лишних колонок.
Мы выяснили, что бороться со стандартным поведением платформы 1С путем попыток перехвата клавиатуры — плохая практика. Гораздо эффективнее использовать заложенные в платформу инструменты: грамотно настроить свойство ПоискПриВводе, включить современную строку поиска в интерфейсе Такси и, при необходимости, подготовить данные для поиска прямо в запросе динамического списка.