Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
SeiOkami opened this issue Feb 15, 2024 · 0 comments
Labels
СКД Система компоновки данных

Comments

@SeiOkami
Copy link
Owner

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

					КонецЕсли;
					
					КолонкаИзПустойТаблицы	= ПустаяТаблица.Колонки.Найти(ОписаниеПоля.Поле);
					Если КолонкаИзПустойТаблицы = Неопределено Тогда	//Колонка не найдена
						КолонкаИзПустойТаблицы	= ПустаяТаблица.Колонки.Добавить(ОписаниеПоля.Поле, Новый ОписаниеТипов("Неопределено"));
					КонецЕсли;
					
					НовоеПолеПустышки	= НовыйНаборДанных_Пустышка.Поля.Добавить(ТипЗнч(ОписаниеПоля));
					ЗаполнитьЗначенияСвойств(НовоеПолеПустышки, ОписаниеПоля);
					
					НовоеПолеПустышки.ОграничениеИспользования.Поле			= Истина;
					НовоеПолеПустышки.ОграничениеИспользования.Порядок		= Истина;
					НовоеПолеПустышки.ОграничениеИспользования.Группировка	= Истина;
					//НовоеПолеПустышки.ОграничениеИспользования.Условие		= Истина;
					
					Если ТипЗнч(НовоеПолеПустышки) = Тип("ПолеНабораДанныхСхемыКомпоновкиДанных") Тогда
						НовоеПолеПустышки.ОграничениеИспользованияРеквизитов.Поле			= Истина;
						НовоеПолеПустышки.ОграничениеИспользованияРеквизитов.Порядок		= Истина;
						НовоеПолеПустышки.ОграничениеИспользованияРеквизитов.Группировка	= Истина;
						//НовоеПолеПустышки.ОграничениеИспользованияРеквизитов.Условие		= Истина;
					КонецЕсли;
					
					Если НовоеПолеПустышки.ТипЗначения.Типы().Количество() = 0 Тогда
						НовоеПолеПустышки.ТипЗначения	= КолонкаИзПустойТаблицы.ТипЗначения;
					КонецЕсли;
					
				КонецЕсли;
				
			КонецЦикла;
			
			НоваяСхемаКомпоновкиДанных.НаборыДанных.Удалить(НоваяСхемаКомпоновкиДанных.НаборыДанных.Найти(НаборДанных.Имя));
			НовыйНаборДанных.Имя			= НовыйНаборДанных.ИмяОбъекта; 
			
			Если ДополнительныеПараметры.ПодставлятьНаборыДанныхПустышки И НовыйНаборДанных_Пустышка <> Неопределено Тогда
				НовыйНаборДанных_Пустышка.Имя	= НовыйНаборДанных_Пустышка.ИмяОбъекта;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат НоваяСхемаКомпоновкиДанных;
	
КонецФункции
@SeiOkami SeiOkami added the СКД Система компоновки данных label Feb 15, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
СКД Система компоновки данных
Projects
None yet
Development

No branches or pull requests

1 participant