ПередВыгрузкойДанных (БСП)

Автор: 1С
ОбщийМодуль.ВыгрузкаЗагрузкаНеразделенныхПредопределенныхДанных
БСП

Перед выгрузкой данных.

Процедура ПередВыгрузкойДанных(Контейнер) Экспорт
	
	ПараметрыВыгрузки = Новый Структура(Контейнер.ПараметрыВыгрузки());
	
	ДополнительноВыгружаемые = Новый Массив();
	
	ПравилаКонтроля = ВыгрузкаЗагрузкаНеразделенныхДанныхПовтИсп.КонтрольСсылокНаНеразделенныеДанныеВРазделенныхПриВыгрузке();
	
	Для Каждого ПравилоКонтроля Из ПравилаКонтроля Цикл
		
		ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПравилоКонтроля.Ключ);
		
		Если ПараметрыВыгрузки.ВыгружаемыеТипы.Найти(ОбъектМетаданных) <> Неопределено Тогда
			
			Для Каждого ИмяПоля Из ПравилоКонтроля.Значение Цикл
				
				СтруктураИмениПоля = СтрРазделить(ИмяПоля, ".");
				
				Если ОбщегоНазначенияБТС.ЭтоКонстанта(ОбъектМетаданных) Тогда
					
					ПодстрокаПоля = "Значение";
					ПодстрокаТаблицы = ОбъектМетаданных.ПолноеИмя();
					
				ИначеЕсли ОбщегоНазначенияБТС.ЭтоСсылочныеДанные(ОбъектМетаданных) Тогда
					
					Если СтруктураИмениПоля[2] = "Реквизит" ИЛИ СтруктураИмениПоля[2] = "Attribute" Тогда // Не локализуется
						
						ПодстрокаПоля = СтруктураИмениПоля[3];
						ПодстрокаТаблицы = ОбъектМетаданных.ПолноеИмя();
						
					ИначеЕсли СтруктураИмениПоля[2] = "ТабличнаяЧасть" ИЛИ СтруктураИмениПоля[2] = "TabularSection" Тогда // Не локализуется
						
						ИмяТабличнойЧасти = СтруктураИмениПоля[3];
						
						Если СтруктураИмениПоля[4] = "Реквизит" ИЛИ СтруктураИмениПоля[4] = "Attribute" Тогда // Не локализуется
							
							ПодстрокаПоля = СтруктураИмениПоля[5];
							ПодстрокаТаблицы = ОбъектМетаданных.ПолноеИмя() + "." + ИмяТабличнойЧасти;
							
						Иначе
							
							ВызватьИсключениеНеУдалосьОпределитьПоле(ИмяПоля, ОбъектМетаданных.ПолноеИмя());
							
						КонецЕсли;
						
					Иначе
						
						ВызватьИсключениеНеУдалосьОпределитьПоле(ИмяПоля, ОбъектМетаданных.ПолноеИмя());
						
					КонецЕсли;
					
				ИначеЕсли ОбщегоНазначенияБТС.ЭтоНаборЗаписей(ОбъектМетаданных) Тогда
					
					Если СтруктураИмениПоля[2] = "Измерение" ИЛИ СтруктураИмениПоля[2] = "Dimension"
							ИЛИ СтруктураИмениПоля[2] = "Ресурс" ИЛИ СтруктураИмениПоля[2] = "Resource"
							ИЛИ СтруктураИмениПоля[2] = "Реквизит" ИЛИ СтруктураИмениПоля[2] = "Attribute" Тогда // Не локализуется
						
						ПодстрокаПоля = СтруктураИмениПоля[3];
						ПодстрокаТаблицы = ОбъектМетаданных.ПолноеИмя();
						
					Иначе
						
						ВызватьИсключениеНеУдалосьОпределитьПоле(ИмяПоля, ОбъектМетаданных.ПолноеИмя());
						
					КонецЕсли;
					
				Иначе
					
					ВызватьИсключение СтрШаблон(НСтр("ru = 'Объект метаданных %1 не поддерживается!'"), ОбъектМетаданных.ПолноеИмя());
					
				КонецЕсли;
				
				ВозможныеТипыПоля = Метаданные.НайтиПоПолномуИмени(ИмяПоля).Тип.Типы();
				ПроверяемыеТипыПоля = Новый Массив();
				Для Каждого ВозможныйТипПоля Из ВозможныеТипыПоля Цикл
					
					ОбъектВозможногоТипа = Метаданные.НайтиПоТипу(ВозможныйТипПоля);
					
					Если ОбъектВозможногоТипа = Неопределено Тогда
						// Примитивный тип
						Продолжить;
					КонецЕсли;
					
					Если ПараметрыВыгрузки.ВыгружаемыеТипы.Найти(ОбъектВозможногоТипа) <> Неопределено Тогда
						// Объект изначально включен в состав выгружаемых типов
						Продолжить;
					КонецЕсли;
					
					Если ДополнительноВыгружаемые.Найти(ОбъектВозможногоТипа) <> Неопределено Тогда
						// Объект уже добавлен в состав дополнительно выгружаемых
						Продолжить;
					КонецЕсли;
					
					Если Не ОбщегоНазначенияБТС.ЭтоСсылочныеДанныеПоддерживающиеПредопределенныеЭлементы(ОбъектВозможногоТипа) Тогда
						// Объект не может содержать предопределенных элементов
						Продолжить;
					КонецЕсли;
					
					ПроверяемыеТипыПоля.Добавить(ВозможныйТипПоля);
					
				КонецЦикла;
				
				Если ПроверяемыеТипыПоля.Количество() = 0 Тогда
					Продолжить;
				КонецЕсли;
				
				ТекстЗапроса = "";
				ШаблонТекстаЗапроса =
				"ВЫБРАТЬ ПЕРВЫЕ 1
				|	ТИПЗНАЧЕНИЯ(Т.[ИмяПоля]) КАК Тип
				|ИЗ
				|	[Таблица] КАК Т
				|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ [ТаблицаПредопределенные] КАК ТПредопределенные
				|		ПО Т.[ИмяПоля] = ТПредопределенные.Ссылка
				|			И (ТПредопределенные.Предопределенный)";
				
				Для каждого ПроверяемыйТипПоля Из ПроверяемыеТипыПоля Цикл
					
					Если НЕ ПустаяСтрока(ТекстЗапроса) Тогда
						
						ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС;
						
					КонецЕсли;
					
					ТекстЗапроса = ТекстЗапроса + ШаблонТекстаЗапроса;
					ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Таблица]", ПодстрокаТаблицы);
					ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ТаблицаПредопределенные]", Метаданные.НайтиПоТипу(ПроверяемыйТипПоля).ПолноеИмя());
					ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПоля]", ПодстрокаПоля);
					
				КонецЦикла;
				
				Запрос = Новый Запрос(ТекстЗапроса);
				Выборка = Запрос.Выполнить().Выбрать();
				Пока Выборка.Следующий() Цикл
					
					ДополнительныйОбъектМетаданных = Метаданные.НайтиПоТипу(Выборка.Тип);
					Если ДополнительныйОбъектМетаданных <> Неопределено Тогда
						ДополнительноВыгружаемые.Добавить(ДополнительныйОбъектМетаданных);
					КонецЕсли;
					
				КонецЦикла;
				
			КонецЦикла;
			
		КонецЕсли;
		
	КонецЦикла;
	
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ПараметрыВыгрузки.ВыгружаемыеТипы, ДополнительноВыгружаемые, Истина);
	
	Контейнер.УстановитьПараметрыВыгрузки(ПараметрыВыгрузки);
	
	ИменаДополнительноВыгружаемых = Новый Массив();
	Для Каждого ДополнительноВыгружаемыйОбъект Из ДополнительноВыгружаемые Цикл
		ИменаДополнительноВыгружаемых.Добавить(ДополнительноВыгружаемыйОбъект.ПолноеИмя());
	КонецЦикла;
	
	ИмяФайла = Контейнер.СоздатьПроизвольныйФайл("xml", ТипДанныхДляТаблицыДополнительноВыгружаемыхДанных());
	ВыгрузкаЗагрузкаДанных.ЗаписатьОбъектВФайл(ИменаДополнительноВыгружаемых, ИмяФайла);
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ПередВыгрузкойДанных (БСП)

ПередВыгрузкойТипа (БСП)

ПослеВыгрузкиОбъекта (БСП)

ПередВыгрузкойНастроек (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз