Иногда возникает необходимость устанавливать отборы и параметры СКД программно. При открытии формы, например, или при формировании отчета на сервере для дальнейшей его отправки на почту.
И если с параметрами все предельно просто — информации в сети полно, то вот отборы у меня отняли много времени. В этой статье я приведу код, с помощью которого можно устанавливать отборы и параметры СКД программно.
Как я уже говорил — с параметрами все просто. У этих элементов есть метод «Найти» и поэтому функция выглядит так:
1 2 3 4 5 6 7 |
Процедура УстановитьПараметрыСКД(ИмяПараметра, Значение) ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра); Если ПараметрСКД <> Неопределено Тогда ПараметрСКД.Использование = Истина; ПараметрСКД.Значение = Значение; КонецЕсли; КонецПроцедуры |
Вызов процедуры при открытии формы принимает следующий вид:
1 |
УстановитьПараметрыСКД("НачалоПериода", ДатаНач); |
С отборами сложнее по 2 причинам:
- У отборов нет метода «Найти» и приходится делать перебором
- Отборы не являются предустановленными настройками компоновщика и поэтому их нужно будет добавлять, в случае отсутствия
Но код не намного сложнее, когда уже знаешь что писать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//ИмяПоля - Строка //ВидОтбора - ВидСравненияКомпоновкиДанных //Значение - Значение. Для отмены отбора передать Неопределено Процедура УстановитьОтборСКД(ИмяПоля, ВидОтбора, Значение) ПолеОтбора = Новый ПолеКомпоновкиДанных(ИмяПоля); ОтборыКомпановщика = КомпоновщикНастроек.Настройки.Отбор.Элементы; Для Каждого Стр Из ОтборыКомпановщика Цикл Если Стр.ЛевоеЗначение = ПолеОтбора Тогда Отбор = Стр; КонецЕсли; КонецЦикла; Если Отбор = Неопределено Тогда Отбор = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); Отбор.ЛевоеЗначение = ПолеОтбора; КонецЕсли; Если Значение <> Неопределено Тогда Отбор.ВидСравнения = ВидОтбора; Отбор.Использование = Истина; Отбор.ПравоеЗначение = Значение; Иначе Отбор.Использование = Ложь; КонецЕсли; КонецПроцедуры |
Ну и вызов этой процедуры:
1 |
УстановитьОтборСКД("Дата", ВидСравненияКомпоновкиДанных.Равно, ДатаНач); |
По большей части статью писал для себя, потому что возникла необходимость программной установки отбора в отчете СКД и я уверен, что я уже делал это несколько раз. Но информацию в интернете найти не смог. Возможно плохо искал. Теперь же мне не придется искать долго.
В любом случае — буду рад, если это еще кому-то пригодится.
4 комментария
КомпоновщикНастроек есть в отчетах. А я эту функцию вызываю из справочников, документов и при программном формировании скд.
Добрый день, прошу помощи. При выводе результатов отчета в СКД, после создания макета заголовка, в печатной форме заголовок выводится после результатов отбора и введенных параметров. А нужно чтобы выводилось над ними. Подскажите где в скд находятся настройки вывода последовательности указанных данных?
Спасибо! Очень полезно, кусочек кода по установке отборов и мне пригодился.
Добрый день!
Пытаюсь открыть форму отчёта, сделанного на СКД, из формы другого документа. Не удаётся добиться формирования отчёта с передаваемыми параметрами. В форме документа:
ПараметрыДляОтчета = Новый Структура;
ПараметрыДляОтчета.Вставить(«ДатаДокумента», Объект.Дата);
ОткрытьФорму(«Отчет.ОтчетПоРегиструОстатковТоваров.Форма»,ПараметрыДляОтчета);
В форму отчёта эти параметры передаются.
СКД устанавливает свой параметр Период. Устанавливаю его, а также параметр ДатаДокумента,
который подразумевается использовать в запросе отчёта в процедуре ПриСозданииНаСервере():
Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
ПараметрДанныхПериод = Настройки.ПараметрыДанных.Элементы[0];
ПараметрДанныхПериод.Значение = Параметры.ДатаДокумента;
ПараметрДанныхПериод.Использование = Истина;
ПараметрДанныхДатаДокумента = Настройки.ПараметрыДанных.Элементы[1];
ПараметрДанныхДатаДокумента.Значение = Параметры.ДатаДокумента;
ПараметрДанныхДатаДокумента.Использование = Истина;
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Проверяю в процедуре ПередЗагрузкойВариантаНаСервере():
Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(«ДатаДокумента»);
Параметр с нужным значением в настройках имеется. Аналогично для параметра Период.
В процедуре ПриОбновленииСоставаПользовательскихНастроекНаСервере()
значения параметров уже другие!!! И результат отчёта, соответственно, другой.
С чего бы и как бороться с таким явлением?
В какой момент компоновщик выполняет отчёт при открытии формы?
С уважением,
Павел