Документооборот с контролирующими органами / Мастер восстановить облачную подпись / Модуль формы

файл
#Область ОписаниеПеременных

&НаКлиенте
Перем ПрограммноеЗакрытие;

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

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

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

	Элементы.ПодтверждениеПароль.ПодсказкаВвода = "";
	Элементы.Подсказка.Видимость = ЭтоБыстрыйСтарт;
	
	Если ЭтоБыстрыйСтарт Тогда
		Заголовок = НСтр("ru = 'Авторизация в DSS'");
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ПодтверждениеПриИзменении(Элемент)

	МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент");
	МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеПриИзменении(ЭтотОбъект, Элемент, Неопределено, "");
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура Подключаемый_ПодтверждениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	МодульСервисКриптографииDSSПодтверждениеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSПодтверждениеКлиент");
	МодульСервисКриптографииDSSПодтверждениеКлиент.ПодтверждениеНачалоВыбора(ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура Восстановить(Команда)

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

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

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

&НаСервере
Процедура ПодготовитьНачальнуюФорму()
	
	ПараметрыОперации = Новый Структура;
	ПараметрыОперации.Вставить("ТипПодтверждения", "Аутентификация");
	
	ЭтотОбъект.НастройкиПользователя.Пароль = ПарольЛогина;
	МодульСервисКриптографииDSSПодтверждениеСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSПодтверждениеСервер");
	МодульСервисКриптографииDSSПодтверждениеСервер.ДополнитьПроизвольноеПодтверждение(ЭтотОбъект,
			НСтр("ru = 'Подтверждение учетной записи'", ОбщегоНазначения.КодОсновногоЯзыка()), 
			"Первичный_ДвухФакторная", 
			"",
			ЛогинВосстановления,
			ПараметрыОперации);
	
КонецПроцедуры

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

	Если Параметры.ПервичноеЗаявление Тогда
		Элементы.ГруппаКоманды.ГоризонтальноеПоложениеПодчиненных = ГоризонтальноеПоложениеЭлемента.Лево;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗакрытьФорму(РезультатВыполнения)
	
	ПрограммноеЗакрытие = Истина;
	Закрыть(РезультатВыполнения);
	
КонецПроцедуры

&НаКлиенте
Функция ПроверкаВыбранныхНастроек()
	
	Результат = ПроверкаВыбранныхНастроекСервере();
	
	Возврат Результат;
	
КонецФункции

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

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

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

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

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

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

Связанные материалы