
// Можно улучшить отсюда https://infostart.ru/public/818909/

Перем мИмяСлужбыСобственногоАгента;
Перем ТекущаяСборкаПлатформы;

Процедура КнопкаВыполнитьНажатие(Кнопка)
	// Вставить содержимое обработчика.
КонецПроцедуры

Процедура Применить(Кнопка)
	
	Если Не ПроверитьЗаполнение() Тогда 
		Возврат;
	КонецЕсли; 
	ПрименитьИзменения();
	ОбновитьДанные();
	
КонецПроцедуры

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

Процедура КомпьютерНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)

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

Процедура ДействияФормыОбновить(Кнопка)
	
	Если Не ЗапроситьПодтверждение() Тогда
		Возврат;
	КонецЕсли; 
	ОбновитьДанные();

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

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

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

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

Функция ЗапроситьПодтверждение()
	
	Результат = Истина;
	Если Модифицированность Тогда
		Ответ = Вопрос("Вы не применили изменения. Продолжить?", РежимДиалогаВопрос.ОКОтмена);
		Результат = Ответ = КодВозвратаДиалога.ОК;
	КонецЕсли; 
	Возврат Результат;

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

Процедура ДействияФормыПерезапустить(Кнопка)

	Если Не ЗапроситьПодтверждение() Тогда
		Возврат;
	КонецЕсли; 
	Для НомерПрохода = 1 По 2 Цикл
		ТабличноеПолеТекущегоТипаСлужб = ТабличноеПолеТекущегоТипаСлужб();
		Для Каждого ВыделеннаяСтрока Из ТабличноеПолеТекущегоТипаСлужб.ВыделенныеСтроки Цикл
			ДанныеСтроки = ВыделеннаяСтрока;
			Если ДанныеСтроки.ЭтоНоваяСлужба Тогда
				Продолжить;
			КонецЕсли; 
			ИмяСлужбы = ДанныеСтроки.Имя;
			Если мИмяСлужбыСобственногоАгента = ДанныеСтроки.Имя Тогда
				Если НомерПрохода = 2 Тогда 
					ирОбщий.СообщитьЛкс("Для остановки служб агентов рекомендуется использовать файловую базу http://devtool1c.ucoz.ru/load/osnovnye/pustaja_baza_s_variantom_rasshirenie/1-1-0-20");
					ирОбщий.СообщитьЛкс("Перезапуск собственной службы на порте " + Формат(ДанныеСтроки.Порт, "ЧГ="));
					ТекстКомандногоФайла = "
					|net stop """ + ИмяСлужбы + """
					|net start """ + ИмяСлужбы + """";
					КомандныйФай = ирОбщий.СоздатьСамоудаляющийсяКомандныйФайлЛкс(ТекстКомандногоФайла);
					ЗапуститьПриложение(КомандныйФай);
				КонецЕсли; 
			Иначе
				Если НомерПрохода = 1 Тогда 
					Сообщить("Перезапуск службы на порте " + Формат(ДанныеСтроки.Порт, "ЧГ="));
					Служба = ПолучитьWMIОбъектСлужбы(ДанныеСтроки.Имя);
					Если Служба.State <> "Stopped" Тогда
						Если ИзменитьСостояниеСлужбы(ДанныеСтроки, "stop") Тогда 
							ЖдатьСекунд = 20;
							НачальнаяДата = ТекущаяДата();
							Пока ТекущаяДата() - НачальнаяДата < ЖдатьСекунд Цикл
								ОбновитьДанные();
								СтрокиСлужбы = ТабличноеПолеТекущегоТипаСлужб.Значение.НайтиСтроки(Новый Структура("Имя", ИмяСлужбы));
								Если СтрокиСлужбы.Количество() = 0 Тогда
									Возврат;
								КонецЕсли;
								ДанныеСтроки = СтрокиСлужбы[0];
								ТабличноеПолеТекущегоТипаСлужб.ТекущаяСтрока = ДанныеСтроки;
								Если Не ЗначениеЗаполнено(ДанныеСтроки.ИдентификаторПроцесса) Тогда
									Прервать;
								КонецЕсли; 
							КонецЦикла;
						КонецЕсли; 
					КонецЕсли; 
					ИзменитьСостояниеСлужбы(ДанныеСтроки, "start");
				КонецЕсли; 
			КонецЕсли; 
		КонецЦикла;
	КонецЦикла;
	ОбновитьДанные();
	
КонецПроцедуры

Процедура ДействияФормыОстановить(Кнопка)

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

Функция ТабличноеПолеТекущегоТипаСлужб()
	
	Возврат ЭлементыФормы[ЭлементыФормы.ПанельТипыСлужб.ТекущаяСтраница.Имя];

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

Процедура ПриОткрытии()
	
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	ирСервер.ПолучитьПараметрыПроцессаАгентаСервера(1, 1, мИмяСлужбыСобственногоАгента);
	СписокВыбора = ЭлементыФормы.СлужбыАгентовСерверов.Колонки.РежимОтладки.ЭлементУправления.СписокВыбора;
	#Если Сервер И Не Сервер Тогда
	    СписокВыбора = Новый СписокЗначений;
	#КонецЕсли
	СписокВыбора.Добавить("нет");
	СписокВыбора.Добавить("tcp");
	СписокВыбора.Добавить("http");
	Для Каждого ТипСлужбы Из мТипыСлужб Цикл
		ТипСлужбы = ТипСлужбы.Значение;
		ТабличноеПоле = ЭлементыФормы[ТипСлужбы.ИмяТабличнойЧасти];
		СписокВыбора = ТабличноеПоле.Колонки.Порт.ЭлементУправления.СписокВыбора;
		#Если Сервер И Не Сервер Тогда
		    СписокВыбора = Новый СписокЗначений;
		#КонецЕсли
		СписокВыбора.Добавить(ТипСлужбы.ПортПоУмолчанию);
		СписокВыбора.Добавить(ТипСлужбы.ПортПоУмолчанию + 1000);
		СписокВыбора.Добавить(ТипСлужбы.ПортПоУмолчанию + 2000);
		СписокВыбора.Добавить(ТипСлужбы.ПортПоУмолчанию + 3000);
		СписокВыбора.Добавить(ТипСлужбы.ПортПоУмолчанию + 4000);
	КонецЦикла;
	ОбновитьДанные();
	ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.СлужбыАгентовСерверов; // Почему то не смотря на статическое назначение текущим у формы текущим элементом при открытии является Панель
	ЭтаФорма.ОтАдминистратора = ирОбщий.ВКОбщаяЛкс().IsAdmin();
	СистемнаяИнформация = Новый СистемнаяИнформация;
	ТекущаяСборкаПлатформы = СистемнаяИнформация.ВерсияПриложения;
	НастроитьЭлементыФормы();
	
КонецПроцедуры

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

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

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

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

Процедура СлужбыАгентовСерверов1СПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	Если ДанныеСтроки.Имя = мИмяСлужбыСобственногоАгента Тогда
		ОформлениеСтроки.ЦветФона = WebЦвета.СветлоНебесноГолубой;
	КонецЕсли; 
	ОформлениеСтроки.Ячейки.ПарольПользователя.УстановитьТекст("*****");
	ОформлениеСтроки.Ячейки.СерверОтладкиПароль.УстановитьТекст("*****");
	ОформлениеСтроки.Ячейки.ГруппаСборкаПлатформы.Видимость = Ложь;
	ОформлениеСтроки.Ячейки.ГруппаПортыРабочихПроцессов.Видимость = Ложь;
	ОформлениеСтроки.Ячейки.ГруппаОтладка.Видимость = Ложь;
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
	
КонецПроцедуры

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

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

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

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

Процедура СлужбыАгентовСерверов1ССборкаПлатформыНоваяНачалоВыбора(Элемент, СтандартнаяОбработка)
	ирКлиент.ПолеФайловогоКаталога_НачалоВыбораЛкс(Элемент, СтандартнаяОбработка);
КонецПроцедуры

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

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

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

Процедура СлужбыАдминистрированияСерверовПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	
	ОбновитьСтрокуЗапускаСлужбы(Элемент.ТекущаяСтрока);

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

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

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

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

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

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

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

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

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

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

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

Процедура СлужбыХранилищКонфигурацийПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	
	Если НоваяСтрока Тогда
		ЗаполнитьНовуюСтрокуСлужбы(Элемент, мТипыСлужб.СерверХранилища);
	КонецЕсли; 
	
КонецПроцедуры

Процедура ЗаполнитьНовуюСтрокуСлужбы(Элемент, ОписаниеТипаСлужба)
	
	Элемент.ТекущиеДанные.ТипСлужбы = ОписаниеТипаСлужба.ТипСлужбы;
	Элемент.ТекущиеДанные.ЭтоНоваяСлужба = Истина;
	Элемент.ТекущиеДанные.Автозапуск = Истина;
	Элемент.ТекущиеДанные.Имя = "<Авто>";
	Элемент.ТекущиеДанные.Представление = "<Авто>";
	Элемент.ТекущиеДанные.Порт = ОписаниеТипаСлужба.ПортПоУмолчанию;

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

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

Процедура НастроитьЭлементыФормы()
	
	//ЭлементыФормы.ДействияФормы.Кнопки.ВыгрузитьБД.Доступность = ИсполняемыйФайлаАвтономногоСервера() <> Неопределено;

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

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

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

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

Процедура СлужбыСерверовАдминистрированияСтрокаСоединенияАгентаСервераНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	
	СписокВыбора = Новый СписокЗначений;
	Для Каждого СтрокаАгента Из СлужбыАгентовСерверов.НайтиСтроки(Новый Структура("Удалить", Ложь)) Цикл
		СписокВыбора.Добавить(ИмяКомпьютера() + ":" + XMLСтрока(ПортСтрокиСлужбы(СтрокаАгента)));
	КонецЦикла;
	Элемент.СписокВыбора = СписокВыбора;

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

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

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

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

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

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

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

Процедура СлужбыХранилищКонфигурацийПриИзмененииФлажка(Элемент, Колонка)
	
	ирКлиент.ТабличноеПолеПриИзмененииФлажкаЛкс(ЭтаФорма, Элемент, Колонка);

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

Процедура СлужбыАгентовСерверовПриАктивизацииСтроки(Элемент)
	
	Кластеры.Очистить();
	Если Не ЭлементыФормы.СлужбыАгентовСерверов.ТекущаяСтрока.ЭтоНоваяСлужба Тогда
		КаталогКонфигурацииСервера = ЭлементыФормы.СлужбыАгентовСерверов.ТекущаяСтрока.КаталогКонфигурации;
		ИмяФайлаКонфигурацииСервера = КаталогКонфигурацииСервера + "\1cv8wsrv.lst";
		ФайлКонфигурацииСервера = Новый Файл(ИмяФайлаКонфигурацииСервера);
		Если Не ФайлКонфигурацииСервера.Существует() Тогда
			ирОбщий.СообщитьЛкс("Не обнаружен файл настроек (1cv8wsrv.lst) службы агента");
		Иначе
			// Копируем файл, т.к. он постоянно заблокирован
			ИмяВременногоФайла = ПолучитьИмяВременногоФайла("lst");
			КопироватьФайл(ИмяФайлаКонфигурацииСервера, ИмяВременногоФайла);
			ЧтениеТекста = Новый ТекстовыйДокумент;
			ЧтениеТекста.Прочитать(ИмяВременногоФайла);
			УдалитьФайлы(ИмяВременногоФайла);
			XMLСтрока = ЧтениеТекста.ПолучитьТекст();
			XMLСтрока = ирОбщий.СтрокаВнутрВХМЛТелоЛкс(XMLСтрока);
			ЧтениеXML = Новый ЧтениеXML;
			ЧтениеXML.УстановитьСтроку(XMLСтрока);
			ПостроительDOM = Новый ПостроительDOM;
			ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
			РазыменовательПИ = Новый РазыменовательПространствИменDOM(ДокументDOM);
			ИмяЭлемента = "/e/e/e/d[3]";
			РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента, ДокументDOM, РазыменовательПИ, ТипРезультатаDOMXPath.УпорядоченныйИтераторУзлов);
			ПортыКластеров = Новый Массив;
			Пока 1 = 1 Цикл
				Узел = РезультатXPath.ПолучитьСледующий();
				Если Узел = Неопределено Тогда
					Прервать;
				КонецЕсли;
				ДочерниеУзлы = Узел.ДочерниеУзлы;
				СтрокаНомераПорта = ДочерниеУзлы[0].ТекстовоеСодержимое;
				Если ПортыКластеров.Найти(СтрокаНомераПорта) = Неопределено Тогда
					ПортыКластеров.Добавить(СтрокаНомераПорта);
				КонецЕсли; 
			КонецЦикла;
			Для Каждого ПортКластера Из ПортыКластеров Цикл
				СтрокаКластера = Кластеры.Добавить();
				СтрокаКластера.Кластер = ПортКластера;
			КонецЦикла;
			Кластеры.Сортировать("Кластер");
		КонецЕсли; 
	КонецЕсли; 
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

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

Процедура СборкиПлатформыПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

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

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

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

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

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

Процедура СлужбыХранилищКонфигурацийПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КластерыВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	ТекущаяСтрока = Элемент.ТекущаяСтрока;
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ФормаКластера = ПолучитьФорму("СписокБазКластера");
	ФормаКластера.КластерИмя = ТекущаяСтрока.Кластер;
	ФормаКластера.КаталогКластера = ЭлементыФормы.СлужбыАгентовСерверов.ТекущаяСтрока.КаталогКонфигурации + "\reg_" + ТекущаяСтрока.Кластер;
	ФормаКластера.x64 = ирОбщий.СтрКончаетсяНаЛкс(ЭлементыФормы.СлужбыАгентовСерверов.ТекущаяСтрока.СборкаПлатформыАктивная, "64");
	ФормаКластера.Открыть();
	
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
	ирОбщий.ПроверитьПлатформаНеWindowsЛкс(Отказ);
КонецПроцедуры

Процедура ДействияФормыОткрытьИТС(Кнопка)
	ирКлиент.ОткрытьСсылкуИТСЛкс("https://its.1c.ru/db/v?doc#bookmark:cs:TI000000119");
КонецПроцедуры

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирУправлениеСлужбамиСервера1С.Форма.Форма");
