Публикации

БСП
Разработки

Найдено результатов: 45


Язык выражений СКД Формат()

Коллеги, подскажите пожалуйста, почему не отрабатывает Формат()? 2020-05-24_16-26-07.jpg
SDV 35 7

Перенести отбор СКД

Перенести отбор СКД из одного компоновщика в другой
acsent 82 15
Процедура ПеренестиОтбор(ОтборПриемник, ОтборИсточник)
	
	Для каждого ЭлементИсточник Из ОтборИсточник.Элементы Цикл
		
		Если ТипЗнч(ЭлементИсточник) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
			
			Если ТипЗнч(ЭлементИсточник.ЛевоеЗначение) = Тип("ПолеКомпоновкиДанных") Тогда
			
				Если ОтборПриемник.ДоступныеПоляОтбора.НайтиПоле(ЭлементИсточник.ЛевоеЗначение) = Неопределено Тогда
					Продолжить;
				КонецЕсли;	
			
			КонецЕсли;
		
		КонецЕсли;	
		
		ЭлементПриемник = ОтборПриемник.Элементы.Добавить(ТипЗнч(ЭлементИсточник));
		ЗаполнитьЗначенияСвойств(ЭлементПриемник, ЭлементИсточник);
		
		Если ТипЗнч(ЭлементИсточник) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
			ПеренестиОтбор(ЭлементПриемник, ЭлементИсточник);
		КонецЕсли;	
		
	КонецЦикла;	
	
КонецПроцедуры

Программное создание схемы СКД

Пример программного создания схемы СКД
acsent 82 15
Функция СоздатьСхемуКомпоновки() Экспорт
	
	СхемаСКД = Новый СхемаКомпоновкиДанных;
	ИсточникДанных = СхемаСКД.ИсточникиДанных.Добавить();
	ИсточникДанных.Имя                = "ИсточникДанных";
	ИсточникДанных.ТипИсточникаДанных = "local";
	
	НаборДанных = СхемаСКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
	НаборДанных.Имя        = "Данные";
	НаборДанных.ИмяОбъекта = "Данные";
	НаборДанных.ИсточникДанных = "ИсточникДанных";
	
	Настройки   = СхемаСКД.НастройкиПоУмолчанию;
	
	Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	
	Параметр = СхемаСКД.Параметры.Добавить();
	Параметр.Имя         = "Период";
	Параметр.ТипЗначения = Новый ОписаниеТипов("СтандартныйПериод");
	
	Для каждого СтрокаТЗ из Поля Цикл
		
		ТипЗначения = ЗначениеИзСтрокиВнутр(СтрокаТЗ.ТипЗначения);
		
		Если СтрокаТЗ.Ресурс Тогда
			
			Поле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
			Поле.Поле        = СтрокаТЗ.Имя + "Тек";
			Поле.ТипЗначения = ТипЗначения;
			Поле.Заголовок   = Представление(СтрокаТЗ) + " (тек)";
			Поле.ПутьКДанным = СтрокаТЗ.Имя + "Тек";
			
			Поле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
			Поле.Поле        = СтрокаТЗ.Имя + "Др";
			Поле.ТипЗначения = ТипЗначения;
			Поле.Заголовок   = Представление(СтрокаТЗ) + " (др)";
			Поле.ПутьКДанным = СтрокаТЗ.Имя + "Др";
			
			ВычисляемоеПоле = СхемаСКД.ВычисляемыеПоля.Добавить();
			ВычисляемоеПоле.ПутьКДанным = "Разница" + СтрокаТЗ.Имя;
			ВычисляемоеПоле.Выражение   = "ЕстьNULL(" + СтрокаТЗ.Имя + "Тек, 0) - ЕстьNULL(" + СтрокаТЗ.Имя + "Др, 0)";
			ВычисляемоеПоле.ТипЗначения = ТипЗначения;
			ВычисляемоеПоле.Заголовок   = "Разница (" + Представление(СтрокаТЗ) + ")";
			
			ПолеИтога = СхемаСКД.ПоляИтога.Добавить();
			ПолеИтога.ПутьКДанным = СтрокаТЗ.Имя + "Тек";
			ПолеИтога.Выражение   = "Сумма(" + СтрокаТЗ.Имя + "Тек)";
			
			ПолеИтога = СхемаСКД.ПоляИтога.Добавить();
			ПолеИтога.ПутьКДанным = СтрокаТЗ.Имя + "Др";
			ПолеИтога.Выражение   = "Сумма(" + СтрокаТЗ.Имя + "Др)";
			
			ПолеИтога = СхемаСКД.ПоляИтога.Добавить();
			ПолеИтога.ПутьКДанным = "Разница" + СтрокаТЗ.Имя;
			ПолеИтога.Выражение   = "Сумма(Разница" + СтрокаТЗ.Имя + ")";
			
			Группа = Настройки.Выбор.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных"));
			Группа.Расположение  = РасположениеПоляКомпоновкиДанных.Горизонтально;
			Группа.Заголовок     = Представление(СтрокаТЗ);
			Группа.Использование = Истина;
			
			ВыбранноеПоле = Группа.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
			ВыбранноеПоле.Поле          = Новый ПолеКомпоновкиДанных(СтрокаТЗ.Имя + "Тек");
			ВыбранноеПоле.Заголовок     = "Текущая";
			ВыбранноеПоле.Использование = Истина;
			
			ВыбранноеПоле = Группа.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
			ВыбранноеПоле.Поле          = Новый ПолеКомпоновкиДанных(СтрокаТЗ.Имя + "Др");
			ВыбранноеПоле.Заголовок     = "Другая";
			ВыбранноеПоле.Использование = Истина;
			
			ЭлементОформления = Настройки.УсловноеОформление.Элементы.Добавить();
			ЭлементОформления.Использование = Истина;
			УстановитьОформления(ЭлементОформления.Оформление);
			
			ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
			ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Разница" + СтрокаТЗ.Имя);
			ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеРавно;
			ЭлементОтбора.ПравоеЗначение = 0;
			ЭлементОтбора.Использование  = Истина;
			
			ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
			ПолеОформления.Использование = Истина;
			ПолеОформления.Поле          = Новый ПолеКомпоновкиДанных(СтрокаТЗ.Имя + "Тек");
			
			ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
			ПолеОформления.Использование = Истина;
			ПолеОформления.Поле          = Новый ПолеКомпоновкиДанных(СтрокаТЗ.Имя + "Др");
			
		Иначе	
			
			Поле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
			Поле.Поле        = СтрокаТЗ.Имя;
			Поле.Заголовок   = Представление(СтрокаТЗ);
			Поле.ПутьКДанным = СтрокаТЗ.Имя;
			Поле.ТипЗначения = ТипЗначения;
			
			ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
			ВыбранноеПоле.Поле          = Новый ПолеКомпоновкиДанных(СтрокаТЗ.Имя);
			ВыбранноеПоле.Использование = Истина;
			
		КонецЕсли;	
		
	КонецЦикла;	
	
	Возврат СхемаСКД;
	
КонецФункции

Значение полей в расшифровке СКД

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

&НаСервереБезКонтекста 
Процедура ЗаполнитьМассивРодителей(МассивРодителей, Родители)
	
	Для каждого Родитель из Родители Цикл
		
		Если ТипЗнч(Родитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
			МассивРодителей.Добавить(Родитель.ПолучитьПоля());
			
		ИначеЕсли ТипЗнч(Родитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
			
		КонецЕсли;	
		
		Родители = Родитель.ПолучитьРодителей();
		Если Родители.Количество() > 0 Тогда
			ЗаполнитьМассивРодителей(МассивРодителей, Родители);
		КонецЕсли;	
		
	КонецЦикла;	

КонецПроцедуры	

Структура отчета СКД

Программное создание структуры отчета на СКД
ТекНастройкиКомпоновщика =КомпоновщикНастроек.Настройки;
ТекНастройкиКомпоновщика.Структура.Очистить();

 //добавить группировку
 

ГруппировкаПоСкладу = ТекНастройкиКомпоновщика.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ГруппировкаПоСкладу.Имя = "Склад";
ГруппировкаПоСкладу.Использование = Истина;

 //созданная группировка по полю "Склад"
 
ПолеГруппировкиСклад = ГруппировкаПоСкладу.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));       
ПолеГруппировкиСклад.Использование      = Истина;
ПолеГруппировкиСклад.Поле               = Новый ПолеКомпоновкиДанных("Склад");
ПолеГруппировкиСклад.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Иерархия;
ПолеГруппировкиСклад.ТипДополнения      = ТипДополненияПериодаКомпоновкиДанных.БезДополнения;

 //добавить выводимые поля в группировке: склад и количество остаток для данной группировки
 
ВыбранноеПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));     
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Склад");
ВыбранноеПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));     
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("КоличествоОстаток");

 //добавим детальные записи как подгруппу в "Склад". Все отличие только в том, что нет группировки
 
ДетальныеЗаписи = ГруппировкаПоСкладу.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ДетальныеЗаписи.Имя = "Детальные";
ДетальныеЗаписи.Использование = Истина;
 //добавить выводимые поля в детальных записях: Номенклатуру и количество остаток 
 
ВыбранноеПоле = ДетальныеЗаписи.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));   
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
ВыбранноеПоле = ДетальныеЗаписи.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));   
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("КоличествоОстаток");

Соединяем план и факт

Коллеги добрый вечер. Составляю отчет на СКД "Анализ расхода продуктов питания". Отчёт должен сравнивать фактические расходы продуктов с плановыми показателями. Ниже набросок Запроса (набора данных) ВЫБРАТЬ РасходПродуктовПоКДОбороты.Учреждение, РасходПр...
SDV 35 7

Инициализация компоновщика настроек

Инициализация компоновщика настроек, обработка. СКД
acsent 82 15
СхемаСКД = ПолучитьМакет("СхемаСКД");
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаСКД));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаСКД.НастройкиПоУмолчанию);

Странное поведение макета в СКД

Коллеги, добрый день. Ширина колонок пляшет при выводе отчета =( Как победить? Совет типа: "Брось это дело и формируй табличный документ не из СКД" тоже принимаются к рассмотрению =) 2020-06-12_15-14-51.jpg
SDV 35 7

Подставить свой макет в СКД

Автор: HostHost

FastCode 64 8
СхемаКомпоновкиДанных          = ПолучитьМакет("МакетСКД");

АдресСхемыКомпоновкиДанных     = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Новый УникальныйИдентификатор);

ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных);       

КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);

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

Вывод данных СКД в табличный документ

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

Вывод данных СКД в таблицу значений (дерево)

Вывод данных СКД в таблицу значений (дерево)
acsent 82 15
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
	
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Таблица = ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);

Изменение событий в отборе СКД

Изменение событий в отборе СКД (обычные формы)
acsent 82 15
ЭлементыФормы.Отбор.Колонки.ПравоеЗначениеДляКраткогоОтображенияЭлемента.ЭлементУправления.УстановитьДействие("НачалоВыбора", Новый Действие("ОтборНачалоВыбора"));

Процедура ОтборНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	ТекущиеДанные = ЭлементыФормы.Отбор.ТекущиеДанные;
	Если Строка(ТекущиеДанные.ЛевоеЗначение) = "Родитель" Тогда
		
		СтандартнаяОбработка = Ложь;
		Форма = Справочники.Номенклатура.ПолучитьФормуВыбораГруппы(, Элемент);
		Форма.Открыть();
		
	КонецЕсли;	
	
КонецПроцедуры	

Установить параметр отчета СКД

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


КонецПроцедуры

Скомпоновать результат отчета

Выполняет компоновку СКД по переданным настройкам
// Выполняет компоновку СКД по переданным настройкам
//
// Параметры:
//  Результат               - ТабличныйДокумент,ТаблицаЗначений,ДеревоЗначений                      - результат выполнения
//  СхемаКомпоновкиДанных   - СхемаКомпоновкиДанных                                                 - выполняемая СКД
//  НастройкиКомпоновки     - НастройкиКомпоновкиДанных,КомпоновщикНастроекКомпоновкиДанных,Строка  - выполняемые настройки или адрес временного хранилища или компоновщик с настройками
//  ДанныеРасшифровки       - ДанныеРасшифровкиКомпоновкиДанных, Неопределено                       - данные расшифровки
//  ВнешниеНаборыДанных     - Структура, Неопределено                                               - коллекция внешних наборов данных
//  ДополнительныеПараметры - Структура, Неопределено                                               - коллекция внешних наборов данных
//       * МакетОформления              - МакетОформленияКомпоновкиДанных   - Макет оформления, в соответствии с которым необходимо оформлять макет компоновки данных.
//       * ПроверятьДоступностьПолей    - Булево - Определяет, выполнять ли проверку прав на просмотр полей и проверку доступности поля во включенных функциональных возможностях.
//       * ПараметрыФункциональныхОпций - Булево - Содержит параметры функциональных опций, используемые при исполнении отчета.
//       * ВозможностьИспользованияВнешнихФункций - Булево - Указывает возможность использования функции общих модулей конфигурации в выражениях компоновки данных.
//
// SeiOkami: 
//     https://infostart.ru/profile/309462/
//     https://t.me/JuniorOneS
//Подробнее об использовании метода: https://infostart.ru/public/1082944/?ref=1159
//
Процедура СкомпоноватьРезультатОтчета(Результат, СхемаКомпоновкиДанных, НастройкиКомпоновки, 
    ДанныеРасшифровки = Неопределено, ВнешниеНаборыДанных = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
           
    
    //Инициализируем настройки
    Если ТипЗнч(НастройкиКомпоновки) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
        ВыполняемыеНастройки    = НастройкиКомпоновки.ПолучитьНастройки();
    ИначеЕсли ТипЗнч(НастройкиКомпоновки) = Тип("Строка") И ЭтоАдресВременногоХранилища(НастройкиКомпоновки) Тогда
        ВыполняемыеНастройки    = ПолучитьИзВременногоХранилища(НастройкиКомпоновки);
    Иначе 
        ВыполняемыеНастройки    = НастройкиКомпоновки;   
    КонецЕсли;
    
    Если НЕ ТипЗнч(ВыполняемыеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда
        Возврат;
    КонецЕсли;
    

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

КонецПроцедуры

Грабли при работе с макетом в СКД

Показана особенность при работе с макетом в конструкторе СКД, которая может легко загубить результаты вашей работы На скринах показано как можно легко испортить Макет из-за своеобразной логики работы конструктора СКД 2020-06-15_15-35-36 (2).jpg 2020-06-...
SDV 35 7

Создание схемы компоновки данных программно

Функция на вход принимает Запрос, Текст запроса, таблицу значений и дерево значений
miha 7 1
// Пример универсальной функции для создания схемы компоновки данных
// Опубликовал Дмитрий Иванов (kambl) в раздел Программирование - Практика программирования
// http://infostart.ru/public/575659/
//
// Если вам приходится часто создавать схему компоновки данных программно или вы начинающий специалист и пытаетесь разобраться, что же за зверь такой СКД, то эта статья может оказаться вам полезной. Функция создает схему компоновки с минимально необходимой структурой данных. С помощью передачи дополнительных параметров есть возможность добавления ресурсов и оформления.
// Появилась необходимость часто прибегать к программному созданию схемы компоновки данных. Было принято решение написать универсальную функцию принимающую различные наборы данных и на выходе возвращающую готовую СКД. Функция на вход принимает Запрос, Текст запроса, таблицу значений и дерево значений.
// Помимо набора данных функция принимает ряд необязательных параметров:
//
//  Структура ресурсов: содержит перечень полей ресурсов, где ключ - ИмяПоля, Значение(Строка) - Агрегатная функция ("Сумма", "Среднее", "Количество",  и т.д.);
//  Флаг АвтоЗаполнениеДоступныхПолей;
//  Строковое Имя макета оформления.
//
// НаборДанных (Типы: Строка, Запрос, ТаблицаЗначений, ДеревоЗначений)
// Искомый набор данных
//
// СтруктураРесурсов (Тип: Структура) - Структура полей ресурсов, где ключ - ИмяПоля, Значение(Строка) - Агрегатная функция
//
// ВноситьПоляВыбора (Тип: Булево) - Флаг добавление полей набора
//
// ИмяСтандартногоМакетаОформления (Тип: Строка) - Имя макета оформления
//
Функция СоздатьСхемуКомпоновкиДанных(НаборДанных, СтруктураРесурсов = Неопределено, АвтоЗаполнениеДоступныхПолей = Истина, ИмяСтандартногоМакетаОформления = "")
	СКД = Новый СхемаКомпоновкиДанных;

	// Заполнение основных данных схемы
	ИсточникДанных = СКД.ИсточникиДанных.Добавить();
	ИсточникДанных.Имя                = "ИсточникДанных";
	ИсточникДанных.ТипИсточникаДанных = "Local";

	Если      ТипЗнч(НаборДанных) = Тип("Строка") или
	          ТипЗнч(НаборДанных) = Тип("Запрос") Тогда
		ТекущийНаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
		ТекущийНаборДанных.Имя                          = "ОсновнойНабор";
		ТекущийНаборДанных.Запрос                       = ?(ТипЗнч(НаборДанных) = Тип("Строка"), НаборДанных, НаборДанных.Текст);
		ТекущийНаборДанных.ИсточникДанных               = "ИсточникДанных";
		ТекущийНаборДанных.АвтоЗаполнениеДоступныхПолей = АвтоЗаполнениеДоступныхПолей;

		ТипНабора = "Запрос";
	ИначеЕсли ТипЗнч(НаборДанных) = Тип("ТаблицаЗначений") или
	          ТипЗнч(НаборДанных) = Тип("ДеревоЗначений") Тогда
		ТекущийНаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
		ТекущийНаборДанных.Имя            = "ОсновнойНабор";
		ТекущийНаборДанных.ИмяОбъекта     = "ТаблицаИсточник"; // связывание с внешними данными идёт именно по нему
		ТекущийНаборДанных.ИсточникДанных = "ИсточникДанных";

		ТипНабора = "Объект";
	Иначе
		Возврат Неопределено;
	КонецЕсли;

	НастройкиПоУмолчанию = СКД.НастройкиПоУмолчанию;

	// Создание структуры.
	// Группировка, детальные записи и автовыбранное поле
	Группировка = НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	Группировка.Использование = Истина;

	АвтоПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	АвтоПоле.Использование = Истина;

	КоллекцияКолонок = Новый ТаблицаЗначений;
	КоллекцияКолонок.Колонки.Добавить("Имя");
	КоллекцияКолонок.Колонки.Добавить("ТипЗначения");
	КоллекцияКолонок.Колонки.Добавить("Заголовок");

	Если      ТипНабора = "Запрос" Тогда
		ПостроительЗапроса = Новый ПостроительЗапроса;
		Если ТипЗнч(НаборДанных) = Тип("Строка") Тогда
			ПостроительЗапроса.Текст = СокрЛП(НаборДанных);
		Иначе
			ПостроительЗапроса.Текст = СокрЛП(НаборДанных.Текст);
		КонецЕсли;
		ПостроительЗапроса.ЗаполнитьНастройки();

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

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

	// Добавление полей в набор
	Для Каждого НоваяКолонка Из КоллекцияКолонок Цикл
		ПолеНабора = ТекущийНаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
		ПолеНабора.Заголовок   = СокрЛП(НоваяКолонка.Заголовок);
		ПолеНабора.Поле        = СокрЛП(НоваяКолонка.Имя);
		ПолеНабора.ПутьКДанным = СокрЛП(НоваяКолонка.Имя);

		// Удалим Неопределено и NULL
		Массив = Новый Массив;
		Для Каждого ТекущийТип Из НоваяКолонка.ТипЗначения.Типы() Цикл
			Если ТекущийТип = Тип("Неопределено") ИЛИ ТекущийТип = Тип("NULL") ИЛИ
			     ТекущийТип = Неопределено ИЛИ ТекущийТип = Null Тогда
				Продолжить;
			КонецЕсли;
			Массив.Добавить(ТекущийТип);
		КонецЦикла;
		ПолеНабора.ТипЗначения = Новый ОписаниеТипов(Массив, НоваяКолонка.ТипЗначения.КвалификаторыЧисла,
		                                             НоваяКолонка.ТипЗначения.КвалификаторыСтроки,
		                                             НоваяКолонка.ТипЗначения.КвалификаторыДаты);

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

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

	Возврат СКД;
КонецФункции  // СоздатьСхемуКомпоновкиДанных

Инициализация компоновщика настроек, упр формы

Инициализация компоновщика настроек, упр формы, обработка, СКД
acsent 82 15
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
СхемаСКД = ОбработкаОбъект.ПолучитьМакет("СхемаСКД");
	
АдресСхемы = ПоместитьВоВременноеХранилище(СхемаСКД, УникальныйИдентификатор);
ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы);
	
КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаСКД.НастройкиПоУмолчанию);

Особенность (грабля) при работе с Характеристиками через СКД

Испытываю некоторые сложности с формулировкой сути проблемы поэтому опишу свою user-story: В конфигурации БГУ 1.0 есть возможность детализировать аналитику планирования (кассового расхода) с помощью доп. бюджетной классификации: к некоторым счетам привяз...
SDV 35 7

СКД. Повторение шапки отчета на каждой странице

Как вывести шапку отчёта на каждой странице средствами СКД? То есть не формируя отчёт программно. О программных решениях есть достаточно информации, но хочется знать как это сделать самим компоновщиком. Отвечал на подобный вопрос на Инфостарте, настройки к...
bolsun 37 4

Вернуть СКД (источник данных таблица значений)

Вернуть СКД в УФ
Андрей 23 4
функция вернутьКомпоновку(СхемаКомпоновкиДанных,ВнешниеНаборыДанных)
	Настройки 					= СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
	КомпоновщикМакета 			= Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки 			= КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки);
	ПроцессорКомпоновкиДанных 	= Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,ВнешниеНаборыДанных);
	ТабДок 						= Новый ТабличныйДокумент; //этаФорма.птд1
	ПроцессорВывода 			= Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ТабДок);
	ПроцессорВывода.НачатьВывод();
	Пока Истина Цикл
		ЭлементРезультата = ПроцессорКомпоновкиДанных.Следующий();
		Если ЭлементРезультата = Неопределено Тогда
			Прервать;
		Иначе
			ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
		КонецЕсли;
	КонецЦикла;
	ПроцессорВывода.ЗакончитьВывод();
	//Результат.ПоказатьУровеньГруппировокСтрок(0)
	
	ТабДок.ОтображатьСетку 		= Ложь;
	ТабДок.ОтображатьЗаголовки 	= Ложь;
	ТабДок.ТолькоПросмотр 		= Истина;
	табДок.ПоказатьУровеньГруппировокСтрок(0);
	возврат ТабДок;
конецФункции  //функция вернутьКомпоновку(СхемаКомпоновкиДанных,ВнешниеНаборыДанных,квартал1 = "ХХ",год1 = "ХХХХ",квартал2 = "ХХ",год2 = "ХХХХ")

//************исполенение***************
Рез 			= Запрос.Выполнить().Выгрузить();
	  СхемаКомпоновкиДанных 		= обработкаОбъект.ЭтотОбъект.ПолучитьМакет("форма6и7кратко");
	ВнешниеНаборыДанных 		= Новый Структура;
	ВнешниеНаборыДанных.Вставить("рез",Рез);
	вернутьКомпоновку(СхемаКомпоновкиДанных,ВнешниеНаборыДанных).показать();