В данной статье рассмотрен достаточно сложный случай, задействующий механики программного управлеиня настройками отчета на СКД, а также учитывающий, что отчет использует общую форму отчетов Библиотеки Стандартных Подсистем.
Итак, задача. Есть отчет на СКД, который в качестве основной формы использует общую форму БСП “ФормаОтчета”. В настройках отбора есть отбор, который нужно установить по умолчанию при открытии отчета, но только в том случае, если пользователь не поменял этот отбор в пользовательских настройках.
Сперва рассмотрим, как можно управлять отбором, если он включен в пользовательские поля. Здесь трюк заключается в том, что мы сперва получаем идентификатор пользовательской настройки, а затем по этому идентификатору получаем саму строку с отбором.
ЭлементыОтбораВарианта = Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы; Для Каждого ЭлементОтбора Из ЭлементыОтбораВарианта Цикл Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация") Тогда ИД = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьИдентификаторПоОбъекту(ЭлементОтбора); ПользовательскийОтбор = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(ИД); Если ТипЗнч(ПользовательскийОтбор.ПравоеЗначение) = Тип("СписокЗначений") И ПользовательскийОтбор.ПравоеЗначение.Количество() = 0 Тогда ПользовательскийОтбор.ПравоеЗначение.Добавить(Константы.ОсновнаяОрганизация.Получить()); КонецЕсли; КонецЕсли; КонецЦикла;
Теперь приступим к самому интересному. Т.к. отчет использует общую форму, переопределить ему настройки в ПриСозданииНаСервере мы не можем. Кроме того, в общей форме БСП срабатывают ряд обработчиков, которые загружают основные настройки, пользовательские настройки и т.д. Именно один из них мы и используем.
Вначале в модуле менеджера отчета нам нужно указать БСП, что в форме будут переопределяться настройки.
// СтандартныеПодсистемы.ВариантыОтчетов // См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. Процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета) Экспорт НастройкиОтчета.ОпределитьНастройкиФормы = Истина; НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "Основной"); НастройкиВарианта.Описание = НСтр("ru = 'Наш отчет'"); КонецПроцедуры Процедура ПриОпределенииНастроек(Настройки) Экспорт Настройки.НастроитьВариантыОтчета = Истина; КонецПроцедуры
Далее в модуле объекта отчета определяем два метода. В первом мы говорим БСП, что будет использоваться переопределение пользовательских настроек. А во втором – прописываем собственно сами настройки.
// Задать настройки формы отчета. // // Параметры: // Форма - ФормаКлиентскогоПриложения // - Неопределено // КлючВарианта - Строка // - Неопределено // Настройки - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию // Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт Настройки.События.ПриЗагрузкеПользовательскихНастроекНаСервере = Истина; КонецПроцедуры Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Форма, НовыеПользовательскиеНастройкиКД) Экспорт ЭлементыОтбораВарианта = Форма.Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы; Для Каждого ЭлементОтбора Из ЭлементыОтбораВарианта Цикл Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация") Тогда ИД = Форма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьИдентификаторПоОбъекту(ЭлементОтбора); ПользовательскийОтбор = Форма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(ИД); Если ТипЗнч(ПользовательскийОтбор.ПравоеЗначение) = Тип("СписокЗначений") И ПользовательскийОтбор.ПравоеЗначение.Количество() = 0 Тогда ПользовательскийОтбор.ПравоеЗначение.Добавить(Константы.PTG_ОсновнаяОрганизация.Получить()); КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры
Обратите внимание, в примере рассмотрен случай, когда отбор устанавливается в списке, а не на строгое равенство. Кроме того, само значение отбора получается из константы ОсновнаяОрганизация. Тут демонстрируется, что нам заранее неизвестно, какой отбор должен быть установлен, и он определяется “на лету” по данным из базы.