Зависимости неразделенных объектов метаданных. Возвращает зависимости неразделенных объектов метаданных.
// Возвращает зависимости неразделенных объектов метаданных.
// Если объект метаданных содержит поле, типом значения которого является ссылка на другой объект метаданных
// считается, что он от него зависит.
//
// Возвращаемое значение:
// ФиксированноеСоответствие:
// * Ключ - Строка, полное имя зависимого объекта метаданных,
// * Значение - Массив(Строка) - полные имена объектов метаданных, от которых зависит данный объект метаданных.
//
Функция ЗависимостиНеразделенныхОбъектовМетаданных() Экспорт
Кэш = Новый Соответствие();
ТипыОбщихКлассификаторов = ВыгрузкаЗагрузкаДанныхСлужебныйСобытия.ПолучитьТипыОбщихДанныхПоддерживающиеСопоставлениеСсылокПриЗагрузке();
Для Каждого ТипОбщегоКлассификатора Из ТипыОбщихКлассификаторов Цикл
Менеджер = ИнтеграцияПодсистемБТС.МенеджерОбъектаПоПолномуИмени(ТипОбщегоКлассификатора.ПолноеИмя());
ПоляЕстественногоКлюча = Менеджер.ПоляЕстественногоКлюча();
Для Каждого ПолеЕстественногоКлюча Из ПоляЕстественногоКлюча Цикл
ТипыПоля = Неопределено;
Для Итератор = 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
///////////////////////////////////////////////////////////////////////////////////////////////////////
ЗависимостиОбъектаМетаданных (БСП)
ДополнитьСвязиОбъектовМетаданных (БСП)
КонтрольНеразделенныхДанныхПриОбновлении (БСП)
ЗаполнитьОбработчикиРазделенныхДанных (БСП)
КонтрольЗаполненияПолейЕстественногоКлючаДляНеразделенныхОбъектов (БСП)