Как программно выполнить или отследить поиск в табличной части управляемой формы?

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

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

Понимание природы механизма поиска Ctrl+F

Первое, что нам необходимо уяснить — это архитектурное различие между поиском и отбором в платформе 1С:Предприятие 8.3.

Механизм поиска, вызываемый по Ctrl+F, является встроенной функциональностью платформы, которая работает на уровне интерфейса пользователя. Его основная задача — визуальное позиционирование (фокусировка) на нужной строке табличной части или подсветка значений. Поскольку это чисто интерфейсный «сервисный» инструмент, платформа не сохраняет введенные пользователем параметры поиска (строку поиска, выбранную колонку) в объектах метаданных или свойствах формы.

Именно поэтому при попытке найти «отбор поиска» в отладчике, вы не обнаружите соответствующих свойств. Внутренние параметры поиска существуют исключительно в контексте активного клиентского окна и не имеют публичного программного интерфейса для доступа из кода 1С.

Почему свойство «ОтборСтрок» — это другое

Многие разработчики путают поиск с возможностью фильтрации данных через свойство ОтборСтрок. Давайте разберем разницу:

  1. Поиск (Ctrl+F): Не меняет состав данных, а просто перемещает курсор или подсвечивает результат. Состояние не сохраняется.
  2. ОтборСтрок: Это свойство элемента управления «Таблица» на форме. Когда вы его устанавливаете, платформа физически скрывает из отображения все строки, которые не соответствуют заданному условию. Это свойство является публичным, его можно читать и программно изменять.

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

Как реализовать программный поиск (аналог Ctrl+F)

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

Шаг 1: Обход коллекции данных

Чтобы найти нужную строку, необходимо перебрать коллекцию данных, к которой привязана табличная часть (это может быть ДанныеФормыКоллекция или выборка запроса в случае с динамическим списком).

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


// Предположим, у нас есть ТЧ "Товары" и мы ищем товар по артикулу
ИскомыйАртикул = "12345";
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    Если СтрокаТЧ.Артикул = ИскомыйАртикул Тогда
        // Нашли строку, теперь нужно установить фокус
        Элементы.Товары.ТекущаяСтрока = СтрокаТЧ.ПолучитьИдентификатор();
        Прервать;
    КонецЕсли;
КонецЦикла;

Шаг 2: Использование динамических списков

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

В отличие от ОтборСтрок, изменение отбора динамического списка приводит к выполнению нового SQL-запроса к базе данных, что работает значительно быстрее.

Рассмотрим пример установки отбора:


// Программная установка отбора для динамического списка
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Артикул");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = "12345";
ЭлементОтбора.Использование = Истина;

Заключение: подводим итоги

Мы выяснили, что прямой доступ к «результатам» поиска Ctrl+F отсутствует, так как это инструмент интерфейса, а не данных. Для решения практических задач используйте:

Помните, что лучший путь для автоматизации — это не попытка «взломать» работу стандартного поиска, а построение собственной логики фильтрации и навигации, которая будет предсказуемой и управляемой из вашего кода.

← На главную