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