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