Скомпоновать результат отчета
Теги: 1С,ТЗ,УниверсальныйМетод,Желтый Чайник 1С,СКД

Выполняет компоновку СКД по переданным настройкам

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

```1c
// Выполняет компоновку СКД по переданным настройкам
//
// Параметры:
//  Результат               - ТабличныйДокумент,ТаблицаЗначений,ДеревоЗначений                      - результат выполнения
//  СхемаКомпоновки         - СхемаКомпоновкиДанных                                                 - выполняемая СКД
//  НастройкиКомпоновки     - НастройкиКомпоновкиДанных,КомпоновщикНастроекКомпоновкиДанных,Строка  - выполняемые настройки или адрес временного хранилища или компоновщик с настройками
//  ДанныеРасшифровки       - ДанныеРасшифровкиКомпоновкиДанных, Неопределено                       - данные расшифровки
//  ВнешниеНаборыДанных     - Структура, Неопределено                                               - коллекция внешних наборов данных
//  ДополнительныеПараметры - Структура, Неопределено                                               - коллекция внешних наборов данных
//       * МакетОформления              - МакетОформленияКомпоновкиДанных   - Макет оформления, в соответствии с которым необходимо оформлять макет компоновки данных.
//       * МенеджерВременныхТаблиц      - МенеджерВременныхТаблиц,Структура - Временные таблицы, которые будут доступны в запросе СКД. Или МВТ или структура, где Ключ - Имя, а Значение - Таблица
//       * ПроверятьДоступностьПолей    - Булево - Определяет, выполнять ли проверку прав на просмотр полей и проверку доступности поля во включенных функциональных возможностях.
//       * ПараметрыФункциональныхОпций - Булево - Содержит параметры функциональных опций, используемые при исполнении отчета.
//       * ВозможностьИспользованияВнешнихФункций - Булево - Указывает возможность использования функции общих модулей конфигурации в выражениях компоновки данных.
//       * ОграничиватьПолучениеПолейПоСсылкамПоПравуПросмотр - Булево - Указывает обязательность наличия роли Просмотр для используемых метаданных в запросе СКД
//
//     https://infostart.ru/profile/309462/
//     https://t.me/JuniorOneS
//Подробнее об использовании метода: //infostart.ru/public/1082944/?ref=1159
//
Процедура СкомпоноватьРезультатОтчета(Результат, СхемаКомпоновки, НастройкиКомпоновки,
    ДанныеРасшифровки = Неопределено, ВнешниеНаборыДанных = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт


	//Инициализируем настройки
	Если ТипЗнч(НастройкиКомпоновки) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
		ВыполняемыеНастройки    = НастройкиКомпоновки.ПолучитьНастройки();
	ИначеЕсли ТипЗнч(НастройкиКомпоновки) = Тип("Строка") И ЭтоАдресВременногоХранилища(НастройкиКомпоновки) Тогда
		ВыполняемыеНастройки    = ПолучитьИзВременногоХранилища(НастройкиКомпоновки);
	Иначе
		ВыполняемыеНастройки    = НастройкиКомпоновки;
	КонецЕсли;

	Если НЕ ТипЗнч(ВыполняемыеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда
		Возврат;
	КонецЕсли;


	//Инициализируем дополнительные параметры вывода
	ПараметрыВывода    = Новый Структура;
	ПараметрыВывода.Вставить("МакетОформления"                        , Неопределено);
	ПараметрыВывода.Вставить("ПроверятьДоступностьПолей"              , Истина);
	ПараметрыВывода.Вставить("ПараметрыФункциональныхОпций"           , Новый Структура);
	ПараметрыВывода.Вставить("ВозможностьИспользованияВнешнихФункций" , Ложь);
	ПараметрыВывода.Вставить("МенеджерВременныхТаблиц"                , Неопределено);
	ПараметрыВывода.Вставить("ОграничиватьПолучениеПолейПоСсылкамПоПравуПросмотр" , Истина);

	Если НЕ ДополнительныеПараметры = Неопределено Тогда
		ЗаполнитьЗначенияСвойств(ПараметрыВывода, ДополнительныеПараметры);
	КонецЕсли;

	Если ТипЗнч(ПараметрыВывода.МенеджерВременныхТаблиц) = Тип("Структура") Тогда
		МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
		Для Каждого КлючИЗначение Из ПараметрыВывода.МенеджерВременныхТаблиц Цикл
			ДобавитьТаблицуВМенеджерВременныхТаблиц(МенеджерВременныхТаблиц, КлючИЗначение.Ключ, КлючИЗначение.Значение);
		КонецЦикла;
		ПараметрыВывода.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	КонецЕсли;

	//Определяем тип генератора
	Если ТипЗнч(Результат) = Тип("ТаблицаЗначений") ИЛИ ТипЗнч(Результат) = Тип("ДеревоЗначений") Тогда
		ВыводВКоллекциюЗначений = Истина;
		ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
	Иначе
		ВыводВКоллекциюЗначений = Ложь;
		ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанных");
	КонецЕсли;

	//Формируем макет, с помощью компоновщика макета
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

	//Передаем в макет компоновки схему, настройки и данные расшифровки
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, ВыполняемыеНастройки,
	ДанныеРасшифровки, ПараметрыВывода.МакетОформления, ТипГенератораВывода,
	ПараметрыВывода.ПроверятьДоступностьПолей, ПараметрыВывода.ПараметрыФункциональныхОпций);

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

	//Выводим результат
	Если ВыводВКоллекциюЗначений Тогда
		ПроцессорВывода    = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
		ПроцессорВывода.УстановитьОбъект(Результат);
	Иначе
		ПроцессорВывода    = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
		ПроцессорВывода.УстановитьДокумент(Результат);
	КонецЕсли;

	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

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

// Процедура добавляет таблицу в менеджер временных таблиц
//
// Параметры:
//  МенеджерВременныхТаблиц	 - МенеджерВременныхТаблиц - Менеджер, в который нужно добавить таблицу
//  ИмяТаблицы				 - Строка - Имя временной таблицы
//  ДанныеТаблицы			 - ТаблицаЗначений - Данные таблицы
//
Процедура ДобавитьТаблицуВМенеджерВременныхТаблиц(МенеджерВременныхТаблиц, ИмяТаблицы, ДанныеТаблицы) Экспорт

	ИменаКолонок = Новый Массив;
	Для Каждого Колонка Из ДанныеТаблицы.Колонки Цикл
		ИменаКолонок.Добавить(Колонка.Имя);
	КонецЦикла;
	ИменаКолонок = СтрСоединить(ИменаКолонок, ",");

	ТекстЗапроса = "ВЫБРАТЬ %1 ПОМЕСТИТЬ %2 ИЗ &ТЗ КАК ТЗ";
	ТекстЗапроса = СтрШаблон(ТекстЗапроса, ИменаКолонок, ИмяТаблицы);

	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("ТЗ", ДанныеТаблицы);
	Запрос.Выполнить();

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