Полезные примеры: получение данных на основании СКД

Когда СКД только появилась, я задавал себе вопрос: “СКД для отчетов – замечательная вещь! Может быть, как-то можно ее использовать в работе и в других областях? Вместо запросов”. С одной стороны, СКД – очень мощный инструмент, с другой стороны – как-то не совсем удобно или понятно его использовать (там же надо что-то куда-то вставлять, чтобы получить данные), а запрос написал и выгрузил в таблицу или дерево.

Все разрешилось само собой (методом проб и ошибок, конечно), когда я стал решать реальные задачи. Сейчас я даже простые данные получаю с помощью СКД… спросите, почему? Есть одна, но очень серьезная причина:

Легкость написания, а главное, отладки запроса (в любой консоли). Те, кто сталкивался с запросами, знают, что некоторые запросы очень сложно отлаживать. Приходится использовать дополнительные обработки, чтобы “на лету” изменить параметры и посмотреть, что получится. К тому же в тех обработках, что я знаю, данные представляются как таблица значений, и понять, какое дерево значений получится в итоге, довольно сложно. Используя же СКД, мы получаем полное визуальное представление о получаемых данных (за исключением иерархических данных, СКД при выгрузке, например, в дерево их просто выгрузит в развернутом виде, по каждому полю, но и это решаемо.), а потом просто копируем настройки СКД в свою обработку.

Все же остается вопрос: как проще, быстрее и удобнее использовать СКД? Ведь тут, казалось бы, написание простых запросов имеет преимущество (хотя бы по времени написания). Лично для меня многие вопросы закрылись после написания шаблонов. Надеюсь, что и для Вас они будут полезны.

//****************************************************************************
// ШАБЛОНЫ ДЛЯ ИСПОЛЬЗОВАНИЯ СКД
// Заполняет переданный объект на основании СКД
// Параметры
//  СКД – собственно настройки СКД
//  ОбъектДляЗагрузки – объект в который выгружаются данные, таблица значений, дерево значений, табличный документ
//  ИсполняемыеНастройки – Пользовательские настройки СКД если не указаны будут использованы настроки СКД по умолчанию
//  СтруктураПараметров - Структура – Передаваемые для СКД параметры
Процедура ПолучитьДанныеНаОснованииСКД(СКД, ОбъектДляЗагрузки, ИсполняемыеНастройки = Неопределено, СтруктураПараметров = Неопределено, РасшифровкаСКД = Неопределено, МакетКомпоновки = Неопределено, ВнешниеНаборыДанных = Неопределено) Экспорт    
 
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        Если ТипЗнч(ОбъектДляЗагрузки) = Тип("ПолеТабличногоДокумента") или ТипЗнч(ОбъектДляЗагрузки) = Тип("ТабличныйДокумент") Тогда
                ТипГенератора = Тип("ГенераторМакетаКомпоновкиДанных");
        Иначе        
                ТипГенератора = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
        КонецЕсли;
        Если ИсполняемыеНастройки = Неопределено Тогда
                ИсполняемыеНастройки = СКД.НастройкиПоУмолчанию;
        КонецЕсли;
        Если СтруктураПараметров <> Неопределено Тогда
                КоллекцияЗначенийПараметров = ИсполняемыеНастройки.ПараметрыДанных.Элементы;
                Для каждого Параметр Из СтруктураПараметров Цикл
                        НайденноеЗначениеПараметра = КоллекцияЗначенийПараметров.Найти(Параметр.Ключ);
                        Если НайденноеЗначениеПараметра <> Неопределено Тогда
                                НайденноеЗначениеПараметра.Использование = Истина;
                                НайденноеЗначениеПараметра.Значение = Параметр.Значение;
                        КонецЕсли;
                КонецЦикла;
        КонецЕсли;
        МакетКомпоновкиСКД      = КомпоновщикМакета.Выполнить(СКД, ИсполняемыеНастройки, РасшифровкаСКД, МакетКомпоновки, ТипГенератора);
        ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиСКД, ВнешниеНаборыДанных, РасшифровкаСКД);
        Если ТипЗнч(ОбъектДляЗагрузки) = Тип("ПолеТабличногоДокумента") или ТипЗнч(ОбъектДляЗагрузки) = Тип("ТабличныйДокумент") Тогда
                ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
                ПроцессорВывода.УстановитьДокумент(ОбъектДляЗагрузки);
        Иначе      
                ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
                ПроцессорВывода.УстановитьОбъект(ОбъектДляЗагрузки);
        КонецЕсли;
        ПроцессорВывода.ОтображатьПроцентВывода = Истина;
        ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
 
КонецПроцедуры

Вставляем данный код в модуль своей обработки, отчета или даже конфигурации и используем, где потребуется.

Например, получение данных сводится к трем простым действиям:
1. Написать запрос и настроить СКД в любой консоли, позволяющей это сделать.
2. Выгрузить настройки из консоли и загрузить в макет
3. Написать в необходимом месте код типа:

ДеревоЗначений                      = Новый ДеревоЗначений;
СхемаКомпоновкиДанных   = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
СтруктураПараметров     = Новый Структура("ДатаОтчета", НашаДата);
ПолучитьДанныеНаОснованииСКД(СхемаКомпоновкиДанных, ДеревоЗначений, СхемаКомпоновкиДанных.НастройкиПоУмолчанию, СтруктураПараметров);
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии