Как программно сбросить или перехватить поиск по Ctrl+F в управляемой форме 1С?

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

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

Рассмотрим подробно особенности работы встроенного механизма поиска, выясним причины платформенных ограничений и разберем практические способы решения этой задачи.

Архитектурные ограничения интерактивного поиска

Проанализируем, как устроен интерактивный поиск платформы «1С:Предприятие 8.3»:

  1. Изоляция на уровне клиентского интерфейса: Интерактивный поиск по Ctrl+F и Alt+F в таблицах управляемых форм (для табличных частей и таблиц значений) выполняется исключительно на уровне визуального слоя платформы. Состояние этого фильтра не отражается в свойствах элементов формы или реквизитах данных.
  2. Отсутствие программного доступа: Во встроенном языке 1С нет штатных методов или свойств, позволяющих прочитать текущую строку поиска Ctrl+F, установить её значение или сбросить этот фильтр.
  3. Несовместимость со свойством ОтборСтрок: Интерактивный поиск не связан со свойством ОтборСтрок элемента таблицы. Если пользователь применил Ctrl+F, очистка свойства Элементы.Таблица.ОтборСтрок = Неопределено; не снимет визуальную фильтрацию.

Вариант 1. Эмуляция нажатия клавиш через WScript.Shell (SendKeys)

В рамках форума рассматривался вариант программной эмуляции нажатия комбинации клавиш отмены поиска Ctrl+Q (или повторного вызова окна поиска) через Windows Script Host. Разберем пример реализации:


&НаКлиенте
Процедура СброситьПоискSendKeys()
    #Если Клиент Тогда
        Попытка
            WshShell = Новый COMОбъект("WScript.Shell");
            // Отправляем комбинацию Ctrl+Q для отмены поиска
            WshShell.SendKeys("^q");
        Исключение
            // Обработка ошибки инициализации COM
        КонецПопытки;
    #КонецЕсли
КонецПроцедуры

Недостатки и ограничения данного метода:

  1. Метод работает исключительно на стороне Windows-клиента и не будет работать в веб-клиенте или под управлением Linux/macOS.
  2. Эмуляция клавиш всегда посылается в активное окно и на элемент, находящийся в текущем фокусе. Если фокус находится на другой закладке или другом реквизите формы, посылка SendKeys приведет к непредсказуемому поведению.

Вариант 2. Использование свойства «ОтборСтрок» для таблиц значений и ТЧ

Если требуется полный программный контроль над отбором, правильным решением будет отказ от стандартного поиска и переход на фильтрацию через свойство ОтборСтрок таблицы формы.

Посмотрим на пример установки и сброса фильтрации:


&НаКлиенте
Процедура УстановитьОтборПоКолонке(ИмяКолонки, ЗначениеОтбора)
    // Установка строгого равенства
    Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура(ИмяКолонки, ЗначениеОтбора);
КонецПроцедуры

&НаКлиенте
Процедура СброситьОтборСтрок()
    // Программный сброс отбора
    Элементы.Товары.ОтборСтрок = Неопределено;
КонецПроцедуры

Важная особенность: Свойство ОтборСтрок поддерживает только строгое совпадение по значению. Поиск по части подстроки с его помощью выполнить нельзя.

Вариант 3. Разделение данных на буферную и отображаемую таблицы

Когда требуется реализовать полнотекстовый поиск или поиск по подстроке без применения платформенного Ctrl+F, разберем по шагам создание двух коллекций:

  1. В реквизитах формы создаем скрытую таблицу-буфер (например, ВсеДанные) и рабочую таблицу, привязанную к элементу формы (ОтображаемыеДанные).
  2. На форму добавляем собственное строковое поле ввода для поиска.
  3. При изменении строки поиска перезаполняем отображаемую таблицу отфильтрованными строками из буфера.

Пример программного поиска и сброса:


&НаСервере
Процедура ПрименитьПоискПоПодстрокеНаСервере(СтрокаПоиска)
    ОтображаемыеДанные.Очистить();
    
    Если ПустаяСтрока(СтрокаПоиска) Тогда
        // Сброс поиска: возвращаем все данные из буфера
        Для Каждого Стр Из ВсеДанные Цикл
            ЗаполнитьЗначенияСвойств(ОтображаемыеДанные.Добавить(), Стр);
        КонецЦикла;
        Возврат;
    КонецЕсли;
    
    // Фильтрация по вхождению подстроки
    СтрокаПоискаВРегистре = ВРег(СтрокаПоиска);
    Для Каждого Стр Из ВсеДанные Цикл
        Если СтрНайти(ВРег(Стр.НоменклатураНаименование), СтрокаПоискаВРегистре) > 0 Тогда
            ЗаполнитьЗначенияСвойств(ОтображаемыеДанные.Добавить(), Стр);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Вариант 4. Перехват стандартного сочетания Ctrl+F

Чтобы исключить вызов неуправляемого платформенного поиска пользователями, мы можем переопределить горячую клавишу Ctrl+F на самой форме:

  1. В свойствах командной панели таблицы отключаем стандартные кнопки поиска.
  2. Создаем пользовательскую команду формы (например, КомандаНайтиВТаблице) и назначаем ей сочетание клавиш Ctrl+F.
  3. В обработчике команды программно переносим фокус в наше кастомное поле поиска:

&НаКлиенте
Процедура КомандаНайтиВТаблице(Команда)
    // Переводим фокус на кастомное поле отбора
    ТекущийЭлемент = Элементы.ПолеВводаПоиска;
КонецПроцедуры

Вариант 5. Использование динамического списка

Если таблица предназначена только для просмотра или выбора данных (например, в формах подбора или рабочих местах), наиболее гибким решением является переход с таблицы значений на Динамический список.

В динамических списках все установленные отборы и параметры компоновки данных полностью доступны через коллекцию ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Отбор, что позволяет гарантированно сбрасывать и программно переопределять любые пользовательские фильтры.

← На главную