При работе пользователей с большими справочниками или журналами документов стандартный поиск по динамическому списку нередко вызывает существенные просадки производительности СУБД. Нажатие клавиш Ctrl+F (стандартный поиск) или Alt+F (расширенный поиск) часто приводит к тяжелым SQL-запросам, блокирующим работу пользователей. Разберем, как решить задачу отключения этих сочетаний клавиш и самого механизма поиска на управляемой форме.
Самый простой и «чистый» способ отключить реакцию формы на горячие клавиши — исключить сами стандартные команды поиска из состава доступных действий таблицы. Выполним следующие действия по шагам:
СоставКоманд (или гиперссылку «Состав команд...»).Ctrl+F) и Расширенный поиск (отвечает за вызов по Alt+F).После отключения этих команд в таблице платформа перестает перехватывать указанные сочетания клавиш для выполнения поиска, и вызов стандартных окон прекращается.
Если требуется полностью убрать интерфейсные элементы строки поиска и предотвратить случайную активацию поиска при наборе символов, настроим свойства отображения таблицы динамического списка:
ПоложениеСтрокиПоиска в значение Нет.ПоложениеУправленияПоиском в значение Нет.ПоложениеСостоянияПоиска в значение Нет.ПоискПриВводе выберем значение Не использовать или Отключать (в зависимости от версии платформы).Данная настройка исключает отображение строки поиска над таблицей и предотвращает автоматический запуск фильтрации при случайном нажатии клавиш на клавиатуре.
Иногда требуется не просто убрать команды, а гарантированно перехватить нажатия клавиш Ctrl+F и Alt+F, чтобы назначить на них собственное действие либо показать информационное сообщение. Поскольку на уровне одной команды формы платформы 1С нельзя привязать сразу два сочетания клавиш, создадим две независимые команды-заглушки:
ЗапретПоискаCtrlF. В ее свойстве СочетаниеКлавиш зададим Ctrl+F.ЗапретПоискаAltF. В ее свойстве СочетаниеКлавиш зададим Alt+F.Отображение (сделаем только текст или уберем видимость заголовка). Обратите внимание: если задать свойство Видимость = Ложь у самой кнопки, в некоторых версиях платформы горячая клавиша перестает срабатывать. Поэтому кнопки лучше разместить в невидимой вспомогательной панели или группе свернутого вида, оставив свойство видимости активным.Посмотрим на пример обработчиков таких команд в модуле формы:
&НаКлиенте
Процедура ЗапретПоискаCtrlF(Команда)
ПоказатьОповещениеПользователя("Внимание", , "Полнотекстовый поиск по списку отключен администратором.", ОповещениеСтроки.Информация);
КонецПроцедуры
&НаКлиенте
Процедура ЗапретПоискаAltF(Команда)
// Оставляем пустым для полного подавления действия
КонецПроцедуры
Проанализируем, почему стандартный поиск может вызывать чрезмерное потребление ресурсов базы данных:
ОсновнаяТаблица, платформа не может применить полнотекстовый индекс. В этом случае поиск всегда преобразуется в SQL-запрос с конструкцией LIKE '%Значение%', приводящей к полному сканированию таблицы (Full Table Scan).ПОДОБНО '%Подстрока%'. Стандартные B-Tree индексы таблицы при таком условии не используются, что перегружает процессор и дисковую подсистему.Вместо полного сканирования таблицы рекомендуется организовать быстрый поиск с использованием точных совпадений или условия «начинается с». Для этого на форму выносятся отдельные поля ввода, а в коде накладывается отбор:
&НаКлиенте
Процедура ПолеПоискаПриИзменении(Элемент)
УстановитьОтборПоНачалуСтроки(Список, "Наименование", ПолеПоиска);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УстановитьОтборПоНачалуСтроки(ДинамическийСписок, ИмяПоля, ЗначениеОтбора)
ЭлементОтбора = Неопределено;
Для Каждого Элемент Из ДинамическийСписок.Отбор.Элементы Цикл
Если Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля) Тогда
ЭлементОтбора = Элемент;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭлементОтбора = Неопределено Тогда
ЭлементОтбора = ДинамическийСписок.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
КонецЕсли;
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НачинаетсяС;
ЭлементОтбора.ПравоеЗначение = ЗначениеОтбора;
ЭлементОтбора.Использование = ЗначениеЗаполнено(ЗначениеОтбора);
КонецПроцедуры
При использовании вида сравнения НачинаетсяС платформа генерирует SQL-условие LIKE 'Значение%' (без символа процента в начале). В таком сценарии СУБД успешно задействует индексы по соответствующему полю, и запрос выполняется мгновенно даже на многомиллионных таблицах.