заполнить свой СКД отчет программно и вывести из другой формы


Задача:

Из-за того, что прошлые программисты изменили типовые регистры на свои необходимо сделать отчет Резервы на складах.
Нужно заменить типовой отчет "Товары в резерве на складах".
Отчет должен вызываться из справочника номенклатура(список номенклатуры) и показывать резервы по номенклатуре, на которой установлен курсор.
Номенклатура может быть папкой или элементом.

Выполнение:

Алгоритм:

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

Теперь необходимо в справочнике номенклатура заменить вывод типового отчета на "ТоварыВРезервеОстатки2019". При вызове отчета устанавливается отбор по выбранной номенклатуре и происходит вывод отчета:



Текст процедуры:

//отчет по резервам 2019
процедура открытьОтчетПоРезервам2019()
	Если ЭлементыФормы.Список.ТекущиеДанные = Неопределено Тогда
		// ничего нет
		Возврат;
	КонецЕсли;

	ТекущиеДанные = ЭлементыФормы.Список.ТекущиеДанные.Ссылка;

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

//!!!!!!!!!!!!!!!!!!!!!!!!!если стандартный отчет - можно попробовать так!!!!!
//ФормаОтчета = отчет.ПолучитьФорму();
//    отчет.СформироватьОтчет(ФормаОтчета.ЭлементыФормы.Результат,,, ФормаОтчета);
//    ФормаОтчета.Открыть();
//	отчет.КомпоновщикНастроек.ЗагрузитьНастройки(настройки); 


формаОтчета=отчет.ПолучитьФорму("ФормаОтчета");
формаОтчета.сформироватьОтчет(настройки);
формаОтчета.Открыть();	
КонецПроцедуры

Результат:
Заполнить настройки отчета и вывести отчет программно из другой формы

p.s.
Если нужно еще заполнять параметры, то можно сделать так

параметры=отчет.КомпоновщикНастроек.Настройки.Параметры.Элементы;
нужныйПараметр=параметры.элементы.найти("имяНужногоПараметра");
нужныйПараметр.использование=истина;
нужныйПараметр.значение=ЗначениеВашегоПараметра;