"Основные моменты при работе с СКД"
Опубликовано Ср 05 Сентябрь 2012 в "СКД"
Теги: СКД, Параметры СКД,
В данном топике я хотел бы затронуть, некоторые моменты работы с СКД: работа с формой отчета, использование нескольких схем компоновки данных, работа с параметрами и так по мелочи, что накопилось за время использования СКД. continue
Как использовать параметры в СКД?
При написании отчета для СКД иногда возникает потребность в использовании параметров, какие есть варианты? Для начала надо определиться что для того что бы параметры стали доступными, необходимо поставить галочку в схеме вот здесь:
- Тыкнуть по кнопочке настройки, и задать настройки на стандартной форме. Мы этот вариант даже рассматривать не будем, по той простой причине, что их видно на стандартной форме невооруженным глазом, достаточно тыкнуть на кнопку... Настройки конечно же.
- Сделать таблицу на форме и указать у нее источник.
- Добавить на форму отчета поля ввода и прописать изменение параметров СКД при их изменении
Рассмотрим все варианты по подробнее.
2. Вывод всех прописанных настроек в одной таблице
Это делается очень просто, добавляется таблица значений на форму а источником данных нужно указать: ОтчетОбъект -> КомпоновщикНастроек -> Настройки -> Параметры данных.
3. Вынесение параметров отчета на форму, как правило самый нужный и удобный метод установки параметров.
Для этого создадим форму отчета, если вы ее еще не создали (куда то, нам надо вынести параметры которые мы будем передавать в СКД) и добавим поле ввода нужного нам типа. И в событии "ПриИзменении" укажем следующий код:
Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
Параметр = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПараметрУказанныйВЗапросе"));
Если Параметр <> Неопределено Тогда
Параметр.Значение = ЗначениеКотороеМыХотимУстановить;
Параметр.Использование = Истина;
КонецЕсли;
Готово! Теперь при изменении элемента на форме параметр будет автоматически загружаться в СКД.
Использование нескольких схем
Периодически бывает что один отчет должен показывать вроде бы одну и ту же информацию но в разрезе разных показателей. И вроде отчет тот же, только сменился тип аналитики, или убрали колонку, которая участвовала в расчетах, но "почти" это для пользователя, для разработчика это уже другой набор полей и уже скорее всего структура другая, вообщем необходимо делать другой отчет, но можно просто использовать несколько схем и переключаться между ними по мере надобности. Переключаться между схемами несложно, достаточно сделать кнопочку повешать на нее следующую процедуру:
Процедура СменитьСхему()
СхемаКомпоновкиДанных = ПолучитьМакет("ЗдесьНадоУказатьИмяСхемы");
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
КонецПроцедуры
Как видите, все просто, при желании можно сократить до двух строк или даже одной, но не уверен, что это пойдет на пользу читаемости кода. Но тут есть свой нюанс, при загрузке новых настроек старые параметры сотрутся, что на самом деле логично, но нас такое положение дел совершенно не устраивает. Какой из этого есть выход? Я думаю надо перед сменой компоновки параметры, надо сохранить в какой то буфер, а потом их восстановить. Как получить\записать параметр я уже говорил выше и не буду на это останавливаться. Так как параметров как правило больше чем два, особенно если это сложный отчет, то неправильно будет, писать
Параметр1 = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПараметрИзЗапроса"));
СохраненноеЗначение1 = Параметр1.Значение;
Параметр2 = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПараметрИзЗапроса2"));
СохраненноеЗначение2 = Параметр2.Значение;
//смена схемы компоновки
Параметр1 = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПараметрИзЗапроса"));
Параметр1.Значение = СохраненноеЗначение1;
Параметр1.Использование = Истина;
Параметр2 = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПараметрИзЗапроса2"));
Параметр2.Значение = СохраненноеЗначение2;
Параметр2.Использование = Истина;
//и тд
Я надеюсь, что вы понимаете, что этот код написан для примера и не стоит использовать перемнные с именами "СохраненноеЗначение1","СохраненноеЗначение2", но даже если не понимаете, все равно не используйте.
Хочется оптимизировать вышеприведенный код, что бы просто указать: СохраниСписокПараметров("ЗдесьСписокПараметров");
потом сменить схему и сделать ВосстановиСписокПараметров("ЗдесьСписокПараметров");
Написанием этих процедур мы и займемся, для этого далее я напишу эти две процедуры, одна будет сохранять параметры в спецально для этого отведнную структуру, другая будет из нее восстанавливать параметры. Вот они обе:
Функция СохранитьПараметры(ИменаПараметров)
Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
МассивСИменами = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ИменаПараметров,",");
СтруктураДляПараметров = Новый Структура;
Для Каждого ИмяПараметра Из МассивСИменами Цикл
Параметр = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра));
Если Параметр <> Неопределено Тогда
СтруктураДляПараметров.Вставить(ИмяПараметра, Параметр.Значение);
КонецЕсли;
КонецЦикла;
Возврат СтруктураДляПараметров;
КонецФункции
Процедура ЗагрузитьПараметры(СтруктураСПараметрами)
Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
Для Каждого ТекущийПараметр Из СтруктураСПараметрами Цикл
Параметр = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ТекущийПараметр.Ключ));
Если Параметр <> Неопределено Тогда
Параметр.Значение = ТекущийПараметр.Значение;
Параметр.Использование = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Остановлюсь, что бы более подробно объяснить, что происходит. Функция СохранитьПараметры принимает на входе строку с именами тех параметров которые надо сохранить. Затем она находит по имени нужный параметр и сохраняет в структуру, которую возвращает по окончании перебора всех параметров полученых из строки. То же самое, только наоборот делает процедура загрузить, она принимает структуру и загружает из нее в СКД параметры. Далее надо собрать все вместе, выглядеть это будет примерно так:
Функция СохранитьПараметры(ИменаПараметров)
Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
МассивСИменами = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ИменаПараметров,",");
СтруктураДляПараметров = Новый Структура;
Для Каждого ИмяПараметра Из МассивСИменами Цикл
Параметр = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра));
Если Параметр <> Неопределено Тогда
СтруктураДляПараметров.Вставить(ИмяПараметра, Параметр.Значение);
КонецЕсли;
КонецЦикла;
Возврат СтруктураДляПараметров;
КонецФункции
Процедура ЗагрузитьПараметры(СтруктураСПараметрами)
Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
Для Каждого ТекущийПараметр Из СтруктураСПараметрами Цикл
Параметр = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ТекущийПараметр.Ключ));
Если Параметр <> Неопределено Тогда
Параметр.Значение = ТекущийПараметр.Значение;
Параметр.Использование = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура СменитьСхему()
СтруктураСНастройками = СохранитьПараметры("Параметр1,Параметр2,Параметр3");
СхемаКомпоновкиДанных = ПолучитьМакет("ЗдесьИмяНужнойВамСхемы");
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
ЗагрузитьПараметры(СтруктураСНастройками);
КонецПроцедуры
Вывод СКД в отчет
Если вы создали форму отчета у СКД(то есть если у вас отчет и есть схема компоновки данных), то по умолчанию на кнопке "Сформировать" висит предустанновленная команда "Сфрмировать", которая запустит текущую схему, но можно туда повесить свой обработчик, если нужно перед формированием сделать какие нибудь манипуляции, вот код который можно туда повесить:
КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.Настройки,ДанныеРасшифровки);
ПроцессорКомпоновкиДанных=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,,ДанныеРасшифровки,Истина);
ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
Если вы не понимаете, что вообще происходит, просто сделайте кнопку на форме, и засуньте в обработчик этот код, сразу станет понятно, что все просто и что в целом то даже процессом вывода можно управлять, например перед формированием отчета, можно установить заголовок, в зависимости от установленных параметров или свернуть группировки после формирования, или время там формирования засечь, всякое бывает. Также можно вывести разом, а можно построчно, посмотреть детали можно в синтаксис помощнике по адресу Общие объекты -> Система компоновки данных -> Работа с механизмом -> ПроцессорВыводаРезультатаКомпоновкиДанных
Установка в качестве параметра списка значений.
Когда нужно использовать список значений, для параметра необходимо установить галочку "Доступен список значений" иначе, даже если на входе будет список, СКД все равно будет брать только первое значение, галочка вот здесь:
С этой галочкой в штатном списке параметров СКД, вы бонусом получаете красивый и удобный список для подбора ваших значений.
Вывод СКД в таблицу.
Бывает нужен, если нужно проанализировать или что то сделать с результатами работы, что бы получить результат работы СКД в таблицу значений или в дерево значений, вам поможет следующий код:
КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанных=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
ТЗДляВывода = Новый ТаблицаЗначений;//здесь может быть и дерево значений
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТЗДляВывода);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
собственно здесь в ТЗДляВывода мы получаем результат формирования отчета. Собственно если не касаться непосредствнно самого СКД, то здесь описаны практически все моменты работы с формой отчета построенного на СКД.
Бонусы
Тому кто домучал до конца эту длинную повесть, пригодятся бонусы: Курс от гилева про СКД, что бы не искать информацию про СКД, можно скачать бесплатный курс по СКД Можно взять шаблон, в котором есть все нужные для оформления фичи