Каталог решений - Универсальная функция для программного выполнения СКД

Универсальная функция для программного выполнения СКД

Универсальная функция для программного выполнения СКД

В наличии

Часто встречаются вопросы на форумах о программном формировании СКД. Вроде и информации много по этому поводу, но… Все как всегда 🙂
Собственно, в описании без лишних слов выложен текст общей функции, в которую, для выполнения отчета, нужно передать (минимум 2 параметра): СКД и ТабличныйДокумент.

Категория:

Описание

Передаваемые параметры описаны в комментарии к процедуре.
Функция возвращает ДанныеРасшифровкиКомпоновкиДанных.

Из БСП используется только общая процедура:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора() 

Собственно сама общая функция.

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

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


    Для каждого ТекущийПараметр Из СтруктураПараметров Цикл

        ОбщегоНазначенияКлиентСервер.УстановитьПараметрСКД(СКД.Параметры, ТекущийПараметр.Ключ, ТекущийПараметр.Значение, ОграничениеИспользованияПараметров);

    КонецЦикла;

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

    Отбор = Настройки.Отбор;

    Для каждого ТекущийПараметр Из Настройки.ПараметрыДанных.Элементы Цикл
        // Надеюсь, временный костыль. Нужно перебрать параметры варианта и установить их.

        ИмяПараметра        = Строка(ТекущийПараметр.Параметр);
        ЗначениеПараметра   = Неопределено;
        Если СтруктураПараметров.Свойство(ИмяПараметра, ЗначениеПараметра) Тогда
            ТекущийПараметр.Использование   = Истина;
            ТекущийПараметр.Значение        = ЗначениеПараметра;
        КонецЕсли;

    КонецЦикла;

    Для каждого ТекущийОтбор Из СтруктураОтборов Цикл

        Если ТекущийОтбор.Ключ = "СложныйОтбор" Тогда
            // Если в качестве ключа строка "СложныйОтбор", значит установка отбора через общие процедуры:
            //  ОбщиеПроцедуры.УстановитьУниверсальныйОтбор(Отбор);

            Выполнить ТекущийОтбор.Значение;

        Иначе

            СтруктураПараметровПроцедуры = Новый Структура("ПравоеЗначение, ВидСравнения, Представление, Использование, РежимОтображения, ИдентификаторПользовательскойНастройки");

            Для каждого ТекущийПараметрОтбора Из МассивПараметровОтбора Цикл

                Если ТекущийОтбор.Значение.Свойство(ТекущийПараметрОтбора) Тогда

                    СтруктураПараметровПроцедуры.Вставить(ТекущийПараметрОтбора, ТекущийОтбор.Значение[ТекущийПараметрОтбора]);

                КонецЕсли;

            КонецЦикла;

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

        КонецЕсли;

    КонецЦикла;


    КомпоновщикМакетаКомпоновкиДанных = Новый КомпоновщикМакетаКомпоновкиДанных;
    ДанныеРасшифровкиКомпоновкиДанных = Новый ДанныеРасшифровкиКомпоновкиДанных;
    МакетКомпоновкиДанных = КомпоновщикМакетаКомпоновкиДанных.Выполнить(СКД, Настройки, ДанныеРасшифровкиКомпоновкиДанных);

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

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

    СтруктураВозврата = Новый Структура;
    СтруктураВозврата.Вставить("ДанныеРасшифровкиКомпоновкиДанных", ДанныеРасшифровкиКомпоновкиДанных);

    Возврат СтруктураВозврата;

КонецФункции // ВыполнитьСКД

 Спасибо, Yashazz, за то что нашел использование общей процедуры УстановитьПараметрСКД()(которую я не описал).

// Поиск и установка значения параметра схемы компоновки данных
// Параметры:
//		ПараметрыСКД		- ПараметрыСхемыКомпоновкиДанных - Параметры СКД
//		ИмяПараметра		- Строка		- Имя параметра
//		ЗначениеПараметра	- Произвольное	- Устанавливаемое значение параметра
//
Процедура УстановитьПараметрСКД(ПараметрыСКД, ИмяПараметра, ЗначениеПараметра, ОграничениеИспользования = Неопределено) Экспорт 
	
	НайденныйПараметр = ПараметрыСКД.Найти(ИмяПараметра);
	Если НайденныйПараметр = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	НайденныйПараметр.Значение		= ЗначениеПараметра;
	
	Если Не ОграничениеИспользования = Неопределено Тогда
		НайденныйПараметр.ОграничениеИспользования = ОграничениеИспользования;
	КонецЕсли;
	
КонецПроцедуры // УстановитьПараметрСКД
 
has been added to your cart:
Оформление заказа