Skip to content

СхемаКомпоновкиСОбъектамиВместоЗапросов #76

@SeiOkami

Description

@SeiOkami
// Подменяет Наборы-Запросы на Наборы-Объекты. 
//
// Параметры:
//  СхемаИлиАдрес				- СхемаКомпоновкиДанных, Строка	-	СКД или Адрес на временное хранилище с СКД
//	ВнешниеНаборыДанных			- Структура, Неопределено		-	1.Внешние наборы даннных. Если параметр не передан, то оборачиваются все Наборы-Запросы
//																	Для каждого внешнего источника данных выполняется логика:
//																		Если ключ внешнего источника совпадает с именем Набора-Запроса в СКД, то это набор оборачивается в Набор-Объект. 
//																		Если внешний источник = Неопределено, тогда в Набор-Объект всё будет скопировано из Набора-Запроса
//																		Иначе же будут добавлены только те колонки, которые есть во внешнем источнике
//																			+ Если в Наборе-Запросе у поля не описан ТипЗначения, то он будет взят из соответствующей колонки внешнего источника
//
//	ДополнительныеПараметры		- Структура						- содержит доп. параметры процедуры.
//
//		ДополнительныеПараметры
//			{ИмяКлюча}									{ Тип.Вид:ПоУмолчанию }				{Функциональное описание}
//			- ПодставлятьНаборыДанныхПустышки			- Булево:Истина						- Нужно ли создавать дополнительные Наборы-пустышки с полями, которые есть в Наборе-Запросе, но не будут в Наборе-Объекте. 
//			- ШаблонИмениПустышки						- Строка:"&НаборДанныхИмя_Пустышка_"- Шаблон формирования набора-пустышки
//			- КорректироватьВыражениеПредставления		- Булево:Истина						- Если в Наборе-Запросе у поля не описано ВыражениеПредставления, то оно будет взято колонки из колонки ИмяТекущейКолонки + "Представление" (если таковая имеется)
//
// Возвращаемое значение:
//   СхемаКомпоновкиДанных - новая схема компоновки
//
Функция СхемаКомпоновкиСОбъектамиВместоЗапросов(СхемаИлиАдрес, ВнешниеНаборыДанных = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
	
	ИмяТекущегоМетода	= "СхемаКомпоновкиСОбъектамиВместоЗапросов";
	ДополнитьИзШаблона(ДополнительныеПараметры, ИмяТекущегоМетода);
	
	СхемаКомпоновкиДанных	= ?(ЭтоАдресВременногоХранилища(СхемаИлиАдрес), ПолучитьИзВременногоХранилища(СхемаИлиАдрес), СхемаИлиАдрес);
	
	НоваяСхемаКомпоновкиДанных	= КопияЗначения(СхемаКомпоновкиДанных);
	
	Для Каждого НаборДанных Из СхемаКомпоновкиДанных.НаборыДанных Цикл
		
		ВнешнийНаборДанных	= Неопределено;
		
		Если ТипЗнч(НаборДанных) = Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") 
			И (ВнешниеНаборыДанных = Неопределено ИЛИ ВнешниеНаборыДанных.Свойство(НаборДанных.Имя, ВнешнийНаборДанных)) Тогда
			
			
			НовыйНаборДанных				= НоваяСхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
			НовыйНаборДанных.ИмяОбъекта		= НаборДанных.Имя;
			НовыйНаборДанных.ИсточникДанных	= СхемаКомпоновкиДанных.ИсточникиДанных.Получить(0).Имя;
			
			Если ДополнительныеПараметры.ПодставлятьНаборыДанныхПустышки Тогда
				
				НовыйНаборДанных_Пустышка	= Неопределено;
					
			КонецЕсли;
			
			Для Каждого ОписаниеПоля Из НаборДанных.Поля Цикл
				
				ДобавлятьПоле	= Истина;
				
				Если ВнешнийНаборДанных <> Неопределено Тогда
					КолонкаИзРезультата	= ВнешнийНаборДанных.Колонки.Найти(ОписаниеПоля.Поле);
					Если КолонкаИзРезультата = Неопределено Тогда
						ДобавлятьПоле = Ложь;
					КонецЕсли;
				КонецЕсли;
				
				Если ДобавлятьПоле Тогда
					
					НовоеПоле	= НовыйНаборДанных.Поля.Добавить(ТипЗнч(ОписаниеПоля));
					ЗаполнитьЗначенияСвойств(НовоеПоле, ОписаниеПоля);
					
					Если ВнешнийНаборДанных <> Неопределено Тогда
						
						Если НовоеПоле.ТипЗначения.Типы().Количество() = 0 Тогда
							НовоеПоле.ТипЗначения	= КолонкаИзРезультата.ТипЗначения;
						КонецЕсли;
						
						Если ДополнительныеПараметры.КорректироватьВыражениеПредставления Тогда
							ИмяПоляПредставления	= ОписаниеПоля.Поле + "Представление";
							Если ПустаяСтрока(ОписаниеПоля.ВыражениеПредставления) 
								И ВнешнийНаборДанных.Колонки.Найти(ИмяПоляПредставления) <> Неопределено Тогда
								НовоеПоле.ВыражениеПредставления	= ИмяПоляПредставления;
								Если НаборДанных.Поля.Найти(ИмяПоляПредставления) = Неопределено Тогда
									НовоеПолеПредставления	= НовыйНаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
									НовоеПолеПредставления.Поле	= ИмяПоляПредставления;
									НовоеПолеПредставления.ПутьКДанным	= ИмяПоляПредставления;
									НовоеПолеПредставления.ТипЗначения	= Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки("255"));
								КонецЕсли;
							КонецЕсли;
						КонецЕсли;
						
					КонецЕсли;
				ИначеЕсли ДополнительныеПараметры.ПодставлятьНаборыДанныхПустышки Тогда
					
					Если НовыйНаборДанных_Пустышка = Неопределено Тогда
						
						НовыйНаборДанных_Пустышка					= НоваяСхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
						НовыйНаборДанных_Пустышка.ИсточникДанных	= СхемаКомпоновкиДанных.ИсточникиДанных.Получить(0).Имя;
						НовыйНаборДанных_Пустышка.Имя				= СтрЗаменить(ДополнительныеПараметры.ШаблонИмениПустышки, "&НаборДанныхИмя", НаборДанных.Имя);
						НовыйНаборДанных_Пустышка.ИмяОбъекта		= НовыйНаборДанных_Пустышка.Имя;
						
						ПустаяТаблица								= ПустаяТаблицаПоТекстуЗапроса(НаборДанных.Запрос);
						
						ВнешниеНаборыДанных.Вставить(НаборДанных.Имя + "_Пустышка_", ПустаяТаблица);

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    СКДСистема компоновки данных

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions