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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Дмитрий

    Здравствуйте. Подскажите как программмно с одной формы произвольного отчета открыть отчет на скд без основной формы(!), и передать набор данных (таблица значений) в “ПриКомпоновкеРезультата() СтандартнаяОбработка=Ложь”
    Передаю адрес хранилища значений в параметрах черех доп свойства, да адрес доходит в модуль отчета скд, но если отчет без формы тогдаа ПолучитьИзВеременногоХрпнилиза (АдресТз)=Неопределено. Если Основная форма своя. Всё ок, таблицу в набор подсунул. Но оч хочется общую форму бсп

    1. Здравствуйте! Если речь идет об отчете, который использует общую форму отчета БСП-шную, то копать нужно в сторону обработчиков БСП, которые прописываются в модуле объекта нужного отчета.
      https://its.1c.ru/db/bsp3110doc#content:686:hdoc
      Где-нибудь в обработчике ПриСозданииНаСервере или ПередЗагрузкойВариантаНаСервере. Я бы куда-то туда попробовал бы вклиниться.

  2. Дмитрий

    Здравствуйте. Подскажите как программно открыть отчет на скд без основной формы, и передать набор данных (таблица значений) в “ПриКомпоновкеРезультата() СтандартнаяОбработка=Ложь”
    Что не получается – Передаю адрес хранилища значений в параметрах через доп свойства, да адрес доходит в модуль отчета скд, но если отчет без формы тогда ПолучитьИзВеременногоХранилища (АдресТз)=Неопределено. и к тому времени отчет уже формируется через Общие-ФормаОтчета.

    Если Основная форма своя. Всё ок, таблицу в набор подсунул. Но оч хочется общую форму бсп

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

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

9 − 7 =

К НАЧАЛУ