Программный запуск отчета 1с 8.3 (управляемые формы)

Если нужно по кнопке на произвольной форме запустить отчет с параметрами (отбором) написанный на СКД, можно сделать как показано далее. Создадим простой отчет  — продажи по номенклатурным группам (Конфигурация 1С Бухгалтерия 3.0). Запрос отчета:

ВЫБРАТЬ
   РеализацияУслугОбороты.НоменклатурнаяГруппа,
   РеализацияУслугОбороты.СуммаОборот
ИЗ
   РегистрНакопления.РеализацияУслуг.Обороты КАК РеализацияУслугОбороты

Настройки отчета в СКД:

salerep

Обратим внимание на форму отчета, в верхней части размещен отбор ФИКСИРОВАННЫХ НАСТРОЕК, обратите на это внимание.

repparam2

Отчет надо поместить в конфигурацию. Допустим, есть обработка и надо вывеси отчет с отбором  по номенклатурной группе, в обработке создаем команду и в клиентском обработчике пишем код:

ОтборОтчета = новый Структура(«НоменклатурнаяГруппа», Ссылка_НоменклатурнаяГруппа);
ПараметрыОтчета = Новый Структура(«СформироватьПриОткрытии, Отбор», истина, ОтборОтчета);
ОткрытьФорму(«Отчет.ПродажиПоНоменклатурнымГруппам.Форма», ПараметрыОтчета);

В переменной «Ссылка_НоменклатурнаяГруппа» указана номенклатурная группа по которой делается отбор. В результате, получим такой вид сформированного отчета:

repfinal

Как установить параметр СКД программно (управляемые формы)

&НаСервере
Процедура УстановитьПараметрСКД()
   ПараметрСКД = Отчет.КомпоновщикНастроек.
Настройки.ПараметрыДанных.

  Элементы.Найти(«ИмяПараметра»)
  ПараметрСКД.Использование = Истина;
  ПараметрСКД.Значение = Значение;
КонецПроцедуры

Создание дерева в СКД и выгрузка его в дерево значений

Допустим, имеется таблица с товарами и суммами, колонки приведены ниже:
— Идентификатор строки (id)
— Идентификатор строки родителя (idParent)
— Наименование (строка)
— Сумма

id idParent Наименование Сумма (руб.)
1 Монитор 5000
2 Мышь, клавиатура 2000
3 Системный блок
4 3 Материнская плата 10000
5 3 Жесткий диск 3000

Колонка «Наименование» не является справочником и не позволяет автоматически создать иерархию, конечно ее можно создать программно, но это трудоемко, особенно собирать суммы итогов по иерархии. Итак, нам нужно получить дерево значений без особо трудного кодирования. Для начала, создадим СКД и создадим 2 частично одинаковых выборки с данными, как показано на рисунках ниже:

Первая выборка, задающая иерархию

SetIerarh

Вторая выборка, такая же как первая, но содержит больше колонок

SetData

Связи между выборками, образующих дерево

svyaz

Структура итоговых данных — само дерево

report

Если посмотреть на результат в отчете, он будет выглядеть так

result

Ниже приведен код, позволяющий получить дерево из СКД в переменную «ДеревоЗначений»:

СхемаКомпоновкиДанных = РеквизитФормыВЗначение(«Отчет»).ПолучитьМакет(«МакетДанные»);
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

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

// если нужны параметры — устанавливаем так
Параметр = ПараметрыНастройки.Элементы.Найти(«Дата»);
Параметр.Использование = Истина;
Параметр.Значение = Отчет.Дата;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновщика, , , Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ДеревоЗначений = Новый ДеревоЗначений;
ПроцессорВывода.УстановитьОбъект(ДеревоЗначений);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);