В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда пользователю предоставляется возможность интерактивного поиска в таблице значений, выведенной на форму. После того как пользователь ввел поисковый запрос и часть строк скрылась, разработчику может потребоваться программно обработать только те данные, которые остались видимыми на экране. В этой статье мы подробно разберем, как решить эту задачу, проанализируем доступные методы и выясним, какой из них наиболее эффективен для управляемых форм.
Наиболее универсальным и корректным способом для управляемых форм является использование метода элемента формы ПроверитьСтроку(). Этот метод позволяет определить, удовлетворяет ли строка текущим условиям видимости, которые наложил поиск или отбор.
Давайте разберем алгоритм действий по шагам:
Объект.Товары).ПроверитьСтроку().Рассмотрим пример кода, который реализует этот подход:
// Предположим, имя таблицы на форме — ТаблицаТовары
// Источник данных — Объект.Товары (Таблица значений или ДанныеФормыКоллекция)
МассивВидимыхСтрок = Новый Массив;
Для Каждого СтрокаДанных Из Объект.Товары Цикл
// Получаем идентификатор строки
Идентификатор = СтрокаДанных.ПолучитьИдентификатор();
// Проверяем, видна ли строка с учетом поиска
Если Элементы.ТаблицаТовары.ПроверитьСтроку(Идентификатор) Тогда
МассивВидимыхСтрок.Добавить(СтрокаДанных);
КонецЕсли;
КонецЦикла;
// Теперь в переменной МассивВидимыхСтрок содержатся только те строки,
// которые пользователь видит в данный момент.
Важный нюанс: метод ПроверитьСтроку() возвращает Истина, если строка проходит и через установленные отборы, и через механизм интерактивного поиска. Это делает метод самым надежным инструментом.
Существует альтернативный, «быстрый» способ, основанный на использовании коллекции ВыделенныеСтроки. Он может быть полезен, если нам нужно получить данные в ответ на конкретное действие пользователя, но он требует осторожности в реализации.
Проанализируем ситуацию: если мы программно выделим все строки таблицы (аналог нажатия Ctrl+A), то в коллекцию выделенных строк попадут только те строки, которые в данный момент отображаются на форме. Те строки, которые скрыты поиском, выделены не будут.
Посмотрим на пример реализации:
// Очищаем текущее выделение (необязательно, но рекомендуется)
Элементы.ТаблицаТовары.ВыделенныеСтроки.Очистить();
// В некоторых случаях можно попросить пользователя выделить строки
// или использовать метод выделения всех видимых строк (если это доступно)
// Затем просто обходим коллекцию идентификаторов:
Для Каждого ИдентификаторСтроки Из Элементы.ТаблицаТовары.ВыделенныеСтроки Цикл
СтрокаДанных = Объект.Товары.НайтиПоИдентификатору(ИдентификаторСтроки);
// Обработка данных
КонецЦикла;
Однако у этого метода есть существенные недостатки. Во-первых, программное выделение всех строк может визуально «мигнуть» в интерфейсе, что не всегда приятно пользователю. Во-вторых, на очень больших таблицах операция выделения может работать медленнее, чем простой перебор с проверкой видимости.
Если задача состоит в том, чтобы получить данные именно в том виде и порядке, в котором их видит пользователь (включая сортировку и группировки), можно воспользоваться штатной командой «Вывести список». Программно это реализуется через вывод таблицы в ТабличныйДокумент.
Выясним причину, почему это эффективно: платформа при формировании табличного документа автоматически учитывает все наложенные фильтры, поисковые запросы и даже состав колонок. Мы можем программно вызвать это действие, не показывая результат пользователю, и прочитать данные из полученного документа.
Рассмотрим важный теоретический момент. Если на вашей форме используется не ТаблицаЗначений, а ДинамическийСписок, механизмы поиска работают иначе. Интерактивный поиск в динамическом списке накладывает условия непосредственно на запрос к базе данных.
Для динамического списка метод ПроверитьСтроку() также работает, но если вам нужно получить все строки, попавшие в поиск (а их могут быть тысячи), лучше использовать КомпоновщикНастроек. Однако стоит помнить, что строка поиска (SearchString) часто хранится в пользовательских настройках компоновщика и не всегда доступна напрямую как обычное условие отбора.
В современных версиях платформы (8.3.10 и выше) у элемента формы «Таблица» появилось событие ПриИзмененииПараметровПоиска. Рассмотрим подробнее, как его использовать. Это событие срабатывает каждый раз, когда пользователь вводит текст в поле поиска или очищает его.
Внутри этого обработчика мы можем получить доступ к свойству ПараметрыПоиска. Это позволяет нам узнать сам текст поиска и программно применить аналогичную логику к исходной таблице значений, например, используя метод НайтиСтроки() или построитель запроса, если данные предварительно выгружены в менеджер временных таблиц.
При выборе метода всегда учитывайте объем данных:
ПроверитьСтроку() в цикле отработает мгновенно.ПриОбновленииСоставаОтображаемыхДанных для тяжелых вычислений, так как они вызываются крайне часто — при каждом скролле или изменении размера окна.Подведем итог: для большинства практических задач в 1С самым надежным и простым в реализации способом остается перебор коллекции с вызовом ПроверитьСтроку(). Он гарантирует корректность результата независимо от того, использовал ли пользователь сложный отбор или простую строку поиска.