Перем мОтображатьВиртуальныеТаблицы;
Перем мОтображатьТаблицыИзменений;
Перем мОтображатьТабличныеЧасти;
Перем мОтображатьРегистры;
Перем мОтображатьПеречисления;
Перем мОтображатьПоследовательности;
Перем мОтображатьОбработки;
Перем мОтображатьОтчеты;
Перем мОтображатьРоли;
Перем мОтображатьПодсистемы;
Перем мОтображатьОбщиеКоманды;
Перем мОтображатьСсылочныеОбъекты;
Перем мОтображатьВнешниеИсточникиДанных;
Перем мОтображатьВыборочныеТаблицы;
Перем мОтображатьПерерасчеты;
Перем мОтображатьКонстанты;
Перем мОтображатьРегламентныеЗадания;
Перем мОтображатьСетевыеСервисы;
Перем мНеОтображатьПланыОбмена;
Перем мДоступныеОбъекты; // Соответствие полных имен метаданных
Перем мМножественныйВыбор;
Перем мМножественныйВыборТолькоДляОднотипныхТаблиц;
Перем мЗапретитьВыбиратьСсылочныеОбъекты;
Перем мТолькоИспользованиеПолнотекстовогоПоиска;
Перем мСтрокаТипаТабличнойЧасти;
Перем мСтрокаТипаВнешнегоИсточникаДанных;
Перем мОтображатьКоличество;
Перем мМассивДоступныхОбъектов;
Перем мФильтрКорневыхТипов;
Перем мТолькоПомеченные;
Перем мТипТаблицы;
Перем мСоответствиеПометок;
Перем мСтруктураКлючаТаблицы;
Перем мПоследнийФильтр;
Перем мПолноеДерево;

Функция СохраняемаяНастройкаФормы(выхНаименование, выхИменаСвойств) Экспорт 
	выхИменаСвойств = "Реквизит.РежимИмяСиноним, Реквизит.ФильтроватьДочерние";
	Возврат Неопределено;
КонецФункции

Процедура ЗагрузитьНастройкуВФорме(НастройкаФормы, ДопПараметры) Экспорт 
	
	ирКлиент.ЗагрузитьНастройкуФормыЛкс(ЭтаФорма, НастройкаФормы); 
	НастроитьЭлементыФормы();
	
КонецПроцедуры

// Процедура передает сделанные настройки в главную форму отчета.
//
Процедура мВыбрать()

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

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

Функция ПолучитьКлючиПомеченныхСтрок(ТолькоПервыйКлюч = Ложь) 
	
	Результат = Новый Массив;
	Если ТолькоПервыйКлюч Тогда
		СтрокаСоответствия = мСоответствиеПометок.Найти(Истина, "Пометка");
		Если СтрокаСоответствия <> Неопределено Тогда
			Результат.Добавить(СтрокаСоответствия.СреднееИмяМД);
		КонецЕсли; 
	Иначе
		Для Каждого СтрокаСоответствия Из мСоответствиеПометок.НайтиСтроки(Новый Структура("Пометка", Истина)) Цикл
			Результат.Добавить(СтрокаСоответствия.СреднееИмяМД);
		КонецЦикла;
	КонецЕсли; 
	Возврат Результат;

КонецФункции

// Процедура - обработчик события "При открытии" формы.
//
Процедура ПриОткрытии()

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

	СтруктураПараметров = НачальноеЗначениеВыбора;
	ТекущаяСтрока = Неопределено;
	МассивДоступныхОбъектов = Неопределено;
	мФильтрКорневыхТипов = Неопределено;
	Если ТипЗнч(СтруктураПараметров) = Тип("Структура") Тогда
		НачальноеЗначениеВыбора = Неопределено;
		ФильтрКорневыхТипов = Неопределено;
		СтруктураПараметров.Свойство("МножественныйВыбор", мМножественныйВыбор);
		СтруктураПараметров.Свойство("Фильтр", ДеревоИсточниковСтрокаПоиска);
		СтруктураПараметров.Свойство("МножественныйВыборТолькоДляОднотипныхТаблиц", мМножественныйВыборТолькоДляОднотипныхТаблиц);
		СтруктураПараметров.Свойство("ОтображатьВиртуальныеТаблицы", мОтображатьВиртуальныеТаблицы);
		СтруктураПараметров.Свойство("ОтображатьТаблицыИзменений", мОтображатьТаблицыИзменений);
		СтруктураПараметров.Свойство("ОтображатьТабличныеЧасти", мОтображатьТабличныеЧасти);
		СтруктураПараметров.Свойство("ОтображатьРегистры", мОтображатьРегистры);
		СтруктураПараметров.Свойство("ОтображатьПоследовательности", мОтображатьПоследовательности);
		СтруктураПараметров.Свойство("ОтображатьПеречисления", мОтображатьПеречисления);
		СтруктураПараметров.Свойство("ОтображатьОбработки", мОтображатьОбработки);
		СтруктураПараметров.Свойство("ОтображатьОтчеты", мОтображатьОтчеты);
		СтруктураПараметров.Свойство("ОтображатьРоли", мОтображатьРоли);
		СтруктураПараметров.Свойство("ОтображатьПодсистемы", мОтображатьПодсистемы);
		СтруктураПараметров.Свойство("ОтображатьОбщиеКоманды", мОтображатьОбщиеКоманды);
		СтруктураПараметров.Свойство("ОтображатьРегламентныеЗадания", мОтображатьРегламентныеЗадания);
		СтруктураПараметров.Свойство("ОтображатьСетевыеСервисы", мОтображатьСетевыеСервисы);
		СтруктураПараметров.Свойство("ОтображатьСсылочныеОбъекты", мОтображатьСсылочныеОбъекты);
		СтруктураПараметров.Свойство("ОтображатьВнешниеИсточникиДанных", мОтображатьВнешниеИсточникиДанных);
		СтруктураПараметров.Свойство("ОтображатьПерерасчеты", мОтображатьПерерасчеты);
		СтруктураПараметров.Свойство("ОтображатьКонстанты", мОтображатьКонстанты);
		СтруктураПараметров.Свойство("ОтображатьКоличество", мОтображатьКоличество);
		СтруктураПараметров.Свойство("ОтображатьВыборочныеТаблицы", мОтображатьВыборочныеТаблицы);
		СтруктураПараметров.Свойство("НеОтображатьПланыОбмена", мНеОтображатьПланыОбмена);
		СтруктураПараметров.Свойство("ДоступныеОбъекты", мМассивДоступныхОбъектов);
		СтруктураПараметров.Свойство("ЗапретитьВыбиратьСсылочныеОбъекты", мЗапретитьВыбиратьСсылочныеОбъекты);
		СтруктураПараметров.Свойство("ТолькоИспользованиеПолнотекстовогоПоиска", мТолькоИспользованиеПолнотекстовогоПоиска);
		СтруктураПараметров.Свойство("НачальноеЗначениеВыбора", НачальноеЗначениеВыбора);
		СтруктураПараметров.Свойство("ТекущаяСтрока", ТекущаяСтрока);
		СтруктураПараметров.Свойство("ФильтрКорневыхТипов", ФильтрКорневыхТипов);
		Если ТипЗнч(ФильтрКорневыхТипов) = Тип("Строка") И ЗначениеЗаполнено(ФильтрКорневыхТипов) Тогда
			мФильтрКорневыхТипов = ирОбщий.СтрРазделитьЛкс(ФильтрКорневыхТипов, ",", Истина);
		ИначеЕсли ТипЗнч(ФильтрКорневыхТипов) = Тип("Массив") Тогда
			мФильтрКорневыхТипов = ФильтрКорневыхТипов;
		КонецЕсли; 
		Если ЗначениеЗаполнено(ДеревоИсточниковСтрокаПоиска) Тогда
			ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(ЭлементыФормы.ДеревоИсточниковСтрокаПоиска, ЭтаФорма);
			#Если Сервер И Не Сервер Тогда
				УстановитьГраницыВыделенияФильтра();
			#КонецЕсли
			ПодключитьОбработчикОжидания("УстановитьГраницыВыделенияФильтра", 0.1, Истина);
		КонецЕсли; 
	КонецЕсли; 
	
	Если мМножественныйВыбор = Неопределено Тогда
		мМножественныйВыбор = Ложь;
	КонецЕсли; 
	//ЭлементыФормы.ДействияФормы.Кнопки.УстановитьФлажки.Доступность = мМножественныйВыбор; // На подменю это не действует
	ЭлементыФормы.ДействияФормы.Кнопки.СнятьФлажки.Доступность = мМножественныйВыбор;
	Если мМножественныйВыбор Тогда
		ЭлементыФормы.ДеревоИсточников.РежимВыделения = РежимВыделенияТабличногоПоля.Множественный;
	КонецЕсли; 
	ЭлементыФормы.ДействияФормы.Кнопки.СнятьФлажки.Доступность = мМножественныйВыбор;
	ЭлементыФормы.ДействияФормы.Кнопки.УстановитьФлажки.Кнопки.УстановитьФлажки.Доступность = мМножественныйВыбор;
	ЭлементыФормы.ДействияФормы.Кнопки.УстановитьФлажки.Кнопки.УстановитьПометкиСоВсемиПотомками.Доступность = мМножественныйВыбор;
	ЭлементыФормы.ДействияФормы.Кнопки.УстановитьФлажки.Кнопки.ПометитьВсеРегистраторыРегистра.Доступность = мМножественныйВыбор;
	ЭлементыФормы.ДействияФормы.Кнопки.УстановитьФлажки.Кнопки.ПометитьВсеРегистрыДокумента.Доступность = мМножественныйВыбор;
	ЭлементыФормы.ДействияФормы.Кнопки.УстановитьФлажки.Кнопки.ПометитьПоСпискуИзФайла.Доступность = мМножественныйВыбор;
	ЭлементыФормы.ДействияФормы.Кнопки.ТолькоПомеченные.Доступность = мМножественныйВыбор;
	ЭлементыФормы.ДействияФормы.Кнопки.СохранитьВФайл.Доступность = мМножественныйВыбор;
	
	мСоответствиеПометок = Новый ТаблицаЗначений;
	мСоответствиеПометок.Колонки.Добавить("СреднееИмяМД");
	мСоответствиеПометок.Индексы.Добавить("СреднееИмяМД");
	мСоответствиеПометок.Колонки.Добавить("Пометка");
	мСоответствиеПометок.Колонки.Добавить("Известный", Новый ОписаниеТипов("Булево"));
	Если ТипЗнч(НачальноеЗначениеВыбора) = Тип("Массив") Тогда
		Если НачальноеЗначениеВыбора.Количество() = 1 Тогда
			ПолноеИмяТекущейСтроки = НачальноеЗначениеВыбора[0];
		КонецЕсли; 
		Если мМассивДоступныхОбъектов <> Неопределено Тогда
			Для Каждого СреднееИмяМД Из мМассивДоступныхОбъектов Цикл
				СтрокаПометки = мСоответствиеПометок.Добавить();
				СтрокаПометки.СреднееИмяМД = СреднееИмяМД;
			КонецЦикла; 
		КонецЕсли; 
		//ТаблицаВсехТаблицБД = ирКэш.ТаблицаВсехТаблицБДЛкс();
		Для Каждого СреднееИмяМД Из НачальноеЗначениеВыбора Цикл
			Если ТипЗнч(СреднееИмяМД) <> Тип("Строка") Тогда
				Продолжить;
			КонецЕсли;
			//КорневойТип = ирОбщий.ПервыйФрагментЛкс(СреднееИмяМД);
			//Если Не ирОбщий.ЛиКорневойТипТаблицыБДЛкс(КорневойТип) Тогда
			//	ОбъектМДСуществует = ирКэш.ОбъектМДПоПолномуИмениЛкс(СреднееИмяМД) <> Неопределено;
			//Иначе
			//	ОбъектМДСуществует = ТаблицаВсехТаблицБД.Найти(СреднееИмяМД, "ПолноеИмя") <> Неопределено;
			//КонецЕсли; 
			//Если ОбъектМДСуществует Тогда
				СтрокаПометки = мСоответствиеПометок.Найти(СреднееИмяМД, "СреднееИмяМД");
				Если СтрокаПометки = Неопределено Тогда
					СтрокаПометки = мСоответствиеПометок.Добавить();
					СтрокаПометки.СреднееИмяМД = СреднееИмяМД;
				КонецЕсли; 
				СтрокаПометки.Пометка = Истина;
			//КонецЕсли; 
		КонецЦикла; 
	Иначе
		ПолноеИмяТекущейСтроки = НачальноеЗначениеВыбора;
	КонецЕсли;
	Если ТекущаяСтрока <> Неопределено Тогда
		ПолноеИмяТекущейСтроки = ТекущаяСтрока;
	КонецЕсли; 
	
	мТолькоПомеченные = Истина
		//И мМножественныйВыбор
		И ТипЗнч(НачальноеЗначениеВыбора) = Тип("Массив")
		И мСоответствиеПометок.Количество() > 0;
	ЗаполнитьДеревоИсточников(, ?(мТолькоПомеченные, НачальноеЗначениеВыбора, Неопределено));
	ЭлементыФормы.ДействияФормы.Кнопки.КнопкаОК.Доступность = ДеревоИсточников.Строки.Количество() > 0 Или мСоответствиеПометок.Количество() > 0;
	
	НоваяТекущаяСтрока = ДеревоИсточников.Строки.Найти(ПолноеИмяТекущейСтроки, "ПолноеИмяОбъекта", Истина);
	Если НоваяТекущаяСтрока <> Неопределено Тогда
		ЭлементыФормы.ДеревоИсточников.ТекущаяСтрока = НоваяТекущаяСтрока;
	КонецЕсли;
	ирКлиент.ПоследниеВыбранныеЗаполнитьПодменюЛкс(ЭтаФорма, ЭлементыФормы.ДействияФормы.Кнопки.ПоследниеВыбранные);
	ирКлиент.ДопСвойстваЭлементаФормыЛкс(ЭтаФорма, ЭлементыФормы.ДеревоИсточников).МенеджерПоиска = ирКлиент.СоздатьМенеджерПоискаВТабличномПолеЛкс(,,,, Истина); // Для отключения раскраски
	
	// Они замедляют построение дерева на 25%
	ЭлементыФормы.ДеревоИсточников.Колонки.ФункциональныеОпции.Видимость = Ложь;
	ЭлементыФормы.ДеревоИсточников.Колонки.ФункциональныеОпцииНеВключены.Видимость = Ложь;
	
КонецПроцедуры

Процедура УстановитьГраницыВыделенияФильтра()
	
	ирКлиент.ПромежуточноеОбновлениеСтроковогоЗначенияПоляВводаЛкс(ЭтаФорма, ЭлементыФормы.ДеревоИсточниковСтрокаПоиска,, Истина);

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

// Процедура - обработчик выбора строки таблицы.
//
Процедура ДеревоВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Если мМножественныйВыбор Тогда 
		УстановитьЗначениеФлажкаСтроки(Элемент.ТекущаяСтрока, Истина);
		НачальноеЗначениеВыбора = ПолучитьКлючиПомеченныхСтрок();
	КонецЕсли; 
	Если ВыбраннаяСтрока.Уровень() = 0 Тогда 
		Если Элемент.Развернут(ВыбраннаяСтрока) Тогда
			Элемент.Свернуть(ВыбраннаяСтрока);
		Иначе
			Элемент.Развернуть(ВыбраннаяСтрока);
		КонецЕсли;
	КонецЕсли;
	мВыбрать();

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

Процедура ПриЗакрытии()
	
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
	Если Истина
		И Не МодальныйРежим
		И ТипЗнч(ВладелецФормы) = Тип("Форма")
	Тогда
		ВладелецФормы.Панель.Доступность = Истина;
	КонецЕсли; 
	
КонецПроцедуры

Процедура ЗаполнитьСтрокуДерева(СтрокаДерева, УстановитьПометкиРодителей = Истина, УстановитьИзвестность = Истина, Знач _РежимОтладки = Ложь)

	Если _РежимОтладки Тогда // Можно менять на Истина в точке останова, например условием ирОбщий.Пр(_РежимОтладки, 1, 1)
		// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
		Если Истина
			И мМножественныйВыбор
			И ТипЗнч(НачальноеЗначениеВыбора) = Тип("Массив")
		Тогда
			СтрокаСоответствия = мСоответствиеПометок.Найти(СтрокаДерева.ПолноеИмяОбъекта, "СреднееИмяМД");
			Если СтрокаСоответствия <> Неопределено Тогда
				СтрокаСоответствия.Известный = УстановитьИзвестность;
				Если СтрокаСоответствия.Пометка = Истина Тогда
					СтрокаДерева.Пометка = Истина;
					ПроверитьУстановитьФильтрПоТипуТаблицы(СтрокаДерева);
					Если УстановитьПометкиРодителей Тогда
						ирОбщий.УстановитьПометкиРодителейЛкс(СтрокаДерева.Родитель); // Неоптимально
					КонецЕсли; 
				КонецЕсли; 
			КонецЕсли; 
		КонецЕсли;
	Иначе
		// Однострочный код использован для ускорения. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
		Если Истина  		И мМножественныйВыбор  		И ТипЗнч(НачальноеЗначениеВыбора) = Тип("Массив")  	Тогда  		СтрокаСоответствия = мСоответствиеПометок.Найти(СтрокаДерева.ПолноеИмяОбъекта, "СреднееИмяМД");  		Если СтрокаСоответствия <> Неопределено Тогда  			СтрокаСоответствия.Известный = УстановитьИзвестность;  			Если СтрокаСоответствия.Пометка = Истина Тогда  				СтрокаДерева.Пометка = Истина;  				ПроверитьУстановитьФильтрПоТипуТаблицы(СтрокаДерева);  				Если УстановитьПометкиРодителей Тогда  					ирОбщий.УстановитьПометкиРодителейЛкс(СтрокаДерева.Родитель);  				КонецЕсли;  			КонецЕсли;  		КонецЕсли;  	КонецЕсли;  
	КонецЕсли; 
	//ОписаниеТаблицы = ирОбщий.ОписаниеТаблицыБДЛкс(СтрокаДерева.ПолноеИмяОбъекта);
	//Если ОписаниеТаблицы <> Неопределено Тогда 
	//	СтрокаДерева.ЕстьДоступ = ОписаниеТаблицы.ЕстьДоступ;
	//	Если ТипЗнч(ОписаниеТаблицы.КоличествоСтрок) = Тип("Число") Тогда
	//		ирОбщий.ДобавитьКоличествоСтрокСРодителемЛкс(СтрокаДерева, ОписаниеТаблицы.КоличествоСтрок);
	//	КонецЕсли; 
	//Иначе
	//	СтрокаДерева.ЕстьДоступ = СтрокаДерева.Родитель.ЕстьДоступ;
	//КонецЕсли; 
		
КонецПроцедуры

Процедура ЗаполнитьДеревоИсточников(Знач Фильтр = Неопределено, МассивДоступныхОбъектов = Неопределено, Принудительно = Ложь) Экспорт
	
	Если МассивДоступныхОбъектов = Неопределено Тогда
		Если мМножественныйВыбор Тогда
			ПомеченныеСтроки = ПолучитьКлючиПомеченныхСтрок();
			Для Каждого ПолноеИмяМД Из ПомеченныеСтроки Цикл
				Если НачальноеЗначениеВыбора.Найти(ПолноеИмяМД) = Неопределено Тогда
					НачальноеЗначениеВыбора.Добавить(ПолноеИмяМД);
				КонецЕсли; 
			КонецЦикла;
		КонецЕсли;
		Если мТолькоПомеченные Тогда
			МассивДоступныхОбъектов = НачальноеЗначениеВыбора;
		Иначе
			МассивДоступныхОбъектов = мМассивДоступныхОбъектов;
		КонецЕсли;
	КонецЕсли;
	мДоступныеОбъекты = Неопределено;
	Если МассивДоступныхОбъектов <> Неопределено Тогда
		мДоступныеОбъекты = Новый Соответствие();
		Для Каждого ДоступныйОбъект Из МассивДоступныхОбъектов Цикл
			мДоступныеОбъекты.Вставить(ДоступныйОбъект, 1);
		КонецЦикла; 
	КонецЕсли; 
	ОбъектыВыбранныхПодсистем = ирОбщий.ОбъектыПодсистемЛкс(ФильтрПодсистем);
	Если Фильтр = Неопределено Тогда
		Фильтр = ДеревоИсточниковСтрокаПоиска;
	КонецЕсли;
	Если Истина
		И ЗначениеЗаполнено(мПоследнийФильтр)
		И мПоследнийФильтр = Фильтр 
		И Не Принудительно
	Тогда
		Возврат;
	КонецЕсли; 
	мПоследнийФильтр = Фильтр;
	ЭлементыФормы.ДействияФормы.Кнопки.ТолькоПомеченные.Пометка = мТолькоПомеченные;
	ТабличноеПолеДерева = ЭлементыФормы.ДеревоИсточников;
	Если ТабличноеПолеДерева.ТекущаяСтрока <> Неопределено Тогда
		КлючТекущейСтроки = ТабличноеПолеДерева.ТекущаяСтрока.ПолноеИмяОбъекта;
	Иначе
		КлючТекущейСтроки = Неопределено;
	КонецЕсли; 
	Если ПустаяСтрока(Фильтр) Тогда
		СловаПоиска = Неопределено;
		УзелПодходитФильтру = Истина;
	Иначе
		ИскатьСРодителем = Истина;
		СловаПоиска = ирОбщий.РазделитьСтрокуПоискаНаСловаПоискаЛкс(НРег(Фильтр), ИскатьСРодителем);
	КонецЕсли;
	ТекущаяКолонкаТП = ирКлиент.ОпределитьВедущуюСтроковуюКолонкуТабличногоПоляЛкс(ТабличноеПолеДерева);
	ИмяТекущейКолонки = ТекущаяКолонкаТП.Данные;
	ВычислятьФункциональныеОпции = ЭлементыФормы.ДеревоИсточников.Колонки.ФункциональныеОпции.Видимость Или ЭлементыФормы.ДеревоИсточников.Колонки.ФункциональныеОпцииНеВключены.Видимость;
	
	КоллекцияКорневыхТипов = Новый Массив;
	СтрокиМетаОбъектов = ирКэш.Получить().ТаблицаТиповМетаОбъектов.НайтиСтроки(Новый Структура("Категория", 0));
	Для Каждого СтрокаТаблицыМетаОбъектов Из СтрокиМетаОбъектов Цикл
		Единственное = СтрокаТаблицыМетаОбъектов.Единственное;
		Если Ложь
			Или (Истина
				И мФильтрКорневыхТипов <> Неопределено
				И мФильтрКорневыхТипов.Найти(Единственное) <> Неопределено)
			Или (Истина
				И мОтображатьПоследовательности = Истина
				И Единственное = "Последовательность")
			Или (Истина
				И мОтображатьВыборочныеТаблицы = Истина
				И (Ложь
					//Или Единственное = "КритерийОтбора" // там обязательный параметр
					Или Единственное = "ЖурналДокументов"))
			Или (Истина
				И мОтображатьСсылочныеОбъекты = Истина
				И ирОбщий.ЛиКорневойТипСсылочногоОбъектаБДЛкс(Единственное)
				И (Ложь
					Или мНеОтображатьПланыОбмена <> Истина
					Или Единственное <> "ПланОбмена"))
			Или (Истина
				И мОтображатьПеречисления = Истина
				И ирОбщий.ЛиКорневойТипПеречисленияЛкс(Единственное))
			Или (Истина
				И мОтображатьРегистры = Истина
				И ирОбщий.ЛиКорневойТипРегистраБДЛкс(Единственное, Ложь))
		Тогда
			КоллекцияКорневыхТипов.Добавить(Единственное);
		КонецЕсли;
	КонецЦикла;
	Если Истина 
		И мОтображатьВнешниеИсточникиДанных = Истина
		И ирКэш.ДоступноВнешниеИсточникДанныхЛкс() 
	Тогда
		Если Ложь
			Или мОтображатьСсылочныеОбъекты = Истина
			Или мОтображатьРегистры = Истина
		Тогда
			Для Каждого МетаВнешнийИсточникДанных Из Метаданные.ВнешниеИсточникиДанных Цикл
				КоллекцияКорневыхТипов.Добавить(МетаВнешнийИсточникДанных.ПолноеИмя());
			КонецЦикла; 
		КонецЕсли; 
	КонецЕсли; 
	Если мОтображатьОтчеты = Истина Тогда
		КоллекцияКорневыхТипов.Добавить("Отчет");
	КонецЕсли;
	Если мОтображатьОбработки = Истина Тогда
		КоллекцияКорневыхТипов.Добавить("Обработка");
	КонецЕсли; 
	Если мОтображатьРоли = Истина Тогда
		КоллекцияКорневыхТипов.Добавить("Роль");
	КонецЕсли;
	Если мОтображатьПодсистемы = Истина Тогда
		КоллекцияКорневыхТипов.Добавить("Подсистема");
	КонецЕсли;
	Если мОтображатьОбщиеКоманды = Истина Тогда
		КоллекцияКорневыхТипов.Добавить("ОбщаяКоманда");
	КонецЕсли;
	Если мОтображатьКонстанты = Истина Тогда
		КоллекцияКорневыхТипов.Добавить("Константа");
	КонецЕсли;
	Если мОтображатьРегламентныеЗадания = Истина Тогда
		КоллекцияКорневыхТипов.Добавить("РегламентноеЗадание");
	КонецЕсли; 
	Если мОтображатьСетевыеСервисы = Истина Тогда
		КоллекцияКорневыхТипов.Добавить("HTTPСервис");
		КоллекцияКорневыхТипов.Добавить("WebСервис");
	КонецЕсли; 
	Если мОтображатьПерерасчеты = Истина Тогда
		КоллекцияКорневыхТипов.Добавить("Перерасчет");
	КонецЕсли; 
	
	_РежимОтладки = ирКэш.РежимОтладкиЛкс();
	КопияДереваФормы = ирОбщий.СкопироватьКолонкиКоллекцииЛкс(ДеревоИсточников);
	ДеревоИсточников = ДеревоОбъектовМД().Скопировать();
	#Если Сервер И Не Сервер Тогда
		ДеревоИсточников = Новый ДеревоЗначений;
		КопияДереваФормы = Новый ДеревоЗначений;
	#КонецЕсли
	Для Каждого КолонкаДереваФормы Из КопияДереваФормы.Колонки Цикл
		КолонкаДерева = ДеревоИсточников.Колонки.Найти(КолонкаДереваФормы.Имя);
		Если КолонкаДерева = Неопределено Тогда
			ДеревоИсточников.Колонки.Добавить(КолонкаДереваФормы.Имя, КолонкаДереваФормы.ТипЗначения, КолонкаДереваФормы.Заголовок, КолонкаДереваФормы.Ширина);
		КонецЕсли; 
	КонецЦикла;
	НачальноеКоличествоТиповМД = ДеревоИсточников.Строки.Количество(); 
	Для СчетчикТиповМД = 1 По НачальноеКоличествоТиповМД Цикл
		СтрокаТипаМетаданных = ДеревоИсточников.Строки[НачальноеКоличествоТиповМД - СчетчикТиповМД];
		ОписаниеКорневогоТипа = ОписаниеТипаМетаОбъектов(, СтрокаТипаМетаданных.ПолноеИмяОбъекта);
		Если ОписаниеКорневогоТипа = Неопределено Тогда
			ОписаниеКорневогоТипа = мСтрокаТипаВнешнегоИсточникаДанных;
			КорневойТип = ОписаниеКорневогоТипа.Единственное; 
			ОбъектМДКорневогоТипа = ирКэш.ОбъектМДПоПолномуИмениЛкс(СтрокаТипаМетаданных.ПолноеИмяОбъекта);
			КоллекцияМетаОбъектов = ОбъектМДКорневогоТипа.Таблицы;
			Если КоллекцияКорневыхТипов.Найти(СтрокаТипаМетаданных.ПолноеИмяОбъекта) = Неопределено Тогда
				ДеревоИсточников.Строки.Удалить(СтрокаТипаМетаданных);
				Продолжить;
			КонецЕсли;
		Иначе
			КорневойТип = ОписаниеКорневогоТипа.Единственное; 
			МножественноеКорневогоТипа = ОписаниеКорневогоТипа.Множественное;
			ПредставлениеКатегории = ирОбщий.ПредставлениеИзИдентификатораЛкс(МножественноеКорневогоТипа);
			Если КорневойТип = "Перерасчет" Тогда 
				КоллекцияМетаОбъектов = Новый Массив;
				Если мОтображатьПерерасчеты <> Ложь Тогда
					Для Каждого МетаРегистрРасчета Из Метаданные.РегистрыРасчета Цикл
						Для Каждого Перерасчет Из МетаРегистрРасчета.Перерасчеты Цикл
							КоллекцияМетаОбъектов.Добавить(Перерасчет);
						КонецЦикла;
					КонецЦикла;
				КонецЕсли; 
			Иначе
				КоллекцияМетаОбъектов = Метаданные[МножественноеКорневогоТипа]; // КоллекцияОбъектовМетаданных
			КонецЕсли; 
			Если КоллекцияКорневыхТипов.Найти(КорневойТип) = Неопределено Тогда
				ДеревоИсточников.Строки.Удалить(СтрокаТипаМетаданных);
				Продолжить;
			КонецЕсли;
		КонецЕсли;
		ПрерватьРодителя = Ложь;
		НачальноеКоличествоОбъектовМД = СтрокаТипаМетаданных.Строки.Количество(); 
		Для СчетчикОбъектовМД = 1 По НачальноеКоличествоОбъектовМД Цикл
			СтрокаОбъектаМД = СтрокаТипаМетаданных.Строки[НачальноеКоличествоОбъектовМД - СчетчикОбъектовМД];
			ОбъектМД = КоллекцияМетаОбъектов.Найти(СтрокаОбъектаМД.Имя);
			Если Ложь   
				Или ПрерватьРодителя
				Или ОбъектМД = Неопределено
				Или (Истина
					И мТолькоИспользованиеПолнотекстовогоПоиска = Истина
					И (Ложь
						Или КорневойТип = "Перерасчет"
						Или КорневойТип = "Константа"
						Или КорневойТип = "ВнешнийИсточникДанных"
						Или ОбъектМД.ПолнотекстовыйПоиск = Метаданные.СвойстваОбъектов.ИспользованиеПолнотекстовогоПоиска.НеИспользовать))
				Или (Истина
					И мФильтрКорневыхТипов = Неопределено
					И мОтображатьСсылочныеОбъекты <> Истина
					И ирОбщий.ЛиМетаданныеСсылочногоОбъектаЛкс(ОбъектМД))
				Или (Истина
					И мФильтрКорневыхТипов = Неопределено
					И мОтображатьРегистры <> Истина
					И ирОбщий.ЛиМетаданныеРегистраЛкс(ОбъектМД))
				Или (Истина
					И ФильтрПодсистем.Количество() > 0
					И ОбъектыВыбранныхПодсистем[ОбъектМД] = Неопределено)
			Тогда
				СтрокаТипаМетаданных.Строки.Удалить(СтрокаОбъектаМД);
				Продолжить;
			КонецЕсли;
			Если ВычислятьФункциональныеОпции Тогда
				ЗначенияФункОпций = Неопределено;
				СписокФункОпций = Неопределено;
				ФункциональныеОпцииВключены = Неопределено;
				ирОбщий.ФункциональныеОпцииОбъектаМДЛкс(ОбъектМД, ЗначенияФункОпций, СписокФункОпций, ФункциональныеОпцииВключены);
				СтрокаОбъектаМД.ФункциональныеОпции = СписокФункОпций;
				СтрокаОбъектаМД.ЗначенияФункОпций = ЗначенияФункОпций;
				СтрокаОбъектаМД.ФункциональныеОпцииНеВключены = Не ФункциональныеОпцииВключены;
				СтрокаОбъектаМД.ФункциональныеОпции = СписокФункОпций;
			КонецЕсли;
			Если Истина
				И мОтображатьТабличныеЧасти <> Истина
				И (Ложь
					Или КорневойТип <> "БизнесПроцесс"
					Или мОтображатьПеречисления <> Истина)
				И мОтображатьТаблицыИзменений <> Истина
				И мОтображатьВиртуальныеТаблицы <> Истина
			Тогда 
				СтрокаОбъектаМД.Строки.Очистить();
			Иначе
				НачальноеКоличествоТЧ = СтрокаОбъектаМД.Строки.Количество(); 
				_РежимОтладки = Ложь;
				Если _РежимОтладки Тогда // Можно менять на Истина в точке останова, например условием ирОбщий.Пр(_РежимОтладки, 1, 1)
					// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
					Для СчетчикТЧ = 1 По НачальноеКоличествоТЧ Цикл
						СтрокаМетаТЧ = СтрокаОбъектаМД.Строки[НачальноеКоличествоТЧ - СчетчикТЧ];
						ТипТаблицы = СтрокаМетаТЧ.ТипТаблицы;
						Если ТипТаблицы = "ТабличнаяЧасть" Тогда 
							УдалитьМетаТЧ = мОтображатьТабличныеЧасти <> Истина;
						ИначеЕсли ТипТаблицы = "Точки" Тогда 
							УдалитьМетаТЧ = мОтображатьПеречисления <> Истина;
						ИначеЕсли ТипТаблицы = "Изменения" Тогда 
							УдалитьМетаТЧ = мОтображатьТаблицыИзменений <> Истина;
						Иначе 
							УдалитьМетаТЧ = мОтображатьВиртуальныеТаблицы <> Истина;
						КонецЕсли; 
						Если Не УдалитьМетаТЧ Тогда
							// Поиск по Имя+Представление
							УдалитьМетаТЧ = Ложь
								Или (Истина
									И ФильтроватьДочерние
									И СловаПоиска <> Неопределено
									И Не УзелПодходитФильтру(СтрокаМетаТЧ, Фильтр, СловаПоиска, ИскатьСРодителем)) 
								Или (Истина
									И мДоступныеОбъекты <> Неопределено
									И мДоступныеОбъекты[СтрокаМетаТЧ.ПолноеИмяОбъекта] = Неопределено);
						КонецЕсли;
						Если УдалитьМетаТЧ Тогда
							СтрокаОбъектаМД.Строки.Удалить(СтрокаМетаТЧ);
						Иначе
							Если мМножественныйВыбор Тогда
								ЗаполнитьСтрокуДерева(СтрокаМетаТЧ, Ложь,, _РежимОтладки);
							КонецЕсли;
						КонецЕсли;
					КонецЦикла;
				Иначе
					// Однострочный код использован для ускорения. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
					Для СчетчикТЧ = 1 По НачальноеКоличествоТЧ Цикл  						СтрокаМетаТЧ = СтрокаОбъектаМД.Строки[НачальноеКоличествоТЧ - СчетчикТЧ];  						ТипТаблицы = СтрокаМетаТЧ.ТипТаблицы;  						Если ТипТаблицы = "ТабличнаяЧасть" Тогда  							УдалитьМетаТЧ = мОтображатьТабличныеЧасти <> Истина;  						ИначеЕсли ТипТаблицы = "Точки" Тогда  							УдалитьМетаТЧ = мОтображатьПеречисления <> Истина;  						ИначеЕсли ТипТаблицы = "Изменения" Тогда  							УдалитьМетаТЧ = мОтображатьТаблицыИзменений <> Истина;  						Иначе  							УдалитьМетаТЧ = мОтображатьВиртуальныеТаблицы <> Истина;  						КонецЕсли;  						Если Не УдалитьМетаТЧ Тогда    							УдалитьМетаТЧ = Ложь  								Или (Истина  									И ФильтроватьДочерние  									И СловаПоиска <> Неопределено  									И Не УзелПодходитФильтру(СтрокаМетаТЧ, Фильтр, СловаПоиска, ИскатьСРодителем))  								Или (Истина  									И мДоступныеОбъекты <> Неопределено  									И мДоступныеОбъекты[СтрокаМетаТЧ.ПолноеИмяОбъекта] = Неопределено);  						КонецЕсли;  						Если УдалитьМетаТЧ Тогда  							СтрокаОбъектаМД.Строки.Удалить(СтрокаМетаТЧ);  						Иначе  							Если мМножественныйВыбор Тогда  								ЗаполнитьСтрокуДерева(СтрокаМетаТЧ, Ложь,, _РежимОтладки);  							КонецЕсли;  						КонецЕсли;  					КонецЦикла;  
				КонецЕсли;
			КонецЕсли; 
			Если СловаПоиска <> Неопределено Тогда
				УзелПодходитФильтру = УзелПодходитФильтру(СтрокаОбъектаМД, Фильтр, СловаПоиска, ИскатьСРодителем, ПрерватьРодителя);
			КонецЕсли;
			Если Ложь
				Или ПрерватьРодителя
				Или (Истина
					И Не ФильтроватьДочерние
					И Не УзелПодходитФильтру)
				Или (Истина
					И СтрокаОбъектаМД.Строки.Количество() = 0
					И (Ложь
						Или Не УзелПодходитФильтру
						Или (Истина
							И мДоступныеОбъекты <> Неопределено
							И мДоступныеОбъекты[СтрокаОбъектаМД.ПолноеИмяОбъекта] = Неопределено)))
			Тогда
				СтрокаТипаМетаданных.Строки.Удалить(СтрокаОбъектаМД);
				Продолжить;
			КонецЕсли;
			Если мМножественныйВыбор Тогда
				ЗаполнитьСтрокуДерева(СтрокаОбъектаМД, Ложь,, _РежимОтладки);
			КонецЕсли; 
		КонецЦикла;
		Если Истина
			И СтрокаТипаМетаданных.Строки.Количество() = 0
			//И Не ирОбщий.ЛиСтрокаСодержитВсеПодстрокиЛкс(СтрокаТипаМетаданных[ИмяТекущейКолонки], ПодстрокиФильтра) 
		Тогда
			ДеревоИсточников.Строки.Удалить(СтрокаТипаМетаданных);
		Иначе
			ирОбщий.УстановитьПометкиРодителейЛкс(СтрокаТипаМетаданных);
		КонецЕсли; 
	КонецЦикла;
	
	СтрокаТипаМетаданных = ДеревоИсточников.Строки.Добавить();
	СтрокаТипаМетаданных.Представление = "Неизвестные";
	СтрокаТипаМетаданных.Имя = "Неизвестные";
	СтрокаТипаМетаданных.ПолноеИмяОбъекта = СтрокаТипаМетаданных.Имя;
	Для Каждого СтрокаНеизвестногоМД Из мСоответствиеПометок.НайтиСтроки(Новый Структура("Известный", Ложь)) Цикл
		ГлавнаяСтрока = СтрокаТипаМетаданных.Строки.Добавить();
		ГлавнаяСтрока.ПолноеИмяОбъекта = СтрокаНеизвестногоМД.СреднееИмяМД;
		ГлавнаяСтрока.Имя = СтрокаНеизвестногоМД.СреднееИмяМД;
		ГлавнаяСтрока.Представление = СтрокаНеизвестногоМД.СреднееИмяМД;
		ЗаполнитьСтрокуДерева(ГлавнаяСтрока, Ложь, Ложь, _РежимОтладки);
		Если Ложь
			Или (Истина
				И СловаПоиска <> Неопределено
				И Не ирОбщий.ЛиСтрокаСодержитВсеПодстрокиЛкс(ГлавнаяСтрока[ИмяТекущейКолонки], СловаПоиска)) 
			Или (Истина
				И мДоступныеОбъекты <> Неопределено
				И мДоступныеОбъекты[ГлавнаяСтрока.ПолноеИмяОбъекта] = Неопределено)
		Тогда
			ГлавнаяСтрока.Родитель.Строки.Удалить(ГлавнаяСтрока);
		КонецЕсли; 
	КонецЦикла;  
	Если Истина
		И СтрокаТипаМетаданных.Строки.Количество() = 0
		//И Не ирОбщий.ЛиСтрокаСодержитВсеПодстрокиЛкс(СтрокаТипаМетаданных[ИмяТекущейКолонки], ПодстрокиФильтра) 
	Тогда
		ДеревоИсточников.Строки.Удалить(СтрокаТипаМетаданных);
	Иначе
		ирОбщий.УстановитьПометкиРодителейЛкс(СтрокаТипаМетаданных);
	КонецЕсли; 
	
	Если мОтображатьКоличество = Истина Тогда
		ирКлиент.ОбновитьКоличествоСтрокТаблицВДеревеМетаданныхЛкс(ДеревоИсточников);
	КонецЕсли;
	ТекущаяСтрокаУстановлена = Ложь;
	Если КлючТекущейСтроки <> Неопределено Тогда
		НоваяТекущаяСтрока = ДеревоИсточников.Строки.Найти(КлючТекущейСтроки, "ПолноеИмяОбъекта", Истина);
	КонецЕсли;
	Если Ложь
		Или НоваяТекущаяСтрока = Неопределено 
		Или НоваяТекущаяСтрока.Уровень() = 0
	Тогда
		Родитель = ДеревоИсточников;
		Пока Родитель.Строки.Количество() = 1 Цикл
			Родитель = Родитель.Строки[0];
			НоваяТекущаяСтрока = Родитель;
		КонецЦикла;
	КонецЕсли;
	Если НоваяТекущаяСтрока <> Неопределено Тогда
		ЭлементыФормы.ДеревоИсточников.ТекущаяСтрока = НоваяТекущаяСтрока;
		ТекущаяСтрокаУстановлена = Истина;
	КонецЕсли; 
	СортироватьДерево();
	
	ирКлиент.ТабличноеПолеДеревоЗначений_АвтоРазвернутьВсеСтрокиЛкс(ТабличноеПолеДерева, , ТекущаяСтрокаУстановлена);
	
КонецПроцедуры

Функция УзелПодходитФильтру(Знач СтрокаОбъектаМД, Знач Фильтр, Знач СловаПоиска, Знач ИскатьСРодителем, выхПрерватьРодителя = Ложь)
	
	Если СтрокаОбъектаМД.ПолноеИмяОбъекта = Фильтр Тогда
		УзелПодходитФильтру = Истина;
	Иначе
		ПредставлениеОбъекта = ФильтруемоеПредставлениеСтрокиДерева(СтрокаОбъектаМД);
		УзелПодходитФильтру = ирОбщий.ЛиСтрокаСодержитВсеПодстрокиЛкс(ПредставлениеОбъекта, СловаПоиска, ?(ИскатьСРодителем, СтрокаОбъектаМД.Родитель.Имя, ""), выхПрерватьРодителя);
		Если УзелПодходитФильтру И ЗначениеЗаполнено(СловаПоиска) Тогда
			ФильтрПредставления = ирОбщий.СтрСоединитьЛкс(СловаПоиска, " ");
			Если СтрДлина(ФильтрПредставления) > 1 Тогда
				ПредставлениеОбъекта = ФильтруемоеПредставлениеСтрокиДерева(СтрокаОбъектаМД, Истина);
				СтрокаОбъектаМД.ПремияФильтра = ирОбщий.НайтиФильтрВСловеЛкс(Ложь, ФильтрПредставления, ПредставлениеОбъекта, НРег(ПредставлениеОбъекта), Истина);
				//ПремияФильтра = Цел(ПремияФильтра / 2);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	Возврат УзелПодходитФильтру;

КонецФункции

Функция ФильтруемоеПредставлениеСтрокиДерева(Знач СтрокаДерева, Знач ТолькоГлавное = Ложь) Экспорт
	Если РежимИмяСиноним Тогда
		Результат = СтрокаДерева.Имя;
		Если Не ТолькоГлавное Тогда
			Результат = Результат + " " + СтрокаДерева.Представление;
		КонецЕсли;
	Иначе
		Результат = СтрокаДерева.Представление;
		Если Не ТолькоГлавное Тогда
			Результат = Результат + " " + СтрокаДерева.Имя;
		КонецЕсли;
	КонецЕсли;
	Возврат Результат;
КонецФункции

Процедура ДобавитьКоличествоСтрокСРодителемЛкс(Знач НовыйИсточник, Родитель, Знач ИмяСуммируемойКолонки= "КоличествоСтрок")
	
	Если ТипЗнч(НовыйИсточник[ИмяСуммируемойКолонки]) <> Тип("Число") Тогда
		Родитель[ИмяСуммируемойКолонки] = "?";
	КонецЕсли; 
	КоличествоРодителя = Родитель[ИмяСуммируемойКолонки];
	Если КоличествоРодителя = "?" Тогда
		Возврат;
	КонецЕсли; 
	Если ТипЗнч(КоличествоРодителя) <> Тип("Число") Тогда
		КоличествоРодителя = 0;
	КонецЕсли; 
	Родитель[ИмяСуммируемойКолонки] = КоличествоРодителя + НовыйИсточник[ИмяСуммируемойКолонки];

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

Процедура СортироватьДерево()
	
	Если РежимИмяСиноним Тогда
		СтрокаСортировки = "Имя";
	Иначе
		СтрокаСортировки = "Представление";
	КонецЕсли;
	Если ЗначениеЗаполнено(мПоследнийФильтр) Тогда
		СтрокаСортировки = "ПремияФильтра Убыв, " + СтрокаСортировки;
	КонецЕсли;
	//ДеревоИсточников.Строки.Сортировать(СтрокаСортировки, Истина);
	Для Каждого КорневаяСтрока Из ДеревоИсточников.Строки Цикл
		КорневаяСтрока.Строки.Сортировать(СтрокаСортировки);
	КонецЦикла;

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

Процедура ДеревоИсточниковПриИзмененииФлажка(Элемент, Колонка)
	
	ТекущаяСтрока = Элемент.ТекущиеДанные;
	ИмяКолонкиПометки = "Пометка";
	НовоеЗначениеПометки = ТекущаяСтрока[ИмяКолонкиПометки];
	НовоеЗначениеПометки = НовоеЗначениеПометки -1;
	Если НовоеЗначениеПометки < 0 Тогда
		НовоеЗначениеПометки = 1;
	КонецЕсли;
	УстановитьЗначениеФлажкаСтроки(ТекущаяСтрока, НовоеЗначениеПометки);
	Если мМножественныйВыбор Тогда
		НачальноеЗначениеВыбора = ПолучитьКлючиПомеченныхСтрок();
	КонецЕсли; 
	
КонецПроцедуры

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

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

Процедура ПроверитьОтключитьФильтрПоТипуТаблицы()
	
	КлючПомеченных = ПолучитьКлючиПомеченныхСтрок(Истина);
	Если КлючПомеченных.Количество() = 0 Тогда
		мТипТаблицы = Неопределено;
	КонецЕсли;

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

Функция ПроверитьУстановитьФильтрПоТипуТаблицы(ТекущаяСтрока)

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

КонецФункции

Функция ЛиКлючТаблицыПодходит(СтрокаДерева)

	КлючСовпадает = Истина;
	Если мТипТаблицы <> Неопределено Тогда
		КлючСовпадает = Ложь;
		Если мТипТаблицы = ирОбщий.ТипТаблицыБДЛкс(СтрокаДерева.ПолноеИмяОбъекта) Тогда
			КлючСовпадает = Истина;
			СтруктураКлючаТаблицы = ирОбщий.СтруктураКлючаТаблицыБДЛкс(СтрокаДерева.ПолноеИмяОбъекта);
			Если мСтруктураКлючаТаблицы.Количество() <> СтруктураКлючаТаблицы.Количество() Тогда
				КлючСовпадает = Ложь;
			Иначе
				Для Каждого КлючИзначение Из СтруктураКлючаТаблицы Цикл
					Если Не мСтруктураКлючаТаблицы.Свойство(КлючИзначение.Ключ) Тогда
						КлючСовпадает = Ложь;
						Прервать;
					КонецЕсли; 
				КонецЦикла; 
			КонецЕсли; 
		КонецЕсли; 
	КонецЕсли;
	Возврат КлючСовпадает;

КонецФункции

Процедура ДеревоИсточниковПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
	ирКлиент.ТабличноеПолеОформитьЯчейкиИмяСинонимЛкс(Элемент, ОформлениеСтроки,,,, ?(мМножественныйВыбор, "Пометка", ""));
	//Если ДанныеСтроки.Строки.Количество() = 0 Тогда
	Если ДанныеСтроки.Уровень() > 0 Тогда
		КлючСовпадает = ЛиКлючТаблицыПодходит(ДанныеСтроки);
	ИначеЕсли ДанныеСтроки.Строки.Количество() > 0 Тогда 
		КлючСовпадает = ЛиКлючТаблицыПодходит(ДанныеСтроки.Строки[0]);
	Иначе
		КлючСовпадает = Ложь;
	КонецЕсли; 
	Если Не КлючСовпадает Тогда
		ОформлениеСтроки.Ячейки.Представление.ОтображатьФлажок = Ложь;
		ОформлениеСтроки.Ячейки.Имя.ОтображатьФлажок = Ложь;
	КонецЕсли; 
	//Если ДанныеСтроки.КоличествоСтрок = Неопределено Тогда
	//	ОформлениеСтроки.Ячейки.КоличествоСтрок.УстановитьТекст("?");
	//КонецЕсли; 
	Если ДанныеСтроки.Уровень() = 0 Тогда
		Если Не ДанныеСтроки.ЕстьДоступ Тогда 
			ОформлениеСтроки.ЦветТекста = WebЦвета.Красный;
		КонецЕсли; 
	Иначе
		Если Ложь
			Или ДанныеСтроки.ФункциональныеОпцииНеВключены 
			Или Не ДанныеСтроки.ПравоПросмотр 
			Или Не ДанныеСтроки.ЕстьДоступ 
		Тогда 
			ОформлениеСтроки.ЦветТекста = WebЦвета.Красный;
		КонецЕсли; 
	КонецЕсли; 
	
КонецПроцедуры

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

// Предопределеный метод
Процедура ПроверкаЗавершенияФоновыхЗаданий() Экспорт 
	
	ирКлиент.ПроверитьЗавершениеФоновыхЗаданийФормыЛкс(ЭтаФорма);
	
КонецПроцедуры

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

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

Процедура ДействияФормыФормаСписка(Кнопка)
	
	ТекущаяСтрока = ЭлементыФормы.ДеревоИсточников.ТекущаяСтрока;
	Если ТекущаяСтрока <> Неопределено Тогда
		ТипТаблицы = ирОбщий.ТипТаблицыБДЛкс(ТекущаяСтрока.ПолноеИмяОбъекта);
		Если Ложь
			Или ирОбщий.ЛиКорневойТипСсылочногоОбъектаБДЛкс(ТипТаблицы) 
			Или ирОбщий.ЛиКорневойТипРегистраБДЛкс(ТипТаблицы)
		Тогда
			ирКлиент.ПредложитьЗакрытьМодальнуюФормуЛкс(ЭтаФорма);
			ОткрытьФорму(ТекущаяСтрока.ПолноеИмяОбъекта + ".ФормаСписка");
		КонецЕсли; 
	КонецЕсли; 
	
КонецПроцедуры

Процедура ДействияФормыУстановитьПометки(Кнопка = Неопределено)
	
	ИзменитьПометкиВыделенныхСтрок(Истина);
	
КонецПроцедуры

Процедура ДействияФормыСнятьПометки(Кнопка)
	
	ИзменитьПометкиВыделенныхСтрок(Ложь);

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

Процедура ИзменитьПометкиВыделенныхСтрок(НовоеЗначениеПометки, СоВсемиПотоками = Ложь)
	
	ТабличноеПоле = ЭлементыФормы.ДеревоИсточников;
	ВыделенныеСтроки = ТабличноеПоле.ВыделенныеСтроки;
	Если Не СоВсемиПотоками И ВыделенныеСтроки.Количество() < 2 Тогда
		ВыделенныеСтроки = ТабличноеПоле.Значение.Строки;
	КонецЕсли; 
	Для Каждого СтрокаДерева Из ВыделенныеСтроки Цикл
		//Если ЛиКлючТаблицыПодходит(СтрокаДерева) Или Не НовоеЗначениеПометки Тогда
			УстановитьЗначениеФлажкаСтроки(СтрокаДерева, НовоеЗначениеПометки, , СоВсемиПотоками);
		//КонецЕсли; 
	КонецЦикла;
	Если мМножественныйВыбор Тогда
		НачальноеЗначениеВыбора = ПолучитьКлючиПомеченныхСтрок();
	КонецЕсли;

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

Процедура ДействияФормыИмяСиноним(Кнопка)
	
	ЭтаФорма.РежимИмяСиноним = Не Кнопка.Пометка;
	НастроитьЭлементыФормы();
	ирКлиент.ТабличноеПолеОбновитьКолонкиИмяСинонимЛкс(ЭлементыФормы.ДеревоИсточников, РежимИмяСиноним);
	ЗаполнитьДеревоИсточников(,, Истина);
	
КонецПроцедуры

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

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

Процедура ФильтрИменНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	
	ирОбщий.ПолеВводаСИсториейВыбора_ОбновитьСписокЛкс(Элемент, "СтрокаПоискаМетаданных");
	
КонецПроцедуры

Процедура ФильтрИменОткрытие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	//ирОбщий.НайтиСтрокуТабличногоПоляДереваЗначенийСоСложнымФильтромЛкс(ЭлементыФормы.ДеревоИсточников, ЭлементыФормы.ДеревоИсточниковСтрокаПоиска);
	ЗаполнитьДеревоИсточников();
	
КонецПроцедуры

Процедура ФильтрИменАвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)
	
	Если ирКлиент.ПромежуточноеОбновлениеСтроковогоЗначенияПоляВводаЛкс(ЭтаФорма, Элемент, Текст) Тогда 
		ЗаполнитьДеревоИсточников();
	КонецЕсли;
	
КонецПроцедуры

Процедура КнопкаОкНажатие(Кнопка)
	
	мВыбрать();
	
КонецПроцедуры

Процедура ДействияФормыТолькоПомеченные(Кнопка = Неопределено)
	
	Кнопка = ЭлементыФормы.ДействияФормы.Кнопки.ТолькоПомеченные;
	мТолькоПомеченные = Не Кнопка.Пометка;
	ЗаполнитьДеревоИсточников(,, Истина);
	
КонецПроцедуры

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

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

Процедура ДействияФормыПометитьВсеРегистраторыРегистра(Кнопка)
	
	Форма = ирКэш.Получить().ПолучитьФорму("ВыборОбъектаМетаданных", ЭтаФорма, ЭтаФорма);
	лСтруктураПараметров = Новый Структура;
	лСтруктураПараметров.Вставить("ОтображатьРегистры", Истина);
	лСтруктураПараметров.Вставить("ОтображатьСсылочныеОбъекты", Ложь);
	Форма.НачальноеЗначениеВыбора = лСтруктураПараметров;
	ЗначениеВыбора = Форма.ОткрытьМодально();
	Если ЗначениеВыбора <> Неопределено Тогда
		ОбъектМД = ирКэш.ОбъектМДПоПолномуИмениЛкс(ЗначениеВыбора.ПолноеИмяОбъекта);
		ПостроительЗапроса = Новый ПостроительЗапроса("ВЫБРАТЬ Т.* ИЗ " + ЗначениеВыбора.ПолноеИмяОбъекта + " КАК Т");
		ПостроительЗапроса.ЗаполнитьНастройки();
		ПоляТаблицы = ПостроительЗапроса.ДоступныеПоля;
		Если ПоляТаблицы.Найти("Регистратор") <> Неопределено Тогда
			Массив = Новый Массив;
			Для Каждого ТипРегистратора Из ПоляТаблицы.Регистратор.ТипЗначения.Типы() Цикл
				Регистратор = Метаданные.НайтиПоТипу(ТипРегистратора);
				СтрокаДерева = ДеревоИсточников.Строки.Найти(Регистратор.ПолноеИмя(), "ПолноеИмяОбъекта", Истина);
				Если СтрокаДерева <> Неопределено И ЛиКлючТаблицыПодходит(СтрокаДерева) Тогда
					УстановитьЗначениеФлажкаСтроки(СтрокаДерева, Истина);
				КонецЕсли; 
			КонецЦикла; 
			НачальноеЗначениеВыбора = ПолучитьКлючиПомеченныхСтрок();
		КонецЕсли; 
	КонецЕсли; 

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

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

Процедура ДействияФормыУстановитьПометкиСоВсемиПотомками(Кнопка)
	
	ИзменитьПометкиВыделенныхСтрок(Истина, Истина);
	
КонецПроцедуры

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

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

Функция ПоследниеВыбранныеНажатие(Кнопка) Экспорт

	ВключитьТолькоПомеченные = мТолькоПомеченные;
	Если ВключитьТолькоПомеченные Тогда
		ДействияФормыТолькоПомеченные();
	КонецЕсли;
	ирКлиент.ПоследниеВыбранныеНажатиеЛкс(ЭтаФорма, ЭлементыФормы.ДеревоИсточников, ДеревоИсточников.Колонки.ПолноеИмяОбъекта.Имя, Кнопка);
	Если ЭлементыФормы.ДеревоИсточников.ВыделенныеСтроки.Количество() > 1 Тогда
		ДействияФормыУстановитьПометки();
	КонецЕсли;
	Если ВключитьТолькоПомеченные Тогда
		ДействияФормыТолькоПомеченные();
	КонецЕсли;
	
КонецФункции

Процедура ДействияФормыФункциональныеОпции(Кнопка)
	
	ЭлементыФормы.ДеревоИсточников.Колонки.ФункциональныеОпции.Видимость = Истина;
	ЗаполнитьДеревоИсточников(,, Истина);
	
КонецПроцедуры

Процедура ФильтрПодсистемПриИзменении(Элемент)
	
	//Если мСписокВыбораПодсистем.НайтиПоЗначению(ФильтрПодсистем) = Неопределено Тогда
	//	ФильтрПодсистем = "";
	//КонецЕсли; 
	ЗаполнитьДеревоИсточников(,, Истина);
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
	
КонецПроцедуры

Процедура ФильтрПодсистемНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	мПлатформа = ирКэш.Получить();
	#Если Сервер И Не Сервер Тогда
		мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	ФормаВыбора = мПлатформа.ПолучитьФорму("ВыборПодсистемы", Элемент);
	ФормаВыбора.РежимВыбора = Истина;
	ФормаВыбора.МножественныйВыбор = Истина;
	ФормаВыбора.НачальноеЗначениеВыбора = ФильтрПодсистем;
	ФормаВыбора.Открыть();
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

Процедура ФильтрПодсистемНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	
	ирОбщий.ПолеВводаСИсториейВыбора_ОбновитьСписокЛкс(Элемент, ЭтаФорма);
	
КонецПроцедуры

Процедура ФильтрПодсистемОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	ирКлиент.ФильтрПодсистемОбработкаВыбораЛкс(ЭтаФорма, Элемент, ВыбранноеЗначение, СтандартнаяОбработка);
КонецПроцедуры

Процедура ДеревоИсточниковПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
	ирКлиент.ОповеститьИсследователиОбъектовЛкс(ЭтаФорма, ТекущийОбъектИсследователя());

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

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

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

Процедура ДействияФормыФильтроватьДочерние(Кнопка)
	ЭтаФорма.ФильтроватьДочерние = Не Кнопка.Пометка;
	НастроитьЭлементыФормы();
	Если ЗначениеЗаполнено(ДеревоИсточниковСтрокаПоиска) Тогда
		ЗаполнитьДеревоИсточников(,, Истина);
	КонецЕсли; 
КонецПроцедуры

Процедура НастроитьЭлементыФормы()
	
	ЭлементыФормы.ДействияФормы.Кнопки.ФильтроватьДочерние.Пометка = ФильтроватьДочерние;
	ЭлементыФормы.ДействияФормы.Кнопки.ИмяСиноним.Пометка = РежимИмяСиноним;

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

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

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

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

Процедура ДействияФормыИсследовательОбъектов(Кнопка)
	
	ирКлиент.ПредложитьЗакрытьМодальнуюФормуЛкс(ЭтаФорма);
	ирОбщий.ИсследоватьЛкс(ТекущийОбъектИсследователя(),,,, "ОбъектМД",,,, ЭтаФорма);
	
КонецПроцедуры

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

КонецФункции

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

Процедура ДеревоИсточниковСтрокаПоискаОчистка(Элемент, СтандартнаяОбработка)
	Если Элемент.Значение = "" Тогда
		ирКлиент.ТабличноеПолеДеревоЗначений_СвернутьВсеСтрокиЛкс(ЭлементыФормы.ДеревоИсточников);
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
КонецПроцедуры

Процедура ДействияФормыСохранитьВФайл(Кнопка)
	
	ИмяФайла = ДействияФормыСохранитьВФайлФрагмент(Ложь);
	Если ЗначениеЗаполнено(ИмяФайла) Тогда
		Результат = ПолучитьКлючиПомеченныхСтрок();
		Текст = Новый ТекстовыйДокумент;
		Текст.УстановитьТекст(ирОбщий.СтрСоединитьЛкс(Результат, Символы.ПС));
		Текст.Записать(ИмяФайла);
	КонецЕсли;
	
КонецПроцедуры

Функция ДействияФормыСохранитьВФайлФрагмент(РежимОткрытия)
	
	ИмяФайла = ирКлиент.ВыбратьФайлЛкс(РежимОткрытия, "mdl", "Список метаданных (MetaData List)");
	Возврат ИмяФайла;

КонецФункции

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

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирПлатформа.Форма.ВыборОбъектаМетаданных");

ЭтаФорма.ФильтроватьДочерние = Истина;
мМножественныйВыборТолькоДляОднотипныхТаблиц = Ложь;
мОтображатьСсылочныеОбъекты = Истина;
мОтображатьРегистры = Истина;
мОтображатьПоследовательности = Истина;
мОтображатьТабличныеЧасти = Истина;
мСтрокаТипаТабличнойЧасти = ОписаниеТипаМетаОбъектов("ТабличнаяЧасть");
мСтрокаТипаВнешнегоИсточникаДанных = ОписаниеТипаМетаОбъектов("ВнешнийИсточникДанных");
ДеревоИсточников.Колонки.Добавить("ЗначенияФункОпций");

//ДеревоИсточников.Колонки.Добавить("Пометка", Новый ОписаниеТипов("Число"));
//ДеревоИсточников.Колонки.Добавить("ПолноеИмяОбъекта");
