Как отключить горячие клавиши поиска Ctrl+F и Alt+F в динамическом списке 1С?

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

При работе пользователей с большими справочниками или журналами документов стандартный поиск по динамическому списку нередко вызывает существенные просадки производительности СУБД. Нажатие клавиш Ctrl+F (стандартный поиск) или Alt+F (расширенный поиск) часто приводит к тяжелым SQL-запросам, блокирующим работу пользователей. Разберем, как решить задачу отключения этих сочетаний клавиш и самого механизма поиска на управляемой форме.

Способ 1. Отключение стандартных команд в таблице динамического списка

Самый простой и «чистый» способ отключить реакцию формы на горячие клавиши — исключить сами стандартные команды поиска из состава доступных действий таблицы. Выполним следующие действия по шагам:

  1. Откроем форму в конфигураторе и выберем элемент управления — таблицу, отображающую динамический список.
  2. В палитре свойств найдем свойство СоставКоманд (или гиперссылку «Состав команд...»).
  3. В открывшемся окне снимем флажки со стандартных команд Найти (отвечает за вызов по Ctrl+F) и Расширенный поиск (отвечает за вызов по Alt+F).
  4. Сохраним изменения.

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

Способ 2. Отключение элементов отображения поиска и ввода

Если требуется полностью убрать интерфейсные элементы строки поиска и предотвратить случайную активацию поиска при наборе символов, настроим свойства отображения таблицы динамического списка:

  1. В свойствах таблицы списка найдем раздел Поиск.
  2. Установим свойство ПоложениеСтрокиПоиска в значение Нет.
  3. Установим свойство ПоложениеУправленияПоиском в значение Нет.
  4. Установим свойство ПоложениеСостоянияПоиска в значение Нет.
  5. В свойстве ПоискПриВводе выберем значение Не использовать или Отключать (в зависимости от версии платформы).

Данная настройка исключает отображение строки поиска над таблицей и предотвращает автоматический запуск фильтрации при случайном нажатии клавиш на клавиатуре.

Способ 3. Перехват горячих клавиш пользовательскими командами-заглушками

Иногда требуется не просто убрать команды, а гарантированно перехватить нажатия клавиш Ctrl+F и Alt+F, чтобы назначить на них собственное действие либо показать информационное сообщение. Поскольку на уровне одной команды формы платформы 1С нельзя привязать сразу два сочетания клавиш, создадим две независимые команды-заглушки:

  1. В редакторе формы перейдем на вкладку Команды.
  2. Создадим первую команду, например, ЗапретПоискаCtrlF. В ее свойстве СочетаниеКлавиш зададим Ctrl+F.
  3. Создадим вторую команду ЗапретПоискаAltF. В ее свойстве СочетаниеКлавиш зададим Alt+F.
  4. Перетащим обе команды в элементы формы (например, в командную панель формы или вспомогательную группу).
  5. В свойствах кнопок на форме снимем флажок Отображение (сделаем только текст или уберем видимость заголовка). Обратите внимание: если задать свойство Видимость = Ложь у самой кнопки, в некоторых версиях платформы горячая клавиша перестает срабатывать. Поэтому кнопки лучше разместить в невидимой вспомогательной панели или группе свернутого вида, оставив свойство видимости активным.

Посмотрим на пример обработчиков таких команд в модуле формы:


&НаКлиенте
Процедура ЗапретПоискаCtrlF(Команда)
    ПоказатьОповещениеПользователя("Внимание", , "Полнотекстовый поиск по списку отключен администратором.", ОповещениеСтроки.Информация);
КонецПроцедуры

&НаКлиенте
Процедура ЗапретПоискаAltF(Команда)
    // Оставляем пустым для полного подавления действия
КонецПроцедуры

Выясним причину: почему поиск в динамическом списке создает высокую нагрузку

Проанализируем, почему стандартный поиск может вызывать чрезмерное потребление ресурсов базы данных:

  1. Отсутствие основной таблицы в динамическом списке: если запрос динамического списка является произвольным и в нем не заполнено свойство ОсновнаяТаблица, платформа не может применить полнотекстовый индекс. В этом случае поиск всегда преобразуется в SQL-запрос с конструкцией LIKE '%Значение%', приводящей к полному сканированию таблицы (Full Table Scan).
  2. Неактуальность индекса полнотекстового поиска: если регламентные задания слияния и обновления полнотекстового индекса отключены или отстают по времени, платформа принудительно переключается на прямой поиск через СУБД с неиндексируемым условием.
  3. Режим «Расширенный поиск» (Alt+F): когда пользователь выбирает режим отбора «содержит» по строковому полю, СУБД всегда выполняет поиск по условию ПОДОБНО '%Подстрока%'. Стандартные B-Tree индексы таблицы при таком условии не используются, что перегружает процессор и дисковую подсистему.

Альтернативное решение: организация быстрых отборов

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


&НаКлиенте
Процедура ПолеПоискаПриИзменении(Элемент)
    УстановитьОтборПоНачалуСтроки(Список, "Наименование", ПолеПоиска);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура УстановитьОтборПоНачалуСтроки(ДинамическийСписок, ИмяПоля, ЗначениеОтбора)
    ЭлементОтбора = Неопределено;
    Для Каждого Элемент Из ДинамическийСписок.Отбор.Элементы Цикл
        Если Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля) Тогда
            ЭлементОтбора = Элемент;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Если ЭлементОтбора = Неопределено Тогда
        ЭлементОтбора = ДинамическийСписок.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
    КонецЕсли;
    
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НачинаетсяС;
    ЭлементОтбора.ПравоеЗначение = ЗначениеОтбора;
    ЭлементОтбора.Использование = ЗначениеЗаполнено(ЗначениеОтбора);
КонецПроцедуры

При использовании вида сравнения НачинаетсяС платформа генерирует SQL-условие LIKE 'Значение%' (без символа процента в начале). В таком сценарии СУБД успешно задействует индексы по соответствующему полю, и запрос выполняется мгновенно даже на многомиллионных таблицах.

← На главную