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

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

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

Переход от Построителя отчета к Системе компоновки данных

Проанализируем основное различие: ПостроительОтчета был тесно связан с интерфейсом толстого клиента. В управляемых формах для аналогичных целей используется связка из Схемы компоновки данных и Компоновщика настроек. Это позволяет не только гибко управлять запросом на сервере, но и выносить любые настройки (отборы, параметры, группировки) непосредственно в пользовательский интерфейс.

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

Как вывести отборы на управляемую форму

Разберем по шагам процесс визуализации настроек отбора, который в обычных формах делался "одной галочкой":

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

Рассмотрим пример инициализации компоновщика в модуле формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Получаем схему из макета обработки
    Схема = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    // Инициализируем компоновщик настроек схемой
    АдресСхемы = ПоместитьВоВременноеХранилище(Схема, УникальныйИдентификатор);
    Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
    
    // Загружаем настройки по умолчанию
    Компоновщик.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
    
КонецПроцедуры

Программное получение результата в Таблицу значений

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

Проанализируем последовательность действий в серверном коде:


&НаСервере
Функция ПолучитьТаблицуРезультата()
    
    Схема = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    // Получаем текущие настройки из формы (включая пользовательские отборы)
    Настройки = Компоновщик.ПолучитьНастройки();
    
    // Компонуем макет
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    
    // Выводим результат в таблицу значений
    ТаблицаРезультата = Новый ТаблицаЗначений;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВывода.УстановитьОбъект(ТаблицаРезультата);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    Возврат ТаблицаРезультата;
    
КонецФункции

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

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

Часто разработчики сталкиваются с ситуацией, когда при выгрузке в ТаблицуЗначений колонки содержат только ссылки (например, объект СправочникСсылка.Номенклатура), а для XML-выгрузки или текстового файла требуются их строковые представления (наименования). Использование функции ПРЕДСТАВЛЕНИЕ() в тексте запроса СКД не всегда дает желаемый результат в колонках ТЗ.

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

Использование Построителя запроса на сервере

Стоит отметить, что объект ПостроительЗапроса никуда не исчез. Он по-прежнему доступен в серверном коде управляемого приложения. Если ваша задача не предполагает сложного интерактивного взаимодействия с пользователем на форме, а вам просто нужно быстро наложить фильтры из структуры в программном коде, вы можете использовать его привычным образом.

Однако помните: ПостроительЗапроса невозможно напрямую связать с элементами управляемой формы так же изящно, как КомпоновщикНастроек. Поэтому для разработки современных интерфейсов 1С использование СКД является "золотым стандартом".

Альтернативный вариант: Динамические списки

Если ваша задача — дать пользователю возможность отобрать данные в списке, а затем по кнопке выгрузить их, рассмотрим использование Динамического списка. Пользователь настраивает отборы через стандартное меню "Настроить список". В коде обработки вы можете получить настройки этого списка:

НастройкиСписка = Элементы.СписокДанных.КомпоновщикНастроек.ПолучитьНастройки();

Эти настройки можно применить к вашему серверному процессору компоновки (как было показано в примере выше). Таким образом, вам даже не придется рисовать свою таблицу отборов — вы используете стандартный и привычный пользователю механизм платформы.

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

← На главную