ЗависимостиНеразделенныхОбъектовМетаданных (БСП)

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

Зависимости неразделенных объектов метаданных. Возвращает зависимости неразделенных объектов метаданных.

// Возвращает зависимости неразделенных объектов метаданных.
// Если объект метаданных содержит поле, типом значения которого является ссылка на другой объект метаданных
// считается, что он от него зависит.
//
// Возвращаемое значение:
//  ФиксированноеСоответствие:
//    * Ключ - Строка, полное имя зависимого объекта метаданных,
//    * Значение - Массив(Строка) - полные имена объектов метаданных, от которых зависит данный объект метаданных.
//
Функция ЗависимостиНеразделенныхОбъектовМетаданных() Экспорт
	
	Кэш = Новый Соответствие();
	
	ТипыОбщихКлассификаторов = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ПолучитьТипыОбщихДанныхПоддерживающиеСопоставлениеСсылокПриЗагрузке();
	
	Для Каждого ТипОбщегоКлассификатора Из ТипыОбщихКлассификаторов Цикл
		
		Менеджер = ИнтеграцияПодсистемБТС.МенеджерОбъектаПоПолномуИмени(ТипОбщегоКлассификатора.ПолноеИмя());
		
		ПоляЕстественногоКлюча = Менеджер.ПоляЕстественногоКлюча();
		Для Каждого ПолеЕстественногоКлюча Из ПоляЕстественногоКлюча Цикл
			
			ТипыПоля = Неопределено;
			
			Для Итератор = 0 По ТипОбщегоКлассификатора.СтандартныеРеквизиты.Количество() - 1 Цикл
				
				// Поиск в стандартных реквизитах
				СтандартныйРеквизит = ТипОбщегоКлассификатора.СтандартныеРеквизиты[Итератор];
				Если СтандартныйРеквизит.Имя = ПолеЕстественногоКлюча Тогда
					ТипыПоля = СтандартныйРеквизит.Тип;
				КонецЕсли;
				
			КонецЦикла;
			
			// Поиск в реквизитах
			Реквизит = ТипОбщегоКлассификатора.Реквизиты.Найти(ПолеЕстественногоКлюча);
			Если Реквизит <> Неопределено Тогда
				ТипыПоля = Реквизит.Тип;
			КонецЕсли;
			
			// Поиск в общих реквизитах
			ОбщийРеквизит = Метаданные.ОбщиеРеквизиты.Найти(ПолеЕстественногоКлюча);
			Если ОбщийРеквизит <> Неопределено Тогда
				Для Каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл
					Если ОбщийРеквизит.Состав.Найти(ТипОбщегоКлассификатора) <> Неопределено Тогда
						ТипыПоля = ОбщийРеквизит.Тип;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
			
			Если ТипыПоля = Неопределено Тогда
				
				ВызватьИсключение СтрШаблон(НСтр("ru = 'Поле %1 не может использоваться в качестве поля естественного ключа объекта %2:
                          |поле объекта не обнаружено!'", Метаданные.ОсновнойЯзык.КодЯзыка),
					ПолеЕстественногоКлюча,
					ТипОбщегоКлассификатора.ПолноеИмя());
				
			КонецЕсли;
			
			Для Каждого ТипПоля Из ТипыПоля.Типы() Цикл
				
				Если Не ОбщегоНазначенияБТС.ЭтоПримитивныйТип(ТипПоля) И Не ОбщегоНазначенияБТС.ЭтоПеречисление(ВыгрузкаЗагрузкаДанныхСлужебный.ОбъектМетаданныхПоТипуСсылки(ТипПоля)) Тогда
					
					Если ТипПоля = Тип("ХранилищеЗначения") Тогда
						
						ВызватьИсключение СтрШаблон(
							НСтр("ru = 'Поле %1 не может использоваться в качестве поля естественного ключа объекта %2: использование
                                  |значений типа ХранилищеЗначения в качестве полей естественного ключа не поддерживается!'", Метаданные.ОсновнойЯзык.КодЯзыка),
							ПолеЕстественногоКлюча,
							ТипОбщегоКлассификатора.ПолноеИмя());
						
					КонецЕсли;
					
					Ссылка = Новый(ТипПоля);
					
					Если ТипыОбщихКлассификаторов.Найти(Ссылка.Метаданные()) <> Неопределено Тогда
						
						Если Кэш.Получить(ТипОбщегоКлассификатора.ПолноеИмя()) <> Неопределено Тогда
							Кэш.Получить(ТипОбщегоКлассификатора.ПолноеИмя()).Добавить(Ссылка.Метаданные().ПолноеИмя());
						Иначе
							НовыйМассив = Новый Массив();
							НовыйМассив.Добавить(Ссылка.Метаданные().ПолноеИмя());
							Кэш.Вставить(ТипОбщегоКлассификатора.ПолноеИмя(), НовыйМассив);
						КонецЕсли;
						
					Иначе
						
						ВызватьИсключение СтрШаблон(
							НСтр("ru = 'Поле %1 не может использоваться в качестве поля естественного ключа объекта %2:
                                  |в качестве типа поля может использоваться объект %3, который не включен в набор
                                  |общих данных через переопределяемую процедуру
                                  |ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке()'", Метаданные.ОсновнойЯзык.КодЯзыка),
							ПолеЕстественногоКлюча,
							ТипОбщегоКлассификатора.ПолноеИмя(),
							Ссылка.Метаданные().ПолноеИмя());
						
					КонецЕсли;
					
					
				КонецЕсли;
				
			КонецЦикла;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат Новый ФиксированноеСоответствие(Кэш);
	
КонецФункции

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

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

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

ЗависимостиОбъектаМетаданных (БСП)

ДополнитьСвязиОбъектовМетаданных (БСП)

КонтрольНеразделенныхДанныхПриОбновлении (БСП)

ЗаполнитьОбработчикиРазделенныхДанных (БСП)

КонтрольЗаполненияПолейЕстественногоКлючаДляНеразделенныхОбъектов (БСП)

КонтрольНеразделенныхОбъектовПриЗаписи (БСП)

TurboConf - расширение Конфигуратора 1С