Как программно узнать, что именно искал пользователь в таблице через поиск (Ctrl+F)

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

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача не просто отобразить данные, но и программно обработать результат действий пользователя. Одной из таких задач является попытка узнать, какой именно текст был введен в стандартное окно поиска (вызываемое по Ctrl+F) и по каким колонкам был произведен отбор в таблице управляемой формы. Сложность заключается в том, что интерактивный поиск в табличных частях работает на уровне презентационного слоя (UI) и не меняет саму коллекцию данных в объекте. Рассмотрим подробнее, какие инструменты предоставляет нам платформа для решения этой задачи и какие существуют ограничения.

Анализ видимости строк: метод косвенного определения

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

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


// Получаем коллекцию данных и элемент формы
Тч = Объект.Товары; 
ЭлементТаблица = Элементы.Товары; 
КолОтобранныхСтрок = 0; 

Для Каждого СтрокаТч из Тч Цикл 
    // Получаем идентификатор строки для проверки
    ИдентификаторСтроки = СтрокаТч.ПолучитьИдентификатор();
    
    // Проверяем, отображается ли строка в данный момент в интерфейсе
    ФлагСтрокаОтображена = ЭлементТаблица.ПроверитьСтроку(ИдентификаторСтроки); 
    
    Если ФлагСтрокаОтображена Тогда 
        КолОтобранныхСтрок = КолОтобранныхСтрок + 1; 
    КонецЕсли; 
КонецЦикла; 

Сообщить("Пользователь видит строк: " + КолОтобранныхСтрок);

Важный нюанс: метод ПроверитьСтроку может вызывать исключение в версиях платформы ниже 8.3.17 или при определенных режимах совместимости, если строка была удалена. Проанализируем более безопасный подход — использование метода ДанныеСтроки. Если метод возвращает Неопределено, значит, строка либо скрыта поиском, либо отсутствует.


Для Каждого СтрокаТч из Тч Цикл 
    Данные = Элементы.Товары.ДанныеСтроки(СтрокаТч.ПолучитьИдентификатор());
    Если Данные <> Неопределено Тогда
        // Строка видна пользователю
    КонецЕсли;
КонецЦикла;

Извлечение текста поиска из системного хранилища

Если нам критически важно получить именно текст, который ввел пользователь, мы можем обратиться к системным механизмам сохранения настроек. Платформа 1С сохраняет историю поиска в специальном объекте ИсторияПоискаТаблицы. Этот объект сериализуется и хранится в системных настройках.

Рассмотрим, как программно прочитать эти данные. Ключ объекта для поиска в системном хранилище формируется по шаблону: "Общее/ИсторияПоискаТаблицы/" + ПутьКФорме + "." + ИмяЭлементаТаблицы.

Выясним, как это реализовать на практике:


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

Проанализировав строку, полученную через ЗначениеВСтрокуВнутр, мы увидим структуру массива, где хранятся имена колонок и значения поиска. Например, если искали "Гайка" в колонке "Наименование", в строке будет присутствовать фрагмент типа {"Наименование",1,{"S","Гайка"},"Гайка"}.

Важные ограничения этого метода:

  1. Задержка записи: Платформа сбрасывает данные в ХранилищеСистемныхНастроек обычно при закрытии формы или завершении сеанса. Получить текст поиска "мгновенно" (сразу после нажатия кнопки "Найти") этим способом крайне затруднительно.
  2. Тип поиска: В историю чаще всего попадает именно "Расширенный поиск". Быстрый поиск по первым буквам может не фиксироваться данным механизмом.
  3. Версия платформы: Данный механизм доступен начиная с версии 8.3.5.

Различие между Табличной частью и Динамическим списком

Нужно четко разделять, с каким объектом мы работаем. Если таблица отображает Динамический список, то параметры поиска можно попробовать извлечь через КомпоновщикНастроек. В динамическом списке поиск часто преобразуется в элементы отбора или параметры запроса.

Если же перед нами Табличная часть (как в документе или обработке), то стандартный поиск Ctrl+F является чисто визуальным механизмом. В этом случае у элемента формы Таблица нет свойства ОтборСтрок, которое было бы доступно для чтения (хотя такое свойство есть у таблиц в Обычных формах, в Управляемых формах оно работает иначе).

Альтернативное решение: Собственный поиск

Если бизнес-логика требует гарантированного перехвата строки поиска в реальном времени, рассмотрим вариант создания собственного интерфейса поиска:

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

Пример программной фильтрации строк табличной части:


&НаКлиенте
Процедура ПолеПоискаПриИзменении(Элемент)
    ТекстПоиска = Элемент.ТекстРедактирования;
    // Логика фильтрации:
    // В Управляемых формах для ТЧ нет прямого программного фильтра "как Ctrl+F",
    // поэтому мы можем либо использовать метод "Видимость" (только для строк ДинСписка),
    // либо перезаполнять вспомогательную коллекцию (Массив/ТаблицаЗначений), 
    // которая служит источником данных для таблицы формы.
КонецПроцедуры

Подведем итоги

Штатного и мгновенного способа получить строку из стандартного диалога поиска Ctrl+F для табличной части не существует. Однако мы можем:

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

← На главную