Перем мКЭШ_СсылочныеТипы;
Перем мНеСсылочныеТипыДанных;

Процедура ЗаполнитьОбъектыДляРегистрации(ПроверяемыеОбъекты, НастроенныеОбъекты, ПоляРегистрацииОбъектов) Экспорт
	
	ОбъектыДляРегистрации = Новый Массив();
	СсылкиНаОбъекты = Новый Соответствие;
	ПроверенныеПоляОбъекта = Новый Соответствие();
	ПроверенныеСсылочныеТипыПолейОбъекта = Новый Соответствие();
	Для Каждого ПолноеИмяМД Из ПроверяемыеОбъекты Цикл
		ТаблицаПолейРегистрацииОбъекта = ПоляРегистрацииОбъектов[ПолноеИмяМД]; 
		Если ТаблицаПолейРегистрацииОбъекта.Количество() = 0 Тогда
			Продолжить;
		КонецЕсли; 
		ПроверенныеПоляОбъекта.Очистить();
		ПроверенныеСсылочныеТипыПолейОбъекта.Очистить();;
		Для Каждого СтрокаТаблицы Из ТаблицаПолейРегистрацииОбъекта Цикл
			Для Каждого ЭлементСписка Из СтрокаТаблицы.ПолеРегистрации Цикл
				ПолеРегистрации = ЭлементСписка.Значение;
				Если ПолеРегистрации = "Ссылка" Тогда
					Продолжить;
				КонецЕсли; 
				Если ПроверенныеПоляОбъекта[ПолеРегистрации] <> Неопределено Тогда
					Продолжить;
				КонецЕсли;
				ВсеСсылочныеТипыПоля = ПолучитьСсылочныеТипыПоля(ПолеРегистрации, ПолноеИмяМД);
				Для Каждого СсылочныйТип Из ВсеСсылочныеТипыПоля Цикл
					Если ПроверенныеСсылочныеТипыПолейОбъекта[СсылочныйТип] <> Неопределено Тогда
						Продолжить;
					КонецЕсли;
					Если СсылкиНаОбъекты[СсылочныйТип] = Неопределено Тогда
						СсылкиНаОбъекты[СсылочныйТип] = Новый Массив();
					КонецЕсли;                                        
					СсылкиНаОбъекты[СсылочныйТип].Добавить(ПолноеИмяМД);
					ПроверенныеСсылочныеТипыПолейОбъекта[СсылочныйТип] = 1;
				КонецЦикла; 
				ПроверенныеПоляОбъекта[ПолеРегистрации] = 1;;
			КонецЦикла;
		КонецЦикла; 
	КонецЦикла; 
	Для Каждого КлючИЗначение Из СсылкиНаОбъекты Цикл
		Если КлючИЗначение.Значение.Количество() > 0 Тогда
			ОбъектДляРегистрации = Метаданные.НайтиПоТипу(КлючИЗначение.Ключ).ПолноеИмя();
			СтрокаНастроенногоОбъекта = НастроенныеОбъекты.Строки.Найти(ОбъектДляРегистрации, "ПолноеИмя", Истина);
			Если СтрокаНастроенногоОбъекта <> Неопределено И ЕстьПолеСсылкаВТаблицеПолейРегистрации(ПоляРегистрацииОбъектов[ОбъектДляРегистрации]) Тогда
				Продолжить;
			КонецЕсли; 
			СтрокаТаблицы = МетаданныеДляРегистрации.Добавить();
			СтрокаТаблицы.Регистрировать = Истина;
			СтрокаТаблицы.ОбъектДляРегистрации = ОбъектДляРегистрации;
			СтрокаСсылокНаОбъект = "";
			Для Каждого СсылкаНаОбъект Из КлючИЗначение.Значение Цикл
				СтрокаСсылокНаОбъект = СтрокаСсылокНаОбъект + СсылкаНаОбъект + "; ";
			КонецЦикла; 
			СтрокаСсылокНаОбъект = Лев(СтрокаСсылокНаОбъект, СтрДлина(СтрокаСсылокНаОбъект) - 2);
			СтрокаТаблицы.СсылкиНаОбъект = СтрокаСсылокНаОбъект;
		КонецЕсли; 
	КонецЦикла; 
	МетаданныеДляРегистрации.Сортировать("ОбъектДляРегистрации");
	
КонецПроцедуры

Функция ПолучитьСсылочныеТипыПоля(Поле, ПолноеИмяМД)
	
	Результат = Новый Массив();
	ЭтоПолеТЧ = Найти(Поле, ".");
	Если ЭтоПолеТЧ Тогда
		ИмяТЧ = ирОбщий.ПервыйФрагментЛкс(Поле);
		КоллекцияПолей = ирКэш.ПоляТаблицыБДЛкс(ПолноеИмяМД + "." + ИмяТЧ, Истина);
	Иначе
		КоллекцияПолей = ирКэш.ПоляТаблицыБДЛкс(ПолноеИмяМД, Истина);
	КонецЕсли; 
	ДоступноеПоле = КоллекцияПолей.Найти(Поле, "Имя");
	Если ДоступноеПоле = Неопределено Тогда
		Возврат Результат;
	КонецЕсли; 
	ВсеТипыПоля = ДоступноеПоле.ТипЗначения.Типы();
	Для Каждого ТипПоля Из ВсеТипыПоля Цикл
		ЭтоСсылочныйТип = мКЭШ_СсылочныеТипы[ТипПоля];
		Если ЭтоСсылочныйТип = Истина Тогда
			Результат.Добавить(ТипПоля);
		ИначеЕсли ЭтоСсылочныйТип = Неопределено Тогда 
			Если мНеСсылочныеТипыДанных.Найти(ТипПоля) = Неопределено Тогда
				мКЭШ_СсылочныеТипы[ТипПоля] = Истина;
				Результат.Добавить(ТипПоля);
			Иначе
				мКЭШ_СсылочныеТипы[ТипПоля] = Ложь;
			КонецЕсли;
		КонецЕсли; 
	КонецЦикла; 
	Возврат Результат;
	
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
	
	Результат = ирОбщий.ОтобратьКоллекциюЛкс(МетаданныеДляРегистрации, "Э.Регистрировать", "ОбъектДляРегистрации");
	Закрыть(Результат);
		
КонецПроцедуры

Процедура КП_МетаданныеДляРегистрацииУстановитьФлажки(Кнопка)
	Для Каждого СтрокаТЗ Из МетаданныеДляРегистрации Цикл
		СтрокаТЗ.Регистрировать = Истина;		
	КонецЦикла; 
КонецПроцедуры

Процедура КП_МетаданныеДляРегистрацииСнятьФлажки(Кнопка)
	Для Каждого СтрокаТЗ Из МетаданныеДляРегистрации Цикл
		СтрокаТЗ.Регистрировать = Ложь;		
	КонецЦикла
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
	
	Если МетаданныеДляРегистрации.Количество() = 0 Тогда
		Предупреждение("Все поля регистрации, имеющие ссылочный тип, настроены корректно", 10);
		Отказ = Истина;
	КонецЕсли; 
	
КонецПроцедуры

Процедура КлсКомандаНажатие(Кнопка) Экспорт 
	
	ирКлиент.УниверсальнаяКомандаФормыЛкс(ЭтаФорма, Кнопка);
	
КонецПроцедуры

Процедура ОбработчикОжиданияСПараметрамиЛкс() Экспорт 
	
	ирКлиент.ОбработчикОжиданияСПараметрамиЛкс();

КонецПроцедуры

Процедура ПриОткрытии()
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
КонецПроцедуры

Процедура ПриЗакрытии()
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
КонецПроцедуры

Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт
	
	ирКлиент.Форма_ВнешнееСобытиеЛкс(ЭтаФорма, Источник, Событие, Данные);

КонецПроцедуры

Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок) Экспорт 
	
	ирКлиент.ТабличноеПолеПриПолученииДанныхЛкс(ЭтаФорма, Элемент, ОформленияСтрок);

КонецПроцедуры

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирНастройкаЖурналаРегистрации.Форма.ФормаПроверкиМетаданных");
мКЭШ_СсылочныеТипы = Новый Соответствие;
мНеСсылочныеТипыДанных = Новый Массив;
мНеСсылочныеТипыДанных.Добавить(Тип("Число"));
мНеСсылочныеТипыДанных.Добавить(Тип("Строка"));
мНеСсылочныеТипыДанных.Добавить(Тип("Булево"));
мНеСсылочныеТипыДанных.Добавить(Тип("Дата"));
мНеСсылочныеТипыДанных.Добавить(Тип("УникальныйИдентификатор"));
мНеСсылочныеТипыДанных.Добавить(Тип("ХранилищеЗначения"));
Для Каждого ОбъектПеречисление Из Метаданные.Перечисления Цикл
	мНеСсылочныеТипыДанных.Добавить(Тип("ПеречислениеСсылка" + "." + ОбъектПеречисление.Имя));	
КонецЦикла; 
