В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача не просто отобразить данные, но и программно обработать результат действий пользователя. Одной из таких задач является попытка узнать, какой именно текст был введен в стандартное окно поиска (вызываемое по Ctrl+F) и по каким колонкам был произведен отбор в таблице управляемой формы. Сложность заключается в том, что интерактивный поиск в табличных частях работает на уровне презентационного слоя (UI) и не меняет саму коллекцию данных в объекте. Рассмотрим подробнее, какие инструменты предоставляет нам платформа для решения этой задачи и какие существуют ограничения.
Первый и самый простой способ — это проанализировать, какие строки остались видимыми после того, как пользователь применил поиск. Мы не узнаем сам текст поиска напрямую, но сможем понять, какие данные прошли фильтр. Для этого мы можем перебрать все строки табличной части и проверить их состояние в элементе формы Таблица.
Разберем пример кода, который позволяет подсчитать количество отобранных строк:
// Получаем коллекцию данных и элемент формы
Тч = Объект.Товары;
ЭлементТаблица = Элементы.Товары;
КолОтобранныхСтрок = 0;
Для Каждого СтрокаТч из Тч Цикл
// Получаем идентификатор строки для проверки
ИдентификаторСтроки = СтрокаТч.ПолучитьИдентификатор();
// Проверяем, отображается ли строка в данный момент в интерфейсе
ФлагСтрокаОтображена = ЭлементТаблица.ПроверитьСтроку(ИдентификаторСтроки);
Если ФлагСтрокаОтображена Тогда
КолОтобранныхСтрок = КолОтобранныхСтрок + 1;
КонецЕсли;
КонецЦикла;
Сообщить("Пользователь видит строк: " + КолОтобранныхСтрок);
Важный нюанс: метод ПроверитьСтроку может вызывать исключение в версиях платформы ниже 8.3.17 или при определенных режимах совместимости, если строка была удалена. Проанализируем более безопасный подход — использование метода ДанныеСтроки. Если метод возвращает Неопределено, значит, строка либо скрыта поиском, либо отсутствует.
Для Каждого СтрокаТч из Тч Цикл
Данные = Элементы.Товары.ДанныеСтроки(СтрокаТч.ПолучитьИдентификатор());
Если Данные <> Неопределено Тогда
// Строка видна пользователю
КонецЕсли;
КонецЦикла;
Если нам критически важно получить именно текст, который ввел пользователь, мы можем обратиться к системным механизмам сохранения настроек. Платформа 1С сохраняет историю поиска в специальном объекте ИсторияПоискаТаблицы. Этот объект сериализуется и хранится в системных настройках.
Рассмотрим, как программно прочитать эти данные. Ключ объекта для поиска в системном хранилище формируется по шаблону: "Общее/ИсторияПоискаТаблицы/" + ПутьКФорме + "." + ИмяЭлементаТаблицы.
Выясним, как это реализовать на практике:
&НаСервере
Процедура ПолучитьТекстПоследнегоПоиска()
// Укажите путь к вашей форме и имя таблицы
КлючНастройки = "Общее/ИсторияПоискаТаблицы/Справочник.Номенклатура.Форма.ФормаСписка.Список";
// Загружаем объект из хранилища системных настроек
ОбъектИстория = ХранилищеСистемныхНастроек.Загрузить(КлючНастройки, "");
Если ОбъектИстория <> Неопределено Тогда
// Поскольку объект не имеет доступных свойств в языке,
// используем хитрость с внутренней сериализацией
ТекстВнутр = ЗначениеВСтрокуВнутр(ОбъектИстория);
Сообщить("Внутренние данные поиска: " + ТекстВнутр);
КонецЕсли;
КонецПроцедуры
Проанализировав строку, полученную через ЗначениеВСтрокуВнутр, мы увидим структуру массива, где хранятся имена колонок и значения поиска. Например, если искали "Гайка" в колонке "Наименование", в строке будет присутствовать фрагмент типа {"Наименование",1,{"S","Гайка"},"Гайка"}.
Важные ограничения этого метода:
ХранилищеСистемныхНастроек обычно при закрытии формы или завершении сеанса. Получить текст поиска "мгновенно" (сразу после нажатия кнопки "Найти") этим способом крайне затруднительно.Нужно четко разделять, с каким объектом мы работаем. Если таблица отображает Динамический список, то параметры поиска можно попробовать извлечь через КомпоновщикНастроек. В динамическом списке поиск часто преобразуется в элементы отбора или параметры запроса.
Если же перед нами Табличная часть (как в документе или обработке), то стандартный поиск Ctrl+F является чисто визуальным механизмом. В этом случае у элемента формы Таблица нет свойства ОтборСтрок, которое было бы доступно для чтения (хотя такое свойство есть у таблиц в Обычных формах, в Управляемых формах оно работает иначе).
Если бизнес-логика требует гарантированного перехвата строки поиска в реальном времени, рассмотрим вариант создания собственного интерфейса поиска:
ПоложениеСтрокиПоиска в значение Нет, чтобы скрыть стандартную панель.ПолеПоиска.ПриИзменении этого поля программно установим отбор.Пример программной фильтрации строк табличной части:
&НаКлиенте
Процедура ПолеПоискаПриИзменении(Элемент)
ТекстПоиска = Элемент.ТекстРедактирования;
// Логика фильтрации:
// В Управляемых формах для ТЧ нет прямого программного фильтра "как Ctrl+F",
// поэтому мы можем либо использовать метод "Видимость" (только для строк ДинСписка),
// либо перезаполнять вспомогательную коллекцию (Массив/ТаблицаЗначений),
// которая служит источником данных для таблицы формы.
КонецПроцедуры
Штатного и мгновенного способа получить строку из стандартного диалога поиска Ctrl+F для табличной части не существует. Однако мы можем:
ПроверитьСтроку() или ДанныеСтроки() для определения списка видимых элементов.ХранилищеСистемныхНастроек для получения истории поиска прошлых сеансов.Выбор метода зависит от того, нужно ли вам просто знать результат фильтрации или же сам текст критерия для дальнейшей обработки. При необходимости можно воспользоваться инструментом для гибкого поиска в списках.