///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	НеУстановленоОдновременных = 0;
	ПроверятьКриптопровайдер = Метаданные.Обработки.Найти("ПрограммыЭлектроннойПодписиИШифрования") <> Неопределено;
	
	ИмяТребуемойКомпоненты = Параметры.ИмяТребуемойКомпоненты;
	Если Параметры.Свойство("Компоненты") Тогда
		ЗаполнитьЗначенияСвойств(Параметры, Параметры.Компоненты);
	КонецЕсли;
	
	Если Параметры.КриптопровайдерУстановлен И ПроверятьКриптопровайдер Тогда
		Элементы.ГруппаПроверкаУстановкиКриптопровайдера.Видимость = Ложь;
		СостояниеУстановкиКриптопровайдера = 2;
	Иначе
		Элементы.ГруппаПроверкаУстановкиКриптопровайдера.Видимость = Истина;
		СостояниеУстановкиКриптопровайдера = 0;
	КонецЕсли;
	Если Параметры.РасширениеРаботыС1СПредприятиемУстановлено Тогда
		Элементы.ГруппаПроверкаУстановкиРасширения1С.Видимость = Ложь;
		СостояниеУстановкиРасширенияРаботыС1СПредприятием = 2;
	Иначе
		Элементы.ГруппаПроверкаУстановкиРасширения1С.Видимость = Истина;
		СостояниеУстановкиРасширенияРаботыС1СПредприятием = 0;
		НеУстановленоОдновременных = НеУстановленоОдновременных + 1;
	КонецЕсли;
	Если Параметры.РасширениеРаботыСКриптографиейУстановлено Тогда
		Элементы.ГруппаПроверкаУстановкиРасширенияЭП.Видимость = Ложь;
		СостояниеУстановкиРасширенияРаботыСКриптографией = 2;
	Иначе
		Элементы.ГруппаПроверкаУстановкиРасширенияЭП.Видимость = Истина;
		СостояниеУстановкиРасширенияРаботыСКриптографией = 0;
		НеУстановленоОдновременных = НеУстановленоОдновременных + 1;
	КонецЕсли;
	Если Параметры.КомпонентаExtraCryptoAPIУстановлена Тогда
		Элементы.ГруппаПроверкаУстановкиКомпоненты.Видимость = Ложь;
		СостояниеУстановкиКомпонентыExtraCryptoAPI = 2;
	Иначе
		Элементы.ГруппаПроверкаУстановкиКомпоненты.Видимость = Истина;
		СостояниеУстановкиКомпонентыExtraCryptoAPI = 0;
		НеУстановленоОдновременных = НеУстановленоОдновременных + 1;
	КонецЕсли;
	
	Если НеУстановленоОдновременных = 1 Тогда
		Элементы.УстановитьВсе.Заголовок = НСтр("ru = 'Установить'");
	КонецЕсли;
	
	Если ОбщегоНазначения.ЭтоWindowsКлиент() Тогда
		Элементы.УстановитьВсеРасширеннаяПодсказка.Заголовок = 
			НСтр("ru = 'После окончания загрузки каждого из файлов нажмите на загруженный файл и следуйте инструкциям установщика.'");
	ИначеЕсли ОбщегоНазначения.ЭтоLinuxКлиент() Или ОбщегоНазначения.ЭтоMacOSКлиент() Тогда
		Элементы.УстановитьВсеРасширеннаяПодсказка.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(
			НСтр("ru = 'Для окончательной установки каждой компоненты необходимо выполнить следующие действия:
				|1. В появившемся окне выберите сохранение файла.
				|2. Нажмите на кнопку, на которую будет указывать стрелка, и выберите скачанный файл.
				|3. Сделайте файл исполняемым и запустите.'"));
	Иначе
		Элементы.УстановитьВсеРасширеннаяПодсказка.Заголовок = "";
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	УстановитьЗначениеДекорацийВЗависимостиОтСостоянияУстановкиКомпонент();
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ИмяСобытия = "Установка_ПриложениеКриптографии" Тогда
		
		ТребоватьПерезагрузку = ?(Параметр = Истина, Истина, Ложь);
		Если ТребоватьПерезагрузку Тогда
			Элементы.ПродолжитьРаботу.Заголовок = НСтр("ru = 'Перезагрузить'");
		КонецЕсли;
		
		ПослеУстановкиПрограммыКриптографии();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	ПродолжитьРаботу(Неопределено);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ДекорацияКриптопровайдерУстановленПояснениеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	УстановитьПрограммуКриптографии();
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

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

&НаКлиенте
Процедура ПродолжитьРаботу(Команда)
	
	Если ИмяТребуемойКомпоненты = "РасширениеРаботыС1СПредприятием" Тогда
		Если СостояниеУстановкиРасширенияРаботыС1СПредприятием = 2 Тогда
			Закрыть(Истина);
		Иначе
			Закрыть(Ложь);
		КонецЕсли;
	ИначеЕсли ИмяТребуемойКомпоненты = "РасширениеРаботыСКриптографией" Тогда
		Если СостояниеУстановкиРасширенияРаботыСКриптографией = 2 Тогда
			Закрыть(Истина);
		Иначе
			Закрыть(Ложь);
		КонецЕсли;
	ИначеЕсли ИмяТребуемойКомпоненты = "КомпонентаExtraCryptoAPI" Тогда
		ПараметрыЗакрытия = Новый Структура("Подключено, ОписаниеОшибки");
		ПараметрыЗакрытия.Подключено = ?(СостояниеУстановкиКомпонентыExtraCryptoAPI = 2, Истина, Ложь);
		ПараметрыЗакрытия.ОписаниеОшибки = "";
		Закрыть(ПараметрыЗакрытия);
	Иначе
		Закрыть();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура УстановитьЗначениеДекорацийВЗависимостиОтСостоянияУстановкиКомпонент()
	
	Если СостояниеУстановкиКриптопровайдера = 2 Тогда
		ТекстТребуетсяПерезагрузка = ?(ТребоватьПерезагрузку, НСтр("ru = ', требуется перезапустить сеанс'"), "");
		Элементы.ДекорацияКриптопровайдерУстановлен.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Установлено средство криптографической защиты информации%1'"), ТекстТребуетсяПерезагрузка);
		Элементы.ДекорацияКриптопровайдерУстановленПояснение.Видимость = Ложь;
	ИначеЕсли СостояниеУстановкиКриптопровайдера = 1 Тогда
		Элементы.ДекорацияКриптопровайдерУстановлен.Заголовок = НСтр("ru = 'Выполняется установка средства криптографической защиты информации'");
		Элементы.ДекорацияКриптопровайдерУстановленПояснение.Видимость = Ложь;
	Иначе
		Элементы.ДекорацияКриптопровайдерУстановлен.Заголовок = НСтр("ru = 'Не установлено средство криптографической защиты информации'");
		Элементы.ДекорацияКриптопровайдерУстановленПояснение.Видимость = Истина;
	КонецЕсли;
	
	Если СостояниеУстановкиРасширенияРаботыС1СПредприятием = 2 Тогда
		Элементы.ДекорацияРасширение1СУстановлено.Заголовок = НСтр("ru = 'Расширение для работы с 1С:Предприятием успешно установлено'");
	ИначеЕсли СостояниеУстановкиРасширенияРаботыС1СПредприятием = 1 Тогда
		Элементы.ДекорацияРасширение1СУстановлено.Заголовок = НСтр("ru = 'Выполняется установка расширения для работы с 1С:Предприятием'");
	Иначе
		Элементы.ДекорацияРасширение1СУстановлено.Заголовок = НСтр("ru = 'Расширение для работы с 1С:Предприятием не установлено'");
	КонецЕсли;
	
	Если СостояниеУстановкиРасширенияРаботыСКриптографией = 2 Тогда
		Элементы.ДекорацияРасширениеЭПУстановлено.Заголовок = НСтр("ru = 'Расширение для работы с криптографией успешно установлено'");
	ИначеЕсли СостояниеУстановкиРасширенияРаботыСКриптографией = 1 Тогда
		Элементы.ДекорацияРасширениеЭПУстановлено.Заголовок = НСтр("ru = 'Выполняется установка расширения для работы с криптографией'");
	Иначе
		Элементы.ДекорацияРасширениеЭПУстановлено.Заголовок = НСтр("ru = 'Расширение для работы с криптографией не установлено'");
	КонецЕсли;
	
	Если СостояниеУстановкиКомпонентыExtraCryptoAPI = 2 Тогда
		Элементы.ДекорацияКомпонентаУстановлена.Заголовок = НСтр("ru = 'Компонента ExtraCryptoAPI успешно установлена'");
	ИначеЕсли СостояниеУстановкиКомпонентыExtraCryptoAPI = 1 Тогда
		Элементы.ДекорацияКомпонентаУстановлена.Заголовок = НСтр("ru = 'Выполняется установка компоненты ExtraCryptoAPI'");
	Иначе
		Элементы.ДекорацияКомпонентаУстановлена.Заголовок = НСтр("ru = 'Компонента ExtraCryptoAPI не установлена'");
	КонецЕсли;
	
	Если СостояниеУстановкиРасширенияРаботыС1СПредприятием = 2
		И СостояниеУстановкиРасширенияРаботыСКриптографией = 2
		И СостояниеУстановкиКомпонентыExtraCryptoAPI = 2 Тогда
		
		Элементы.ГруппаУстановитьОдновременно.Видимость = Ложь;
		
		Если СостояниеУстановкиКриптопровайдера = 2 Тогда
			Элементы.ГруппаУстановкиШапка.Видимость = Ложь;
			Элементы.ГруппаПродолжитьРаботу.Видимость = Истина;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьПрограммуКриптографии()
	ЭлектроннаяПодписьСлужебныйКлиент.ОткрытьФормуУстановкиПрограммКриптопровайдеров(, ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ПослеУстановкиПрограммыКриптографии()
	
	СостояниеУстановкиКриптопровайдера = 2;
	УстановитьЗначениеДекорацийВЗависимостиОтСостоянияУстановкиКомпонент();
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеУстановкиРасширенияРаботыС1СПредприятием(Результат) Экспорт
	
	НачатьПодключениеРасширенияРаботыСФайлами(
		Новый ОписаниеОповещения("ПродолжитьУстановкуКомпонентПослеУстановкиРасширенияРаботыС1СПредприятием", ЭтотОбъект));
	
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьУстановкуКомпонентПослеУстановкиРасширенияРаботыС1СПредприятием(Подключено, Контекст = Неопределено) Экспорт
	
	Если Подключено = Истина Тогда
		СостояниеУстановкиРасширенияРаботыС1СПредприятием = 2;
		ПослеУстановкиКомпонентыИРасширений();
	Иначе
		ПодключитьОбработчикОжидания("ОжидатьУстановкуРасширенияРаботыС1СПредприятием", 3);
	КонецЕсли;
	
	Если СостояниеУстановкиРасширенияРаботыСКриптографией = 2 Тогда
		ПродолжитьУстановкуКомпонентПослеУстановкиРасширенияРаботыСКриптографией(Истина);
	Иначе
		СостояниеУстановкиРасширенияРаботыСКриптографией = 1;
		УстановитьЗначениеДекорацийВЗависимостиОтСостоянияУстановкиКомпонент();
		НачатьУстановкуРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
			"ПослеУстановкиРасширенияРаботыСКриптографией", ЭтотОбъект));
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Асинх Процедура ОжидатьУстановкуРасширенияРаботыС1СПредприятием()
	
	Подключено = Ждать ПодключитьРасширениеРаботыСФайламиАсинх();
	Если Подключено Тогда
		ОтключитьОбработчикОжидания("ОжидатьУстановкуРасширенияРаботыС1СПредприятием");
		СостояниеУстановкиРасширенияРаботыС1СПредприятием = 2;
		ПослеУстановкиКомпонентыИРасширений();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеУстановкиРасширенияРаботыСКриптографией(Контекст) Экспорт
	
	НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
		"ПродолжитьУстановкуКомпонентПослеУстановкиРасширенияРаботыСКриптографией", ЭтотОбъект, Контекст));
	
КонецПроцедуры

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

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

&НаКлиенте
Асинх Процедура ОжидатьУстановкуРасширенияРаботыСКриптографией()
	
	Подключено = Ждать ПодключитьРасширениеРаботыСКриптографиейАсинх();
	Если Подключено Тогда
		ОтключитьОбработчикОжидания("ОжидатьУстановкуРасширенияРаботыСКриптографией");
		СостояниеУстановкиРасширенияРаботыСКриптографией = 2;
		ПослеУстановкиКомпонентыИРасширений();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

#КонецОбласти