Как реализовать пользовательские отборы для таблицы значений через построитель отчета в обычных формах 1С

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

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

Подготовка данных и инициализация построителя

Прежде всего, нам необходимо инициализировать объект ПостроительОтчета и связать его с нашей таблицей значений. Важно понимать, что для корректной работы построителя колонки таблицы значений должны быть типизированы. Если колонки созданы без указания типов, построитель не сможет определить доступные виды сравнения (например, «Больше» для чисел или «В списке» для ссылочных типов).

Рассмотрим пример инициализации построителя в коде. Предположим, что ТЗДанные — это реквизит нашей формы, содержащий данные.


// Создаем объект построителя
Построитель = Новый ПостроительОтчета;

// Типизация колонок ТЗ (если они не были типизированы ранее)
// Это критически важно для корректной работы отборов
ОписаниеСтр = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(100));
ТЗДанные.Колонки.Добавить("Наименование", ОписаниеСтр, "Наименование товара");

// Назначаем источник данных
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗДанные);

// Заполняем настройки построителя на основании колонок источника
Построитель.ЗаполнитьНастройки();

После выполнения метода ЗаполнитьНастройки(), коллекция Построитель.Отбор будет содержать элементы, соответствующие именам колонок вашей ТЗ. Проанализируем ситуацию: теперь у нас есть объект, который «знает» структуру таблицы и готов принимать условия фильтрации.

Создание интерфейса для настройки отборов

Чтобы пользователь мог интерактивно управлять фильтрами, нам нужно вывести коллекцию Построитель.Отбор на форму. Как было отмечено в обсуждении, наиболее правильный и удобный путь — использование отдельной вспомогательной формы (диалога). Рассмотрим, как её настроить:

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

При такой привязке система автоматически сформирует колонки: «Использование» (флажок), «Поле», «Вид сравнения» и «Значение». Это стандартный и интуитивно понятный интерфейс для любого пользователя 1С.

Вызов окна отбора и обработка результата

Теперь разберем программную часть вызова этого окна. На основной форме, где находится наша ТЗ, создадим процедуру для кнопки «Установить отборы». Выясним причину, по которой нам нужно передавать именно весь объект построителя: это позволит сохранить ранее установленные настройки между вызовами окна.


Процедура КнопкаОтборНажатие(Элемент)
    
    // Если построитель еще не создан (например, первый запуск), инициализируем его
    Если ПостроительОтбора = Неопределено Тогда
        ИнициализироватьПостроитель(); // Метод, описанный в первом шаге
    КонецЕсли;

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

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

Механизм применения фильтра к Таблице Значений

Самый важный нюанс заключается в том, что ПостроительОтчета не фильтрует исходную таблицу «на лету». Он выполняет запрос к данным и возвращает результат в виде новой выборки или таблицы. Рассмотрим, как правильно обновить данные на форме, чтобы пользователь увидел результат фильтрации.

Алгоритм применения выглядит следующим образом:

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

Посмотрим на пример реализации этой логики:


Процедура ПрименитьОтборКТаблице()

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

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

Особенности и ограничения метода

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

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

Сохранение настроек: Чтобы пользователь не настраивал фильтры каждый раз заново при открытии формы, объект ПостроительОтчета можно сохранять в хранилище настроек или сделать его переменной модуля формы. Это позволит «запоминать» состояние флажков и значений в полях отбора.

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

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

← На главную