При разработке интерфейсов на управляемых формах 1С программисты часто сталкиваются с задачей управления фильтрацией данных в таблицах значений и табличных частях. Одной из частых проблем становится попытка программно очистить или отменить поиск, который пользователь вызвал с помощью стандартной комбинации клавиш Ctrl+F или Alt+F.
Рассмотрим подробно особенности работы встроенного механизма поиска, выясним причины платформенных ограничений и разберем практические способы решения этой задачи.
Проанализируем, как устроен интерактивный поиск платформы «1С:Предприятие 8.3»:
Ctrl+F и Alt+F в таблицах управляемых форм (для табличных частей и таблиц значений) выполняется исключительно на уровне визуального слоя платформы. Состояние этого фильтра не отражается в свойствах элементов формы или реквизитах данных.Ctrl+F, установить её значение или сбросить этот фильтр.ОтборСтрок: Интерактивный поиск не связан со свойством ОтборСтрок элемента таблицы. Если пользователь применил Ctrl+F, очистка свойства Элементы.Таблица.ОтборСтрок = Неопределено; не снимет визуальную фильтрацию.В рамках форума рассматривался вариант программной эмуляции нажатия комбинации клавиш отмены поиска Ctrl+Q (или повторного вызова окна поиска) через Windows Script Host. Разберем пример реализации:
&НаКлиенте
Процедура СброситьПоискSendKeys()
#Если Клиент Тогда
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
// Отправляем комбинацию Ctrl+Q для отмены поиска
WshShell.SendKeys("^q");
Исключение
// Обработка ошибки инициализации COM
КонецПопытки;
#КонецЕсли
КонецПроцедуры
Недостатки и ограничения данного метода:
SendKeys приведет к непредсказуемому поведению.Если требуется полный программный контроль над отбором, правильным решением будет отказ от стандартного поиска и переход на фильтрацию через свойство ОтборСтрок таблицы формы.
Посмотрим на пример установки и сброса фильтрации:
&НаКлиенте
Процедура УстановитьОтборПоКолонке(ИмяКолонки, ЗначениеОтбора)
// Установка строгого равенства
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура(ИмяКолонки, ЗначениеОтбора);
КонецПроцедуры
&НаКлиенте
Процедура СброситьОтборСтрок()
// Программный сброс отбора
Элементы.Товары.ОтборСтрок = Неопределено;
КонецПроцедуры
Важная особенность: Свойство ОтборСтрок поддерживает только строгое совпадение по значению. Поиск по части подстроки с его помощью выполнить нельзя.
Когда требуется реализовать полнотекстовый поиск или поиск по подстроке без применения платформенного Ctrl+F, разберем по шагам создание двух коллекций:
ВсеДанные) и рабочую таблицу, привязанную к элементу формы (ОтображаемыеДанные).Пример программного поиска и сброса:
&НаСервере
Процедура ПрименитьПоискПоПодстрокеНаСервере(СтрокаПоиска)
ОтображаемыеДанные.Очистить();
Если ПустаяСтрока(СтрокаПоиска) Тогда
// Сброс поиска: возвращаем все данные из буфера
Для Каждого Стр Из ВсеДанные Цикл
ЗаполнитьЗначенияСвойств(ОтображаемыеДанные.Добавить(), Стр);
КонецЦикла;
Возврат;
КонецЕсли;
// Фильтрация по вхождению подстроки
СтрокаПоискаВРегистре = ВРег(СтрокаПоиска);
Для Каждого Стр Из ВсеДанные Цикл
Если СтрНайти(ВРег(Стр.НоменклатураНаименование), СтрокаПоискаВРегистре) > 0 Тогда
ЗаполнитьЗначенияСвойств(ОтображаемыеДанные.Добавить(), Стр);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Чтобы исключить вызов неуправляемого платформенного поиска пользователями, мы можем переопределить горячую клавишу Ctrl+F на самой форме:
КомандаНайтиВТаблице) и назначаем ей сочетание клавиш Ctrl+F.
&НаКлиенте
Процедура КомандаНайтиВТаблице(Команда)
// Переводим фокус на кастомное поле отбора
ТекущийЭлемент = Элементы.ПолеВводаПоиска;
КонецПроцедуры
Если таблица предназначена только для просмотра или выбора данных (например, в формах подбора или рабочих местах), наиболее гибким решением является переход с таблицы значений на Динамический список.
В динамических списках все установленные отборы и параметры компоновки данных полностью доступны через коллекцию ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Отбор, что позволяет гарантированно сбрасывать и программно переопределять любые пользовательские фильтры.