Переход с обычных форм на управляемые часто вызывает вопросы у разработчиков, привыкших к удобству объекта ПостроительОтчета. В старой парадигме достаточно было добавить реквизит на форму, и пользователь получал готовый интерфейс для настройки фильтров. В управляемом приложении идеология изменилась, и на смену построителю пришла Система компоновки данных (СКД). Рассмотрим подробно, как воссоздать привычный функционал отборов и программно обработать результат запроса.
Проанализируем основное различие: ПостроительОтчета был тесно связан с интерфейсом толстого клиента. В управляемых формах для аналогичных целей используется связка из Схемы компоновки данных и Компоновщика настроек. Это позволяет не только гибко управлять запросом на сервере, но и выносить любые настройки (отборы, параметры, группировки) непосредственно в пользовательский интерфейс.
Для начала работы нам необходимо создать схему компоновки данных (макет СКД) внутри нашей обработки или отчета. В этой схеме мы опишем основной запрос. Однако главная задача — сделать так, чтобы пользователь мог интерактивно управлять условиями этого запроса.
Разберем по шагам процесс визуализации настроек отбора, который в обычных формах делался "одной галочкой":
Компоновщик) и типом КомпоновщикНастроекКомпоновкиДанных.Компоновщик и перетаскиваем путь Компоновщик.Настройки.Отбор в дерево элементов формы. Платформа создаст таблицу, которая будет полностью функциональна: пользователь сможет добавлять новые строки, выбирать виды сравнения и значения.Рассмотрим пример инициализации компоновщика в модуле формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем схему из макета обработки
Схема = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Инициализируем компоновщик настроек схемой
АдресСхемы = ПоместитьВоВременноеХранилище(Схема, УникальныйИдентификатор);
Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
// Загружаем настройки по умолчанию
Компоновщик.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
КонецПроцедуры
Выясним, как программно выполнить запрос с учетом тех фильтров, которые установил пользователь, и получить результат в виде ТаблицыЗначений для дальнейшей обработки (например, выгрузки в XML). В отличие от обычного отчета, который выводится в ТабличныйДокумент, нам потребуется специальный процессор вывода.
Проанализируем последовательность действий в серверном коде:
&НаСервере
Функция ПолучитьТаблицуРезультата()
Схема = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Получаем текущие настройки из формы (включая пользовательские отборы)
Настройки = Компоновщик.ПолучитьНастройки();
// Компонуем макет
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
// Инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Выводим результат в таблицу значений
ТаблицаРезультата = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультата);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ТаблицаРезультата;
КонецФункции
Важный нюанс: Обратите внимание на использование Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"). Это критически важно, так как стандартный генератор настроен на оформление (цвета, шрифты), а для таблицы значений нам нужны только "сырые" данные.
Часто разработчики сталкиваются с ситуацией, когда при выгрузке в ТаблицуЗначений колонки содержат только ссылки (например, объект СправочникСсылка.Номенклатура), а для XML-выгрузки или текстового файла требуются их строковые представления (наименования). Использование функции ПРЕДСТАВЛЕНИЕ() в тексте запроса СКД не всегда дает желаемый результат в колонках ТЗ.
Посмотрим, как правильно получить текстовые данные:
Склад) можно добавить дочернее поле Представление. Если оно добавлено в выбранные поля компоновщика, процессор вывода создаст отдельную колонку с текстом.Номенклатура.Наименование + " " + Номенклатура.Код).ПроцессорВывода.ВывестиЭлемент() в цикле, чтобы вручную контролировать заполнение каждой строки, но для простых задач достаточно правильно настроить список "Выбранные поля".Стоит отметить, что объект ПостроительЗапроса никуда не исчез. Он по-прежнему доступен в серверном коде управляемого приложения. Если ваша задача не предполагает сложного интерактивного взаимодействия с пользователем на форме, а вам просто нужно быстро наложить фильтры из структуры в программном коде, вы можете использовать его привычным образом.
Однако помните: ПостроительЗапроса невозможно напрямую связать с элементами управляемой формы так же изящно, как КомпоновщикНастроек. Поэтому для разработки современных интерфейсов 1С использование СКД является "золотым стандартом".
Если ваша задача — дать пользователю возможность отобрать данные в списке, а затем по кнопке выгрузить их, рассмотрим использование Динамического списка. Пользователь настраивает отборы через стандартное меню "Настроить список". В коде обработки вы можете получить настройки этого списка:
НастройкиСписка = Элементы.СписокДанных.КомпоновщикНастроек.ПолучитьНастройки();
Эти настройки можно применить к вашему серверному процессору компоновки (как было показано в примере выше). Таким образом, вам даже не придется рисовать свою таблицу отборов — вы используете стандартный и привычный пользователю механизм платформы.
Подводя итог, можно сказать, что хотя ПостроительОтчета остался в прошлом, Система компоновки данных предоставляет гораздо более мощные и гибкие инструменты для реализации аналогичного функционала в управляемых формах.