Процедура ЗапуститьНовоеПриложение(Знач ОбычноеПриложение = Истина)
	
	#Если ВебКлиент Или МобильныйКлиент Тогда
		Сообщить("Команда недоступна веб клиенте");
	#Иначе
		Если ТекущийПользователь Тогда
			НастроитьПользователяНаСервере();
		КонецЕсли; 
		ПараметрыЗапуска = "";
		СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
		ПараметрыЗапуска = ПараметрыЗапуска + " ENTERPRISE";
		ПараметрыЗапуска = ПараметрыЗапуска + " /IBConnectionString""" + СтрЗаменить(СтрокаСоединения, """", """""") + """";
		Если ОбычноеПриложение Тогда
			ПараметрыЗапуска = ПараметрыЗапуска + " /RunModeOrdinaryApplication";
		Иначе
			ПараметрыЗапуска = ПараметрыЗапуска + " /RunModeManagedApplication";
		КонецЕсли; 
		//ПараметрыЗапуска = ПараметрыЗапуска + " /Debug";
		ПараметрыЗапуска = ПараметрыЗапуска + " /UC""" + КодРазрешения + """";
		ИспользуемоеИмяФайлаЛ = ПолучитьИспользуемоеИмяФайла(ИмяКомпьютера());
		Если ЗначениеЗаполнено(ИспользуемоеИмяФайлаЛ) Тогда
			ПараметрыЗапуска = ПараметрыЗапуска + " /Execute""" + ИспользуемоеИмяФайлаЛ + """";
		КонецЕсли; 
		Если ТекущийПользователь Тогда
			ПараметрыЗапуска = ПараметрыЗапуска + " /WA-";
			ПараметрыЗапуска = ПараметрыЗапуска + " /N""" + ИмяПользователя() + """";
			Если ЗначениеЗаполнено(ПарольТекущегоПользователя) Тогда
				ПараметрыЗапуска = ПараметрыЗапуска + " /P""" + ПарольТекущегоПользователя + """";
			КонецЕсли; 
		КонецЕсли; 
		Если ЗначениеЗаполнено(ДополнительныеПараметры) Тогда
			ПараметрыЗапуска = ПараметрыЗапуска + " " + ДополнительныеПараметры;
		КонецЕсли; 
		Если ПрименитьТекущиеПараметрыЗапуска Тогда
			Попытка
				ВК = Новый ("AddIn.ирОбщая.AddIn");
			Исключение
				// https://partners.v8.1c.ru/forum/t/1265923/m/1555146
				//АдресКомпоненты = ПолучитьАдресВнешнейКомпоненты();
				//УстановитьВнешнююКомпоненту(АдресКомпоненты); // Выдает предупреждение пользователю каждый раз
				//
				Это64битныйПроцесс = Это64битныйПроцесс();
				ДвоичныеДанные = ПолучитьДвоичныеДанныеВК(Это64битныйПроцесс);
				АдресКомпоненты = ПолучитьИмяВременногоФайла("dll");
				ДвоичныеДанные.Записать(АдресКомпоненты);
				
				Результат = ПодключитьВнешнююКомпоненту(АдресКомпоненты, "ирОбщая", ТипВнешнейКомпоненты.Native);
				Если Не Результат Тогда
					ВызватьИсключение "Не удалось подключить внешнюю компоненту Общая. Она требуется для флажка ""Применить текущие параметры запуска"""; 
				КонецЕсли; 
				ВК = Новый ("AddIn.ирОбщая.AddIn");
			КонецПопытки; 
			ИдентификаторПроцессаОС = ВК.PID();
			ПараметрыЗапускаТекущие = ПараметрыЗапускаСеансаТекущие(ИдентификаторПроцессаОС);
			ПараметрыЗапуска = ПараметрыЗапуска + " " + ПараметрыЗапускаТекущие;
		КонецЕсли; 
		
		ИсполняемыйФайл = Новый Файл(ирОбщий.ИмяИсполняемогоФайлаКлиентаПлатформыЛкс(Истина));
		//Если Не ИсполняемыйФайл.Существует() Тогда
		//	ВызватьИсключение "Необходимо установить толстый клиент 1С";
		//КонецЕсли; 
		ЗапуститьПриложение("""" + ИсполняемыйФайл.ПолноеИмя + """ " + ПараметрыЗапуска);
		Если ЗакрытьФорму Тогда
			Закрыть();
		КонецЕсли; 
		Если ЗавершитьСеанс Тогда
			ЗавершитьРаботуСистемы();
		КонецЕсли; 
	#КонецЕсли

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

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

Функция ДоступнаЗащитаОтОпасныхДействий() Экспорт 
	
	Перем ТекущийПользователь;
	ЗащитаОтОпасныхДействийЛ = Неопределено;
	Попытка
		ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
		ЗащитаОтОпасныхДействийЛ = ТекущийПользователь.ЗащитаОтОпасныхДействий;
	Исключение
	КонецПопытки;
	Возврат ЗащитаОтОпасныхДействийЛ <> Неопределено;
	
КонецФункции

#Если Не ВебКлиент И Не МобильныйКлиент Тогда
// р5яф67оыйи
Функция ПараметрыЗапускаСеансаТекущие(Знач ИдентификаторПроцессаОС) Экспорт 
	
	Результат = "";
	ТекущийПроцесс = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process.Handle='" + XMLСтрока(ИдентификаторПроцессаОС) + "'");
	КоманднаяСтрокаПроцесса = ТекущийПроцесс.CommandLine;
	ВычислительРегВыражений = Новый COMОбъект("VBScript.RegExp");
	ВычислительРегВыражений.IgnoreCase = Истина;
	ВычислительРегВыражений.Global = Истина;
	ВычислительРегВыражений.Pattern = "(/DebuggerUrl\s*.+?)(?: /|$)";
	Вхождения = ВычислительРегВыражений.Execute(КоманднаяСтрокаПроцесса);
	КоличествоВхождений = Вхождения.Count;
	Если КоличествоВхождений > 0 Тогда
		Результат = Вхождения.Item(КоличествоВхождений - 1).SubMatches(0);
	КонецЕсли; 
	ВычислительРегВыражений.Pattern = "(/Debug\s+.+?)(?: /|$)";
	Вхождения = ВычислительРегВыражений.Execute(КоманднаяСтрокаПроцесса);
	КоличествоВхождений = Вхождения.Count;
	Если КоличествоВхождений > 0 Тогда
		СтрокаОтладчика = Вхождения.Item(КоличествоВхождений - 1).SubMatches(0);
	Иначе
		СтрокаОтладчика = "/Debug";
	КонецЕсли;
	Результат = Результат + " " + СтрокаОтладчика;
	
	СохраняемыеПараметры = Новый Массив;
	СохраняемыеПараметры.Добавить("TechnicalSpecialistMode");
	СохраняемыеПараметры.Добавить("UseHwLicenses");
	СохраняемыеПараметры.Добавить("L");
	СохраняемыеПараметры.Добавить("VL");
	//СохраняемыеПараметры.Добавить("C");
	СохраняемыеПараметры.Добавить("UC");
	Для Каждого ИмяПараметра Из СохраняемыеПараметры Цикл
		ВычислительРегВыражений.Pattern = "(/" + ИмяПараметра + ".*?)(?:\s/|$)";
		Вхождения = ВычислительРегВыражений.Execute(КоманднаяСтрокаПроцесса);
		КоличествоВхождений = Вхождения.Count;
		Если КоличествоВхождений > 0 Тогда
			ПараметрКоманднойСтроки = Вхождения.Item(КоличествоВхождений - 1).SubMatches(0);
			Результат = Результат + " " + ПараметрКоманднойСтроки;
		КонецЕсли; 
	КонецЦикла;
	Возврат Результат;
КонецФункции
#КонецЕсли 

Функция ОбработкаОбъект()
	
	Если ТипЗнч(ЭтаФорма) = Тип("УправляемаяФорма") Тогда
		ОбработкаОбъект = ЭтаФорма.РеквизитФормыВЗначение("Объект");
	Иначе
		ОбработкаОбъект = Вычислить("ЭтотОбъект");
	КонецЕсли; 
	Возврат ОбработкаОбъект;

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

Функция ПолучитьДвоичныеДанныеВК(x64 = Ложь)
	ОбработкаОбъект = ОбработкаОбъект();
	ИмяМакета = "ВК";
	Если x64 Тогда
		ИмяМакета = ИмяМакета + "64";
	Иначе
		ИмяМакета = ИмяМакета + "32";
	КонецЕсли; 
	Возврат ОбработкаОбъект.ПолучитьМакет(ИмяМакета);
КонецФункции

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

Функция ПолучитьИспользуемоеИмяФайла(ИмяКомпьютера)
	
	ОбработкаОбъект = ОбработкаОбъект();
	Попытка
		ИспользуемоеИмяФайлаЛ = ОбработкаОбъект.ИспользуемоеИмяФайла;
	Исключение
	КонецПопытки; 
	Возврат ИспользуемоеИмяФайлаЛ;
	
КонецФункции

// Метка_9в6676вап6438о
Функция Это64битныйПроцесс() Экспорт
	
	СисИнфо = Новый СистемнаяИнформация;
	Результат = Ложь
		Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64
		Или СисИнфо.ТипПлатформы = ТипПлатформы.Linux_x86_64
		//Или СисИнфо.ТипПлатформы = ТипПлатформы.MacOS_x86_64  // Появилось в 8.3
		;
	Возврат Результат;

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

Процедура ЗапуститьОбычноеПриложениеНажатие(Элемент)
	
	ЗапуститьНовоеПриложение(Истина);
	
КонецПроцедуры

Процедура ЗапуститьТолстыйКлиентНажатие(Элемент)
	
	ЗапуститьНовоеПриложение(Ложь);
	
КонецПроцедуры

Процедура ТекущийПользовательПриИзменении(Элемент)
	
	ОбновитьДоступность();

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

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

////////////////////////

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

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

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

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

Процедура ДополнительныеПараметрыПриИзменении(Элемент)

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

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

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

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

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

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

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

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