Некоторое время назад передо мной поставили такое задание:
Есть отчет (СКД, обычное приложение), который выводит начальный остаток, приход, расход и конечный остаток финансов по заказу, с группировками по контрагенту и подразделению организации. Надо было этот отчет немного переправить, а именно сделать так, чтобы пользователь, выделив определенную ячейку табличного поля и нажав на кнопку, получал перед собой новый открывшиеся отчет с дополнительными данными(колонками).
Недолго думая, я создал в отчете два набора настроек и решил программно загружать их в отчет и открывать его в новой форме. Сразу же я столкнулся с рядом проблем, причиной которых стало отсутствие адекватной информации в инете и отчасти моя неопытность. Далее я предоставлю нехитрый код и сопровожу те места комментариями, в которых у меня возникли сложности.
В модуле Формы
Перем Настройки;
Процедура СформироватьОтчет()
Отчет = Отчеты[ЭтотОбъект.Метаданные().Имя].Создать();
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Форма = Отчет.ПолучитьФорму("ФормаОтчета");
Отчет.СкомпоноватьРезультат(Форма.ЭлементыФормы.Результат, Форма.ДанныеРасшифровки); //Вот в этом месте я жестко затупил и написал вместо "Форма.ДанныеРасшифровки" просто "ДанныеРасшифровки", а потом удивлялся почему не работает
Форма.Открыть();
КонецПроцедуры
Процедура ДействияФормыДопДок(Кнопка)//Процедура выполняема при нажатии на кнопку
ТаблицаПараметровОтбора = Новый ТаблицаЗначений;// Создаю таблицу в которую будут записываться параметры отбора
ТаблицаПараметровОтбора.Колонки.Добавить("Параметр",,"Параметр");
ТаблицаПараметровОтбора.Колонки.Добавить("Значение",,"Значение");
ТекущиеПараметрыОтчета = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы;
НачалоПериода = ТекущиеПараметрыОтчета[0].Значение;
КонецПериода = ТекущиеПараметрыОтчета[1].Значение;
ВариантНастройки = СхемаКомпоновкиДанных.ВариантыНастроек[1];
Настройки = ВариантНастройки.Настройки;
ОбрабатываемаяОбласть = ЭлементыФормы.Результат.Область(ЭлементыФормы.Результат.ТекущаяОбласть.Имя);
Расшифровка = ОбрабатываемаяОбласть.Расшифровка;
РасшифровкаРодитель = Расшифровка;
ЭтоПервый = Истина;
УровеньРасшифровки = Ложь;
Пока УровеньРасшифровки = Ложь Цикл
Если Строка(РасшифровкаРодитель) = "1" Тогда
УровеньРасшифровки = Истина;
Иначе
Если ЭтоПервый Тогда
ПоляРасшифровки = ДанныеРасшифровки.Элементы[РасшифровкаРодитель].ПолучитьПоля();
ЭтоПервый = Ложь;
Иначе
Попытка
РасшифровкаРодитель = ДанныеРасшифровки.Элементы[РасшифровкаРодитель].ПолучитьРодителей()[0].Идентификатор;
РасшифровкаРодитель = ДанныеРасшифровки.Элементы[РасшифровкаРодитель].ПолучитьРодителей()[0].Идентификатор;
ПоляРасшифровки = ДанныеРасшифровки.Элементы[РасшифровкаРодитель].ПолучитьПоля();
Исключение
РасшифровкаРодитель = ДанныеРасшифровки.Элементы[РасшифровкаРодитель].ПолучитьРодителей()[0].Идентификатор;
ПоляРасшифровки = ДанныеРасшифровки.Элементы[РасшифровкаРодитель].ПолучитьПоля();
КонецПопытки;
КонецЕсли;
Для Каждого СтрПоляРасшифровки Из ПоляРасшифровки Цикл
НоваяСтрока = ТаблицаПараметровОтбора.Добавить();
НоваяСтрока.Параметр = СтрПоляРасшифровки.Поле;
НоваяСтрока.Значение = СтрПоляРасшифровки.Значение;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ПараметрыНовогоОтчета = Настройки.ПараметрыДанных.Элементы;
ПараметрыНовогоОтчета[0].Значение = НачалоПериода;
ПараметрыНовогоОтчета[1].Значение = КонецПериода;
ОтборНовогоОтчета = Настройки.Отбор.Элементы;
Для Каждого СтрОтбораНастроек Из ОтборНовогоОтчета Цикл
СтрОтбораНастроек.Использование = Ложь;
НайденаяСтрока = ТаблицаПараметровОтбора.Найти(Строка(СтрОтбораНастроек.ЛевоеЗначение), "Параметр");
Если НайденаяСтрока <> Неопределено Тогда
СтрОтбораНастроек.ПравоеЗначение = НайденаяСтрока.Значение;
СтрОтбораНастроек.Использование = Истина;
КонецЕсли;
КонецЦикла;
СформироватьОтчет();
КонецПроцедуры
В принципе все, такими двумя нехитрыми процедурами я и решил эту задачу. Если кому-то эта информация поможет - буду очень рад.