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