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

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

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

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

Почему свойство ОтборСтрок не возвращает результат поиска

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

Выясним причину такого поведения:

  1. Свойство ОтборСтрок предназначено исключительно для программного наложения фильтра через тип ФиксированнаяСтруктура.
  2. Интерактивный поиск работает исключительно на уровне визуального представления таблицы формы (интерфейсный слой) и не модифицирует саму коллекцию данных объекта.
  3. Табличные части и таблицы значений на форме не хранят текст или схему интерактивного пользовательского поиска в виде готовых условий отбора.

Основное решение: метод ПроверитьСтроку

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

Рассмотрим ключевые особенности работы этого метода:

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

Посмотрим на базовый пример перебора строк на клиенте:


&НаКлиенте
Процедура ОбработатьНайденныеСтроки(Команда)

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

КонецПроцедуры

Пошаговый алгоритм: пакетная обработка и передача данных на сервер

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

Разберем по шагам реализацию клиент-серверного взаимодействия:

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

Рассмотрим программную реализацию этого алгоритма:


&НаКлиенте
Процедура ВыполнитьОбработкуОтфильтрованныхСтрок(Команда)

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

КонецПроцедуры

&НаСервере
Процедура ОбработатьВыбранныеСтрокиНаСервере(МассивИдентификаторов)

    Для Каждого ИД Из МассивИдентификаторов Цикл
        СтрокаОбъекта = Объект.Товары.НайтиПоИдентификатору(ИД);
        Если СтрокаОбъекта <> Неопределено Тогда
            // Выполняем необходимые действия над строкой
            СтрокаОбъекта.Пометка = Истина;
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

Альтернативные способы работы с результатами отбора

Помимо поочередной проверки каждой строки, существуют альтернативные варианты решения задачи в зависимости от сценария:

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

Важные ограничения производительности

Проанализируем ограничения, о которых важно помнить при использовании метода ПроверитьСтроку():

  1. Метод не предназначен для пакетной обработки огромных массивов данных. Если табличная часть содержит десятки тысяч строк, перебор и проверка каждой строки на клиенте могут вызвать кратковременное зависание пользовательского интерфейса.
  2. Для работы с большими объемами данных рекомендуется применять серверную фильтрацию с помощью запросов или использовать динамические списки вместо табличных частей.
← На главную