//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирКлиент Экспорт;

Перем РежимОтладки Экспорт;
Перем мОбъекты Экспорт;
Перем мКолонкиРасширенногоПредставления Экспорт;
Перем СтарыйТипОбъектов Экспорт;

Функция СхемаКомпоновки() Экспорт 
	
	мПлатформа = ирКэш.Получить();
	#Если Сервер И Не Сервер Тогда
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	СтруктураТипаОбъекта = мПлатформа.НоваяСтруктураТипа();
	СтруктураТипаОбъекта.ИмяОбщегоТипа = ТипОбъектов;
	СвойстваЦелевогоОбъекта = мПлатформа.ТаблицаСловИзСтруктурыТипа(СтруктураТипаОбъекта,,,,,, "Свойство");
	Если ТипОбъектов <> СтарыйТипОбъектов Тогда
		мОбъекты = Новый ТаблицаЗначений;
		КвалификаторыСтроки = Новый КвалификаторыСтроки(300); 
		мКолонкиРасширенногоПредставления = Новый СписокЗначений;
		мОбъекты.Колонки.Добавить("ПолноеИмя", Новый ОписаниеТипов("Строка",,,, КвалификаторыСтроки));
		мОбъекты.Колонки.Добавить("ПолноеИмяРодителя", Новый ОписаниеТипов("Строка",,,, КвалификаторыСтроки));
		мОбъекты.Колонки.Добавить("РасширениеКонфигурации", Новый ОписаниеТипов("Строка",,,, КвалификаторыСтроки));
		Для Каждого Свойство Из СвойстваЦелевогоОбъекта Цикл
			Если Ложь
				Или Свойство.Слово = "ПринадлежностьОбъекта" // Бесполезное свойство метаданных
				Или Свойство.ТипЗначения = "Неопределено"
				//Или Свойство.ТипЗначения = "КоллекцияОбъектовМетаданных"
				//Или Свойство.ТипЗначения = "КоллекцияЗначенийСвойстваОбъектаМетаданных"
				Или Свойство.ТипЗначения = "ОписанияСтандартныхРеквизитов"
				Или Свойство.ТипЗначения = "ОписанияСтандартныхТабличныхЧастей"
			Тогда
				Продолжить;
			КонецЕсли;
			Если Ложь
				Или Свойство.ТипЗначения = "Булево" 
				Или Свойство.ТипЗначения = "Число"
			Тогда
				ОписаниеТипов = Новый ОписаниеТипов("Строка," + Свойство.ТипЗначения,,,, КвалификаторыСтроки);
			Иначе
				ОписаниеТипов = Новый ОписаниеТипов("Строка",,,, КвалификаторыСтроки);
				Если Свойство.ТипЗначения <> "Строка" Тогда
					мКолонкиРасширенногоПредставления.Добавить(Свойство.Слово);
				КонецЕсли; 
			КонецЕсли; 
			мОбъекты.Колонки.Добавить(Свойство.Слово, ОписаниеТипов);
		КонецЦикла;
		мКолонкиРасширенногоПредставления.СортироватьПоЗначению();
		мКолонкиРасширенногоПредставления = мКолонкиРасширенногоПредставления.ВыгрузитьЗначения();
	КонецЕсли; 
	Схема = ирОбщий.СоздатьСхемуПоТаблицамЗначенийЛкс(Новый Структура("Объекты", мОбъекты));
	#Если Сервер И Не Сервер Тогда
		Схема = Новый СхемаКомпоновкиДанных;
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	Схема.НаборыДанных[0].Поля.Найти("ПолноеИмя").ВыражениеПредставления = """<Открыть>""";
	Для Каждого ПолеНабора Из Схема.НаборыДанных[0].Поля Цикл
		СтрокаСлова = СвойстваЦелевогоОбъекта.Найти(ПолеНабора.Поле, "Слово");
		Если СтрокаСлова = Неопределено Тогда
			Продолжить;
		КонецЕсли; 
		СписокЗначений = мПлатформа.ДоступныеЗначенияТипа(СтрокаСлова.ТипЗначения);
		#Если Сервер И Не Сервер Тогда
			СписокЗначений = Новый СписокЗначений;
		#КонецЕсли
		Если СписокЗначений.Количество() = 0 Тогда
			Продолжить;
		КонецЕсли; 
		// Иначе в табличный документ выводятся пустые строки - баг платформы https://www.hostedredmine.com/issues/918193
		Для Каждого ЭлементСписка Из СписокЗначений Цикл
			ЭлементСписка.Представление = ЭлементСписка.Значение;
		КонецЦикла;
		ПолеНабора.УстановитьДоступныеЗначения(СписокЗначений);
	КонецЦикла;
	Возврат Схема;
	
КонецФункции

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СхемаКомпоновкиДанных = СхемаКомпоновки();
	СтандартнаяОбработка = Ложь;
	#Если _ Тогда
		СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
		КонечнаяНастройка = Новый НастройкиКомпоновкиДанных;
		ВнешниеНаборыДанных = Новый Структура;
		ДокументРезультат = Новый ТабличныйДокумент;
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	КонечнаяНастройка = КомпоновщикНастроек.ПолучитьНастройки();
	ВнешниеНаборыДанных = Новый Структура("Объекты", мОбъекты);
	Если РежимОтладки = 2 Тогда
		ирОбщий.ОтладитьЛкс(СхемаКомпоновкиДанных, , КонечнаяНастройка, ВнешниеНаборыДанных);
		Возврат;
	КонецЕсли; 
	ДокументРезультат.Очистить();
	ирОбщий.СкомпоноватьВТабличныйДокументЛкс(СхемаКомпоновкиДанных, КонечнаяНастройка, ДокументРезультат, ВнешниеНаборыДанных, ДанныеРасшифровки);
	
КонецПроцедуры

Функция СобратьОбъектыМетаданных(Параметры) Экспорт
	КолонкиРасширенногоПредставления = Новый Массив;
	Если РасширенныеПредставления Тогда
		КолонкиРасширенногоПредставления = мКолонкиРасширенногоПредставления;
	КонецЕсли;
	ирОбщий.НайтиОбъектыМетаданныхРекурсивноЛкс(ТипОбъектов,, мОбъекты, КолонкиРасширенногоПредставления);
	Результат = Новый Структура;
	Результат.Вставить("мОбъекты", ирОбщий.СузитьТипыКолонокТаблицыБезПотериДанныхЛкс(мОбъекты));
	Возврат Результат;
КонецФункции

//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный 	Контейнер = Новый Структура();
//ирПортативный 	Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный 	Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный 		ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный 		ирПортативный.Открыть();
//ирПортативный 	КонецЕсли; 
//ирПортативный #Иначе
//ирПортативный 	ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ОбщийМодульЛкс("ирСервер");
//ирПортативный ирКлиент = ирПортативный.ОбщийМодульЛкс("ирКлиент");

РежимОтладки = 0;
ТипОбъектов = "ОбъектМетаданныхИзмерение";