Получить консультацию

Как установить отбор по умолчанию в отчете на СКД с общей формой БСП?

В данной статье рассмотрен достаточно сложный случай, задействующий механики программного управлеиня настройками отчета на СКД, а также учитывающий, что отчет использует общую форму отчетов Библиотеки Стандартных Подсистем.

Итак, задача. Есть отчет на СКД, который в качестве основной формы использует общую форму БСП “ФормаОтчета”. В настройках отбора есть отбор, который нужно установить по умолчанию при открытии отчета, но только в том случае, если пользователь не поменял этот отбор в пользовательских настройках.

Сперва рассмотрим, как можно управлять отбором, если он включен в пользовательские поля. Здесь трюк заключается  в том, что мы сперва получаем идентификатор пользовательской настройки, а затем по этому идентификатору получаем саму строку с отбором.

ЭлементыОтбораВарианта = Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы;
Для Каждого ЭлементОтбора Из ЭлементыОтбораВарианта Цикл
	Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация") Тогда
		ИД = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьИдентификаторПоОбъекту(ЭлементОтбора);
		ПользовательскийОтбор = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(ИД);
		Если ТипЗнч(ПользовательскийОтбор.ПравоеЗначение) = Тип("СписокЗначений") И ПользовательскийОтбор.ПравоеЗначение.Количество() = 0 Тогда
			ПользовательскийОтбор.ПравоеЗначение.Добавить(Константы.ОсновнаяОрганизация.Получить());
		КонецЕсли;
	КонецЕсли;      
КонецЦикла;

Теперь приступим к самому интересному. Т.к. отчет использует общую форму, переопределить ему настройки в ПриСозданииНаСервере мы не можем. Кроме того, в общей форме БСП срабатывают ряд обработчиков, которые загружают основные настройки, пользовательские настройки и т.д. Именно один из них мы и используем.

Вначале в модуле менеджера отчета нам нужно указать БСП, что в форме будут переопределяться настройки.

// СтандартныеПодсистемы.ВариантыОтчетов

// См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.
Процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета) Экспорт
	НастройкиОтчета.ОпределитьНастройкиФормы = Истина;
	НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "Основной");
	НастройкиВарианта.Описание = НСтр("ru = 'Наш отчет'");
КонецПроцедуры 

Процедура ПриОпределенииНастроек(Настройки) Экспорт
	Настройки.НастроитьВариантыОтчета = Истина;
КонецПроцедуры

Далее в модуле объекта отчета определяем два метода. В первом мы говорим БСП, что будет использоваться переопределение пользовательских настроек. А во втором – прописываем собственно сами настройки.

// Задать настройки формы отчета.
//
// Параметры:
//   Форма - ФормаКлиентскогоПриложения
//         - Неопределено
//   КлючВарианта - Строка
//                - Неопределено
//   Настройки - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
	Настройки.События.ПриЗагрузкеПользовательскихНастроекНаСервере = Истина;  
КонецПроцедуры

Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Форма, НовыеПользовательскиеНастройкиКД) Экспорт
	ЭлементыОтбораВарианта = Форма.Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы;
	Для Каждого ЭлементОтбора Из ЭлементыОтбораВарианта Цикл
		Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация") Тогда
			ИД = Форма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьИдентификаторПоОбъекту(ЭлементОтбора);
			ПользовательскийОтбор = Форма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(ИД);
			Если ТипЗнч(ПользовательскийОтбор.ПравоеЗначение) = Тип("СписокЗначений") И ПользовательскийОтбор.ПравоеЗначение.Количество() = 0 Тогда
				ПользовательскийОтбор.ПравоеЗначение.Добавить(Константы.PTG_ОсновнаяОрганизация.Получить());
			КонецЕсли;
		КонецЕсли;      
	КонецЦикла;
КонецПроцедуры

Обратите внимание, в примере рассмотрен случай, когда отбор устанавливается в списке, а не на строгое равенство. Кроме того, само значение отбора получается из константы ОсновнаяОрганизация. Тут демонстрируется, что нам заранее неизвестно, какой отбор должен быть установлен, и он определяется “на лету” по данным из базы.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

одиннадцать + одиннадцать =

К НАЧАЛУ