Как изменить стандартный поиск при вводе в динамическом списке 1С и искать по всем колонкам?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Суть проблемы: назойливое окно поиска

Разберем классическую ситуацию, с которой сталкиваются разработчики в 1С. У нас есть форма списка, например, партнеров, и у каждого партнера может быть несколько адресов доставки. Пользователи привыкли просто кликать на список и сразу набирать на клавиатуре нужный адрес. Но вместо мгновенного результата платформа выдает всплывающее окно поиска, в котором пользователю приходится вручную выбирать колонку (где именно искать) и подтверждать действие. Это занимает лишнее время.

Возникает закономерное желание: перехватить ввод пользователя с клавиатуры, отключить стандартное окно и сделать так, чтобы поиск автоматически применялся сразу ко всем адресам партнера. Давайте проанализируем, как это можно реализовать, учитывая архитектуру управляемых форм.

Почему нельзя просто перехватить нажатия клавиш?

Первое, что приходит на ум — отловить ввод текста "на лету". Однако выясним причину, почему это не сработает в 1С. Штатными средствами платформы принципиально невозможно посимвольно перехватывать нажатия клавиш клавиатуры, когда фокус находится на строке динамического списка. Платформа 1С специально не предоставляет событий вроде OnKeyPress для таблиц. Это сделано намеренно, чтобы избежать огромного количества серверных вызовов и критического падения производительности системы.

События вроде АвтоПодбор или ОкончаниеВводаТекста отлично работают для элементов типа поле ввода, но для объекта ПолеСписка (Таблица формы) стандартное окно поиска — это базовый платформенный механизм. Вклиниться в него "на лету" до его открытия нельзя. Поэтому использование внешних компонент (перехват хуков клавиатуры) — это единственный путь прямого перехвата, но мы крайне не рекомендуем его из-за нестабильности и несовместимости с веб-клиентом.

Решение 1: Отключение автоматического окна поиска

Если пользователей раздражает, что окно поиска выскакивает само по себе при случайном нажатии клавиш, мы можем это отключить.

  1. Откроем форму в конфигураторе.
  2. Найдем элемент формы типа "Таблица", который отображает наш динамический список.
  3. Перейдем в палитру свойств и найдем свойство ПоискПриВводе.
  4. Установим его в значение Не использовать.

Теперь при наборе текста в пустоту окно появляться не будет. Но как же тогда искать? Рассмотрим следующие штатные механизмы.

Решение 2: Использование глобальной строки поиска (Интерфейс Такси)

Начиная с версии платформы 1С:Предприятие 8.3, разработчикам доступен отличный встроенный механизм — глобальная строка поиска по списку. Главный ее плюс в том, что по умолчанию она осуществляет поиск сразу по всем видимым текстовым колонкам списка. Пользователю больше не нужно тратить время на выбор конкретного поля.

Настроим этот механизм:

  1. В свойствах таблицы динамического списка находим группу свойств, отвечающих за поиск.
  2. Свойство ПоложениеСтрокиПоиска устанавливаем в значение Командная панель или Верх.
  3. При необходимости можно также вывести ПоложениеУправленияПоиском.

Теперь над списком появится удобное поле. Пользователь ставит туда курсор, пишет "Москва", и платформа сама ищет это слово во всех выведенных на форму колонках адресов.

Решение 3: Трюк с запросом динамического списка для сложных данных

Проанализируем ситуацию, когда адресов много, они хранятся в связанной таблице, и выводить их все отдельными колонками на форму нецелесообразно. Как заставить глобальный поиск находить партнера по любому его адресу?

Для этого разработчики применяют изящный трюк с конкатенацией (объединением) строк прямо в произвольном запросе динамического списка. Разберем по шагам:

  1. Включаем произвольный запрос для динамического списка.
  2. Создаем дополнительное вычисляемое поле, собирающее все адреса в одну длинную строку (например, через функцию ВЫРАЗИТЬ или соединение строк, если адреса извлекаются вложенным запросом или функцией платформы).
  3. Добавляем эту новую колонку, например СлужебнаяСтрокаАдресов, в список выбранных полей.
  4. Выводим эту колонку на форму списка, но в свойствах элемента формы снимаем флажок Видимость. Колонка есть на форме, но пользователь ее не видит.

Так как колонка физически добавлена в элементы формы, стандартная строка поиска 1С (при соответствующих настройках полнотекстового или обычного поиска списка) сможет фильтровать записи по этому скрытому полю. Таким образом, мы получаем поиск по всем адресам одновременно, не загромождая интерфейс десятком лишних колонок.

Итоги

Мы выяснили, что бороться со стандартным поведением платформы 1С путем попыток перехвата клавиатуры — плохая практика. Гораздо эффективнее использовать заложенные в платформу инструменты: грамотно настроить свойство ПоискПриВводе, включить современную строку поиска в интерфейсе Такси и, при необходимости, подготовить данные для поиска прямо в запросе динамического списка.

← На главную