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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если ЗначениеЗаполнено(Параметры.Токен) Тогда
		
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры.Токен,,"Сертификаты");
		
		Если ЭтоСервер Тогда
			ШаблонЗаголовка = НСтр("ru = '%1 на сервере'");
		Иначе
			ШаблонЗаголовка = НСтр("ru = '%1 на компьютере'");
		КонецЕсли;
		
		Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			ШаблонЗаголовка, Параметры.Токен.Представление);
		
	КонецЕсли;

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ПодключитьОбработчикОжидания("ЗаполнитьСписокСертификатов", 0.1, Истина);
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура Обновить(Команда)
	ЗаполнитьСписокСертификатов()
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСписокСертификатовНаСервере(СертификатыСтрокой, Ошибки)
	
	Сертификаты.Очистить();
	
	Для Каждого Сертификат Из СертификатыСтрокой Цикл
		
		Сертификат = СтрЗаменить(Сертификат, "-----BEGIN CERTIFICATE-----", "");
		Сертификат = СтрЗаменить(Сертификат, "-----END CERTIFICATE-----", "");
		Сертификат = СтрЗаменить(Сертификат, Символы.ПС, "");
		
		Попытка
			ДанныеСертификата = Base64Значение(Сертификат);
		Исключение
			Ошибки.Добавить(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
			Продолжить;
		КонецПопытки;

		Если ТипЗнч(ДанныеСертификата) <> Тип("ДвоичныеДанные") Тогда
			Продолжить;
		КонецЕсли;

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

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

&НаСервереБезКонтекста
Функция СсылкаНаСертификат(Отпечаток)
    Возврат ЭлектроннаяПодпись.СсылкаНаСертификат(Отпечаток);
КонецФункции

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