Открыть отчет СКД с передачей параметров и отборами
Теги: 1С,отчет,Отбор,СКД,параметры

# Код реализации

```1c
// Открывает отчет на СКД с передачей параметров и отборов
//
// Параметры:
//  ЭтаФорма					 - ФормаКлиентскогоПриложения - Форма клиентского приложения
//  ФормаОтчета					 - Строка - Путь к форме отчета, например: "Отчет.ТестовыйОтчёт.Форма"
//  Параметры					 - Структура - Ключ- имя параметра, значение- присваиваемое значение
//  Отборы						 - Массив структур - Структура вида: Новый Структура("ИмяОтбора, Значение, ВидСравнения", ИмяОтбора, Значение, ВидСравнения)
//  СформироватьПриОткрытии		 - Булево - Признак формировании отчета при открытии
//  КлючВарианта				 - Строка - Ключ варианта отчета, который следует открыть
//  ПользовательскиеНастройки	 - Пользовательские настройки отчета - КомпоновщикНастроек.ПользовательскиеНастройки
//
Процедура КомандаОткрытьОтчётСОтбором(ЭтаФорма, ФормаОтчета, Параметры = Неопределено, Отборы = Неопределено,
	          СформироватьПриОткрытии = Истина, КлючВарианта = Неопределено, ПользовательскиеНастройки = Неопределено) Экспорт

	ФормаОтчёта = ПолучитьФорму(ФормаОтчета);
	КомпоновщикНастроек = ФормаОтчёта.Отчет.КомпоновщикНастроек;

	Для Каждого Парам Из Параметры Цикл
		УстановитьПользовательскийПараметрСКД(КомпоновщикНастроек, Парам.Ключ, Парам.Значение);
	КонецЦикла;

	Для Каждого Отбор Из Отборы Цикл
		УстановитьПользовательскийОтборСКД(КомпоновщикНастроек, Отбор.ИмяОтбора, Отбор.Значение, Отбор.ВидСравнения);
	КонецЦикла;

	ПараметрыФормы = Новый Структура();
	ПараметрыФормы.Вставить("СформироватьПриОткрытии", СформироватьПриОткрытии);
	Если КлючВарианта <> Неопределено Тогда
		ПараметрыФормы.Вставить("КлючВарианта", КлючВарианта);
	КонецЕсли;
	ПараметрыФормы.Вставить("ПользовательскиеНастройки", ?(ПользовательскиеНастройки <> Неопределено, ПользовательскиеНастройки,
																									  КомпоновщикНастроек.ПользовательскиеНастройки));

	ОткрытьФорму(ФормаОтчета, ПараметрыФормы, ЭтаФорма);

КонецПроцедуры

Процедура УстановитьПользовательскийПараметрСКД(КомпоновщикНастроек, ИмяПараметра, Значение)

	Перем ПараметрДанных, Настройки, ПользовательскиеНастройки, ПользовательскийПараметр;

	Настройки = КомпоновщикНастроек.Настройки;

	ПараметрДанных = Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);

	Если ЗначениеЗаполнено(ПараметрДанных.ИдентификаторПользовательскойНастройки) Тогда

		ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки;
		ПользовательскийПараметр = ПользовательскиеНастройки.Элементы.Найти(ПараметрДанных.ИдентификаторПользовательскойНастройки);
		ПользовательскийПараметр.Использование = Истина;
		ПользовательскийПараметр.Значение = Значение;

	КонецЕсли;

КонецПроцедуры

Процедура УстановитьПользовательскийОтборСКД(КомпоновщикНастроек, ИмяОтбора, Значение, ВидСравнения = Неопределено)

	Перем	ПолеКД, Элем, ЭлементОтбора, Настройки,
			ПользовательскиеНастройки, ПользовательскийОтбор;

	Настройки = КомпоновщикНастроек.Настройки;

	ПолеКД = Новый ПолеКомпоновкиДанных(ИмяОтбора);

	Для Каждого Элем Из Настройки.Отбор.Элементы Цикл

		Если Элем.ЛевоеЗначение = ПолеКД Тогда
			ЭлементОтбора = Элем;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Если ЭлементОтбора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ЗначениеЗаполнено(ЭлементОтбора.ИдентификаторПользовательскойНастройки) Тогда

		ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки;
 		ПользовательскийОтбор = ПользовательскиеНастройки.Элементы.Найти(ЭлементОтбора.ИдентификаторПользовательскойНастройки);
		ПользовательскийОтбор.Использование = (Значение <> Неопределено);
		ПользовательскийОтбор.ВидСравнения = ?(ВидСравнения <> Неопределено, ВидСравнения, ВидСравненияКомпоновкиДанных.Равно);
		ПользовательскийОтбор.ПравоеЗначение  = Значение;

	КонецЕсли;

КонецПроцедуры
```