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

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

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

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

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

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

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

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

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