Как перебрать только видимые на форме строки табличной части в 1С:Предприятии 8.3 Управляемые формы?

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

В работе с управляемыми формами 1С:Предприятия часто возникает задача обработать или выделить только те строки табличной части, которые в данный момент отображаются на форме. Это может быть особенно актуально, когда пользователи применяют различные фильтры – как интерактивные, так и программные. Давайте подробно разберем, как решить эту задачу и избежать распространенных ошибок.

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

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

  1. Пользовательский отбор (быстрый отбор или "Расширенный поиск"): Этот фильтр устанавливается пользователем интерактивно непосредственно над таблицей формы. Он очень удобен для быстрой фильтрации данных, но его особенность заключается в том, что он работает на клиентской стороне и не хранится в явном виде, доступном для программного считывания как свойство элемента формы.
  2. Программный отбор через свойство ОтборСтрок: Разработчик может установить этот отбор программно для элемента формы типа ТаблицаФормы. Он явно задаётся в коде и может быть динамически изменен.
  3. Отбор на уровне источника данных: Если табличная часть является частью динамического списка (например, для отображения регистров, справочников и т.д.), отбор может быть задан непосредственно в запросе к источнику данных или в настройках самого динамического списка. В этом случае данные уже приходят на форму отфильтрованными.

Наша задача – учесть все эти виды отбора и перебрать только те строки, которые действительно видны пользователю.

Использование метода ПроверитьСтроку() для определения видимости

Платформа 1С:Предприятие предоставляет мощный механизм для проверки видимости строк – метод ПроверитьСтроку(), доступный для элемента формы типа ТаблицаФормы. Мы рассмотрим его подробнее.

Метод Элементы.МояТаблицаФормы.ПроверитьСтроку() позволяет определить, отображается ли конкретная строка табличной части на форме, принимая во внимание все примененные отборы – как пользовательские, так и программные.

  1. Параметр метода: Идентификатор строки.

    Ключевым моментом, который часто вызывает затруднения, является правильная передача параметра в метод ПроверитьСтроку(). Согласно документации и практическому опыту, необходимо передавать не саму объектную строку табличной части (например, элемент коллекции Объект.МояТабличнаяЧасть), а её идентификатор. Идентификатор строки можно получить с помощью метода ПолучитьИдентификатор(), который доступен для каждой строки табличной части.

    Если мы попытаемся передать непосредственно объект строки табличной части, метод ПроверитьСтроку() может работать некорректно или возвращать неожиданные значения, как было показано в обсуждении на форуме.

    
    // Некорректный пример (может не работать или работать не так, как ожидается)
    // Элементы.СписокСДИЗ.ПроверитьСтроку(Строчка) 
    
    
    // Корректный пример
    // Элементы.СписокСДИЗ.ПроверитьСтроку(Строчка.ПолучитьИдентификатор())
    
  2. Возвращаемое значение метода.

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

    • Истина: Строка отображается на форме (т.е. проходит все примененные отборы).
    • Ложь: Строка существует в источнике данных, но отфильтрована и не отображается на форме.
    • Неопределено: Этот результат может быть возвращен в нескольких случаях:
      • Если таблица не отображается на форме.
      • Если в таблице нет строк.
      • Если переданная строка (или её идентификатор) отсутствует в таблице.

    Для нашей задачи – перебора видимых строк – нас интересует только случай, когда метод возвращает Истина.

Практический пример: перебор видимых строк

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


// Процедура для обработки только видимых строк табличной части
Процедура ОбработатьВидимыеСтрокиТабличнойЧасти()

    // Получаем ссылку на элемент формы "ТаблицаФормы"
    // Замените "СписокСДИЗ" на имя вашего элемента формы, соответствующего табличной части
    ТаблицаФормы = Элементы.СписокСДИЗ; 

    // Проверяем, что элемент формы существует и является таблицей
    Если ТаблицаФормы = Неопределено Или ТипЗнч(ТаблицаФормы) <> Тип("ТаблицаФормы") Тогда
        Сообщить("Элемент формы 'СписокСДИЗ' не найден или не является таблицей.", СтатусСообщения.Внимание);
        Возврат;
    КонецЕсли;

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

    // Важно: если вы меняли данные в табличной части, 
    // возможно потребуется обновить изображение на форме,
    // чтобы изменения стали видимыми сразу.
    ТаблицаФормы.ОбновитьИзображение();

    Сообщить("Обработка видимых строк завершена.");

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

В этом примере мы итерируем по всей коллекции строк табличной части, которая хранится в объекте (Объект.СписокСДИЗ). Для каждой строки мы вызываем ПроверитьСтроку(), передавая её идентификатор. Если метод возвращает Истина, это означает, что строка проходит все текущие фильтры и видна пользователю на форме. Только для таких строк мы выполняем дальнейшие действия.

Где хранится фильтр "Расширенный поиск"?

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

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

Платформа управляет этим отбором на уровне интерфейса, и его настройки не предоставляются для прямого программного считывания как, например, значение свойства ОтборСтрок. Таким образом, если нам нужно узнать, какие именно критерии пользователь ввел в "Расширенный поиск", напрямую получить их программно невозможно. Мы можем только проверить результат его действия с помощью ПроверитьСтроку().

Дополнительные рекомендации и альтернативы

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

  1. Оптимизация производительности: Если производительность становится критичной, и нам требуется работать исключительно с уже отфильтрованными данными, может быть более эффективным изменить источник данных для табличной части. Например, если данные поступают из динамического списка, мы можем изменить запрос к источнику данных или программно настроить отборы динамического списка так, чтобы он изначально возвращал только необходимые строки. Это переносит нагрузку на сервер и позволяет работать с меньшим объемом данных на клиенте.
  2. Работа с Элементы.МояТаблицаФормы.Строки: Важно понимать, что коллекция Элементы.МояТаблицаФормы.Строки содержит все строки, которые были загружены на клиентскую часть для этой таблицы, независимо от их текущей видимости. Поэтому просто итерировать по этой коллекции недостаточно для решения нашей задачи. Метод ПроверитьСтроку() является тем инструментом, который позволяет учесть все текущие фильтры.
  3. Прозрачность кода: Всегда стремитесь к максимальной прозрачности и читаемости кода. Четко прописывайте условия проверки возвращаемых значений, например, Если ТаблицаФормы.ПроверитьСтроку(...) = Истина Тогда, чтобы избежать неоднозначностей.

Заключение

Мы выяснили, что перебор только видимых на форме строк табличной части в управляемых формах 1С:Предприятия реализуется с использованием метода ПроверитьСтроку() элемента ТаблицаФормы. Ключевым моментом является передача идентификатора строки, полученного через ПолучитьИдентификатор(), и проверка результата на Истина. Также мы прояснили, что пользовательские фильтры "Расширенный поиск" не доступны программно для считывания, но их действие учитывается методом ПроверитьСтроку(). Применяя эти знания, вы сможете эффективно управлять данными, отображаемыми на ваших управляемых формах.

← На главную