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