Процедура ДобавитьПодсистему(СтрокиДереваПодсистем, Подсистема)

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

Процедура ФильтроватьПодсистемыПоОбъектуМетаданных(СтрокиДереваПодсистем)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ОбновитьПредставлениеВыбора() Экспорт
	ЭтаФорма.ПредставлениеВыбора = "Выбрано: " + ирОбщий.РасширенноеПредставлениеЛкс(РезультатВыбора());
КонецПроцедуры

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

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

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

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

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

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

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

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

Процедура ВпередНажатие(Элемент)
	
	ирКлиент.СледующееВхождениеСтрокиПоискаВТабличномПолеЛкс(ЭтаФорма, ЭлементыФормы.ДеревоПодсистем);
	
КонецПроцедуры

Процедура НазадНажатие(Элемент)
	
	ирКлиент.ПредыдущееВхождениеСтрокиПоискаВТабличномПолеЛкс(ЭтаФорма, ЭлементыФормы.ДеревоПодсистем);

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

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

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