Сертификаты ключей электронной подписи и шифрования / Проверка сертификата / Модуль формы

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

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

&НаКлиенте
Перем ВнутренниеДанные, КлиентскиеПараметры, СвойстваПароля, ПараметрыВыполненияКонтекста;

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ЭлектроннаяПодписьСлужебный.НастроитьПояснениеВводаПароля(
		ЭтотОбъект, , Элементы.ПояснениеУсиленногоПароля.Имя);
	
	Сертификат = Параметры.Сертификат;
	ПроверкаПриВыборе = Параметры.ПроверкаПриВыборе;
	
	Если ЗначениеЗаполнено(Параметры.ЗаголовокФормы) Тогда
		АвтоЗаголовок = Ложь;
		Заголовок = Параметры.ЗаголовокФормы;
	КонецЕсли;
	
	Если ПроверкаПриВыборе Тогда
		Элементы.ФормаЗакрыть.Заголовок = НСтр("ru = 'Отмена'");
		Элементы.ФормаПроверить.Заголовок = НСтр("ru = 'Проверить и продолжить'");
	КонецЕсли;
	
	ВводитьПароль = Истина;
	СтандартныеПроверки = Истина;
	ОбъединятьРезультаты = ?(Параметры.ОбъединятьРезультаты = "ОбъединятьПоИ"
		Или Параметры.ОбъединятьРезультаты = "ОбъединятьПоИли",
		Параметры.ОбъединятьРезультаты, "НеОбъединять");
	
	Если Параметры.РезультатПроверки <> Неопределено Тогда
		ПроверкаВыполнена = Истина;
		ПроверкиНаКлиенте = Параметры.РезультатПроверки.ПроверкиНаКлиенте;
		ПроверкиНаСервере = Параметры.РезультатПроверки.ПроверкиНаСервере;
		ДополнительныеДанныеПроверокНаСервере = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
			Параметры.РезультатПроверки, "ДополнительныеДанныеПроверокНаСервере", Новый Структура);
		ДополнительныеДанныеПроверокНаКлиенте = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
			Параметры.РезультатПроверки, "ДополнительныеДанныеПроверокНаКлиенте", Новый Структура);
	КонецЕсли;
	
	Проверки = Новый ТаблицаЗначений;
	Проверки.Колонки.Добавить("Имя",           Новый ОписаниеТипов("Строка"));
	Проверки.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
	Проверки.Колонки.Добавить("Подсказка",     Новый ОписаниеТипов("Строка"));
	
	ЭлектроннаяПодписьПереопределяемый.ПриСозданииФормыПроверкаСертификата(
		Параметры.Сертификат, Проверки, Параметры.ПараметрыДополнительныхПроверок,
		СтандартныеПроверки, ВводитьПароль);
	Если Не СтандартныеПроверки И Проверки.Количество() = 0 Тогда
		ВызватьИсключение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Для проверки сертификата отключены стандартные проверки,
			|при этом дополнительных проверок не указано в %1.'"), 
			"ЭлектроннаяПодписьПереопределяемый.ПриСозданииФормыПроверкаСертификата"), 
			КатегорияОшибки.ОшибкаКонфигурации);
	КонецЕсли;
		
	Если ЗначениеЗаполнено(Параметры.ТипПодписи) Тогда
		ТипПодписи = Параметры.ТипПодписи;
	КонецЕсли;
	ИгнорироватьПроверкуВСпискеОтозванныхСертификатов = Параметры.ИгнорироватьПроверкуВСпискеОтозванныхСертификатов;
	ВыполнятьПроверкуУдостоверяющегоЦентра = Параметры.ВыполнятьПроверкуУдостоверяющегоЦентра;
	Если ПустаяСтрока(ВыполнятьПроверкуУдостоверяющегоЦентра) Тогда
		ВыполнятьПроверкуУдостоверяющегоЦентра = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПроверятьКвалифицированные();
	КонецЕсли;
	
	Элементы.ГруппаСтраницы.Видимость = ПроверкиНаКлиенте <> Неопределено Или ПроверкиНаСервере <> Неопределено;
	ПроверкиУспешны = Истина;
	
	Для каждого Проверка Из Проверки Цикл
		
		Группа = ГруппаФормыБезОтображения("Группа" + Проверка.Имя, Элементы.ГруппаДополнительныеПроверки);
		
		Группа.Видимость = Ложь;
		
		ДобавитьКартинку(Проверка.Имя + "НаКлиентеКартинка", Группа);
		ДобавитьКартинку(Проверка.Имя + "НаСервереКартинка", Группа);
		
		ГруппаРезультатИРешение = ГруппаФормыБезОтображения(Проверка.Имя + "РезультатИРешение", Группа,
			ГруппировкаПодчиненныхЭлементовФормы.Вертикальная);
			
		Надпись = Элементы.Добавить(Проверка.Имя + "Надпись", Тип("ДекорацияФормы"), ГруппаРезультатИРешение);
		Надпись.Заголовок = Проверка.Представление;
		Надпись.РасширеннаяПодсказка.Заголовок = Проверка.Подсказка;
		Надпись.УстановитьДействие("Нажатие", "Подключаемый_НадписьНажатие");
		
		ДобавитьЭлементыОписанияОшибок(Проверка.Имя, ГруппаРезультатИРешение);
		ДобавитьЭлементыОписанияОшибок(Проверка.Имя, ГруппаРезультатИРешение, Истина);
		
		ЗаполнитьЗначенияСвойств(ДополнительныеПроверки.Добавить(), Проверка);
		
		Если ПроверкиНаКлиенте <> Неопределено Тогда
			ВывестиРезультатПроверки(Проверка.Имя);
		КонецЕсли;
		
		Если ПроверкиНаСервере <> Неопределено Тогда
			ВывестиРезультатПроверки(Проверка.Имя, Истина);
		КонецЕсли;
		
	КонецЦикла;
	
	Если Не СтандартныеПроверки Тогда
		
		Элементы.ГруппаОбщиеПроверки.Видимость = Ложь;
		Элементы.ГруппаПроверкиОпераций.Видимость = Ложь;
		СтандартныеПодсистемыСервер.УстановитьКлючНазначенияФормы(ЭтотОбъект, "НестандартныеПроверки");
		
	Иначе
		
		ИменаГруппПоНазваниямПроверок = ИменаГруппПоНазваниямПроверок(Элементы);
		
		Для Каждого Проверка Из СтандартныеПроверки() Цикл
			
			Элементы[ИменаГруппПоНазваниямПроверок[Проверка]].Видимость = Ложь;
			Элементы[Проверка + "ОшибкаКлиент"].Видимость = Ложь;
			Элементы[Проверка + "РешениеКлиентНадпись"].Видимость = Ложь;
			Элементы[Проверка + "ОшибкаСервер"].Видимость = Ложь;
			Элементы[Проверка + "РешениеСерверНадпись"].Видимость = Ложь;
			Элементы[Проверка + "Надпись"].Заголовок = СтандартныйЗаголовокЭлемента(Проверка + "Надпись", ТипПодписи);
			
			Если ПроверкиНаКлиенте <> Неопределено Тогда
				ВывестиРезультатПроверки(Проверка);
			КонецЕсли;
			
			Если ПроверкиНаСервере <> Неопределено Тогда
				ВывестиРезультатПроверки(Проверка, Истина);
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЕсли;
	
	ВидимостьСтраниц(ЭтотОбъект);
	
	СвойстваСертификата = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Сертификат,
		"ДанныеСертификата, Программа, ВводитьПарольВПрограммеЭлектроннойПодписи, Отпечаток, Отозван");
		
	Отозван = СвойстваСертификата.Отозван;
	
	Программа = СвойстваСертификата.Программа;
	АдресСертификата = ПоместитьВоВременноеХранилище(
		СвойстваСертификата.ДанныеСертификата.Получить(), УникальныйИдентификатор);
	СертификатВводитьПарольВПрограммеЭлектроннойПодписи = СвойстваСертификата.ВводитьПарольВПрограммеЭлектроннойПодписи;
	
	ЭтоУчетнаяЗаписьСервиса = ТипЗнч(Программа) = ЭлектроннаяПодписьСлужебный.ТипПрограммыСервисаПодписи()
		И ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи();
	ЭтоВстроенныйКриптопровайдер = Программа = ЭлектроннаяПодписьСлужебный.ВстроенныйКриптопровайдер();
	
	ЕстьУчетнаяЗаписьСервиса = ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи()
		И ЭлектроннаяПодписьСлужебныйВызовСервера.НастроенСервисОблачнойПодписи();
	ЕстьВстроенныйКриптопровайдер = ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса();
		
	Если ЭтоУчетнаяЗаписьСервиса Тогда
		МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный");
		МодульСервисКриптографииDSSКлиентСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSКлиентСервер");
		ДанныеСертификата = МодульСервисКриптографииDSSСлужебный.ПолучитьДанныеСертификатаПоОтпечатку(
								МодульСервисКриптографииDSSКлиентСервер.ТрансформироватьОтпечаток(СвойстваСертификата.Отпечаток));
		Если ДанныеСертификата = Неопределено ИЛИ ДанныеСертификата.УчетнаяЗапись <> Программа Тогда
			ВызватьИсключение МодульСервисКриптографииDSSСлужебный.ПолучитьОписаниеОшибки(Неопределено, "ЧужойСертификат");
		КонецЕсли;
		
		МодульСервисКриптографииDSSПодтверждениеСервер = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSПодтверждениеСервер");
		МодульСервисКриптографииDSSПодтверждениеСервер.ПодготовитьГруппуПодтверждения(ЭтотОбъект, "Проверка", "", "");
		МодульСервисКриптографииDSSПодтверждениеСервер.ПодтверждениеПриИзмененииСертификата(ЭтотОбъект, Сертификат);
		
	ИначеЕсли ЭтоВстроенныйКриптопровайдер Или (Не СтандартныеПроверки И Не ВводитьПароль) Тогда
		Элементы.ГруппаВводаПароля.Видимость = Ложь;
	КонецЕсли;
	
	ОбновитьВидимостьНаСервере();
	
	Если СтандартныеПроверки Тогда
		ИмяПервойПроверки = ?(Элементы.ГруппаЗаконныйСертификат.Видимость,
			"ЗаконныйСертификат", "НаличиеСертификата");
	КонецЕсли;
	
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.ГруппаТребуетсяПомощь.Поведение = ПоведениеОбычнойГруппы.Свертываемая;
	КонецЕсли;
	
	// СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку") Тогда
		
		МодульОбращенияВТехническуюПоддержкуСлужебный = ОбщегоНазначения.ОбщийМодуль(
			"ОбращенияВТехническуюПоддержкуСлужебный");
		
		МодульОбращенияВТехническуюПоддержкуСлужебный.ПриСозданииНаСервере(ЭтотОбъект);
		
	Иначе
		Элементы.ГруппаТребуетсяПомощь.Видимость = Ложь;
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку
	
	СтандартныеПодсистемыСервер.СброситьРазмерыИПоложениеОкна(ЭтотОбъект);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ЗапомнитьПарольПриИзменении(Элемент)
	
	ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
		ВнутренниеДанные, СвойстваПароля, Новый Структура("ПриИзмененииРеквизитаЗапомнитьПароль", Истина));
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура ВопросВПоддержку(Команда)
	
	ВыгрузитьТехническуюИнформацию(Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ИнформацияДляОтправкиВПоддержку(Команда)
	
	Элементы.ГруппаТребуетсяПомощь.Скрыть();
	ВыгрузитьТехническуюИнформацию(Истина);
	
КонецПроцедуры

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ИменаГруппПоНазваниямПроверок(ЭлементыФормы)
	
	ИменаГруппПоНазваниямПроверок = Новый Соответствие;
		
	ИменаГруппПоНазваниямПроверок.Вставить("ЗаконныйСертификат", ЭлементыФормы.ГруппаЗаконныйСертификат.Имя);
	ИменаГруппПоНазваниямПроверок.Вставить("НаличиеСертификата", ЭлементыФормы.ГруппаНаличиеСертификата.Имя);
	ИменаГруппПоНазваниямПроверок.Вставить("ДанныеСертификата",  ЭлементыФормы.ГруппаДанныеСертификата.Имя);
	ИменаГруппПоНазваниямПроверок.Вставить("НаличиеПрограммы",   ЭлементыФормы.ГруппаНаличиеПрограммы.Имя);
	ИменаГруппПоНазваниямПроверок.Вставить("Подписание",         ЭлементыФормы.ГруппаПодписание.Имя);
	ИменаГруппПоНазваниямПроверок.Вставить("Шифрование",         ЭлементыФормы.ГруппаШифрование.Имя);
	ИменаГруппПоНазваниямПроверок.Вставить("Расшифровка",        ЭлементыФормы.ГруппаРасшифровка.Имя);
	ИменаГруппПоНазваниямПроверок.Вставить("ПроверкаПодписи",    ЭлементыФормы.ГруппаПроверкаПодписи.Имя);
	
	Возврат ИменаГруппПоНазваниямПроверок;
	
КонецФункции

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

// Продолжение процедуры Проверить.
&НаКлиенте
Процедура ПроверитьЗавершение(Неопределен, Контекст) Экспорт
		
	Элементы.ФормаПроверить.Доступность = Истина;
	
	ВидимостьСтраниц(ЭтотОбъект);
	
	Если СертификатыМетокВремени.Количество() = 0 Тогда
		Элементы.ДекорацияСертификатМеткиВремени.Видимость = Ложь;
	Иначе
		Массив = Новый Массив;
		Для Каждого СертификатМеткиВремени Из СертификатыМетокВремени Цикл
			Если Не СертификатМеткиВремени.ПолученНаКлиенте Тогда
				Массив.Добавить(СтроковыеФункцииКлиент.ФорматированнаяСтрока(
							НСтр("ru = 'Сертификат метки времени, полученной на сервере: <a href = %1>%2</a>.'"),
						СертификатМеткиВремени.АдресСертификата, СертификатМеткиВремени.Представление));
			ИначеЕсли Не СертификатМеткиВремени.ПолученНаСервере Тогда
				Массив.Добавить(СтроковыеФункцииКлиент.ФорматированнаяСтрока(
							НСтр("ru = 'Сертификат метки времени, полученной на компьютере: <a href = %1>%2</a>.'"),
						СертификатМеткиВремени.АдресСертификата, СертификатМеткиВремени.Представление));
			Иначе
				Массив.Добавить(СтроковыеФункцииКлиент.ФорматированнаяСтрока(
							НСтр("ru = 'Сертификат полученной метки времени: <a href = %1>%2</a>.'"),
						СертификатМеткиВремени.АдресСертификата, СертификатМеткиВремени.Представление));
			КонецЕсли;
		КонецЦикла;
		Элементы.ДекорацияСертификатМеткиВремени.Заголовок = Новый ФорматированнаяСтрока(Массив);
		Элементы.ДекорацияСертификатМеткиВремени.Видимость = Истина;
	КонецЕсли;
	
	Если Не ПроверкаПриВыборе Тогда
		Возврат;
	КонецЕсли;
	
	Если КлиентскиеПараметры.Результат.ПроверкиПройдены Тогда
		Закрыть(Истина);
	Иначе
		ПоказатьПредупреждениеОНевозможностиПродолжения();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ВидимостьСтраниц(Форма)
	Если Форма.ПроверкиУспешны = Истина Тогда
		Форма.Элементы.ГруппаСтраницы.ТекущаяСтраница = Форма.Элементы.СтраницаПроверкиУспешны;
		Форма.Элементы.ФормаЗакрыть.КнопкаПоУмолчанию = Истина;
	Иначе
		Форма.Элементы.ГруппаСтраницы.ТекущаяСтраница = Форма.Элементы.СтраницаПроверки;
	КонецЕсли;
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПриИзмененияИспользованияПодписанияИлиШифрования()
	
	ОбновитьВидимостьНаСервере()
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьПредупреждениеОНевозможностиПродолжения()
	
	ПоказатьПредупреждение(,
		НСтр("ru = 'Не удалось продолжить, т.к. пройдены не все требуемые проверки.'"));
	
КонецПроцедуры

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

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

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

#Область ПроверкаНаКлиенте

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

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

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

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеОшибкиИнициализацииСертификата(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
	
	СтандартнаяОбработка = Ложь;
	
	ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
	УстановитьЭлемент(ЭтотОбъект, ИмяПервойПроверки, Ложь, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	ВыполнитьОбработкуОповещения(Контекст.Оповещение);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

		КонецЕсли;
		
		ПроверитьНаСторонеКлиентаПослеПодписания(ДанныеПодписи, Контекст);
		
	Иначе
		ПроверитьНаСторонеКлиентаПослеПодписания(Null, Контекст);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Асинх Процедура ПроверитьНаСторонеКлиентаПослеПроверкиПодписи(Сертификат, Контекст) Экспорт
	
	Если Сертификат <> Null Тогда
		Если ТипЗнч(Сертификат) = Тип("Строка") Тогда
			ОписаниеОшибки = Сертификат;
		Иначе
			ОписаниеОшибки = "";
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(ОписаниеОшибки) И ЗначениеЗаполнено(ТипПодписи) И ТипПодписи
			<> ПредопределенноеЗначение(
		"Перечисление.ТипыПодписиКриптографии.БазоваяCAdESBES") И ТипПодписи <> ПредопределенноеЗначение(
		"Перечисление.ТипыПодписиКриптографии.ОбычнаяCMS") Тогда

			Попытка
				СвойстваПодписи = Ждать ЭлектроннаяПодписьСлужебныйКлиент.СвойстваПодписиЧтениеМенеджеромКриптографии(
					Контекст.ДанныеПодписи, Контекст.МенеджерКриптографии, Истина);
			Исключение
				ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
			КонецПопытки;

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

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

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

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

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

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

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

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

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

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаДополнительныеПроверки(Контекст)
	
	// Дополнительные проверки.
	Контекст.Вставить("Индекс", -1);
	
	ПроверитьНаСторонеКлиентаЦиклНачало(Контекст);
	
КонецПроцедуры

// Продолжение процедуры ПроверитьНаСторонеКлиента.
&НаКлиенте
Процедура ПроверитьНаСторонеКлиентаПослеДополнительнойПроверки(Неопределен, Контекст) Экспорт
	
	ПараметрыВыполнения = ПараметрыВыполненияКонтекста.Получить(Контекст);
	ПараметрыВыполненияКонтекста.Удалить(Контекст);
	
	УстановитьЭлемент(ЭтотОбъект, Контекст.ЭлементСписка.Имя, Ложь,
		ПараметрыВыполнения.ОписаниеОшибки,
		ПараметрыВыполнения.ЭтоПредупреждение <> Истина,
		ОбъединятьРезультаты);
	
	ПроверитьНаСторонеКлиентаЦиклНачало(Контекст);
	
КонецПроцедуры

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

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

#Область ПроверкаНаКлиентеОблачнаяПодпись

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

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

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

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

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

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

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

&НаКлиенте
Функция ОперацияАктивна()
	
	Результат = Открыта();
	Возврат Результат;
	
КонецФункции	

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

#Область ПроверкаНаСервере

&НаСервере
Процедура ПроверитьНаСторонеСервера(Знач ЗначениеПароля)
	
	ПроверкаВыполнена = Истина;
	
	ИмяСервера = ИмяКомпьютера();
	
	ДанныеСертификата = ПолучитьИзВременногоХранилища(АдресСертификата);
	
	Попытка
		СертификатКриптографии = Новый СертификатКриптографии(ДанныеСертификата);
	Исключение
		УстановитьЭлемент(ЭтотОбъект, ИмяПервойПроверки, Истина,
			ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), Истина, ОбъединятьРезультаты);
		Возврат;
	КонецПопытки;
	
	// Законный сертификат.
	ПроверитьЗаконныйСертификатНаСервере(СертификатКриптографии);
	
	// Наличие сертификата в личном списке.
	Результат = Новый Структура;
	ЭлектроннаяПодписьСлужебный.ПолучитьСертификатПоОтпечатку(
		Base64Строка(СертификатКриптографии.Отпечаток), Истина, Ложь, , Результат);
	
	ОписаниеОшибки = "";
	Если ЗначениеЗаполнено(Результат) Тогда
		ОписаниеОшибки = Результат.ОписаниеОшибки + Символы.ПС + Символы.ПС
			+ НСтр("ru = 'Проверка подписания, созданной подписи и расшифровки не могут быть выполнены.'");
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "НаличиеСертификата", Истина, ОписаниеОшибки, , ОбъединятьРезультаты);
	
	// Проверка данных сертификата.
	ПараметрыСоздания = ЭлектроннаяПодписьСлужебный.ПараметрыСозданияМенеджераКриптографии();
	Если ЭлектроннаяПодписьСлужебныйКлиентСервер.ДоступныДополнительныеСвойстваСертификата() Тогда
		ПараметрыСоздания.АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПредставлениеАлгоритмаПодписи(
			СертификатКриптографии.АлгоритмОткрытогоКлюча, Истина, Ложь);
	Иначе
		ПараметрыСоздания.АлгоритмПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(ДанныеСертификата);
	КонецЕсли;
	
	МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии(
		"ПроверкаСертификата", ПараметрыСоздания);
	
	ОписаниеОшибки = ПараметрыСоздания.ОписаниеОшибки;
	Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		ДополнительныеПараметрыПроверкиСертификата = 
			ЭлектроннаяПодписьСлужебный.ДополнительныеПараметрыПроверкиСертификата();
		ДополнительныеПараметрыПроверкиСертификата.ВыполнятьПроверкуУдостоверяющегоЦентра = Ложь;
		ЭлектроннаяПодписьСлужебный.ПроверитьСертификат(МенеджерКриптографии, СертификатКриптографии, ОписаниеОшибки,,ДополнительныеПараметрыПроверкиСертификата);
	КонецЕсли;
	
	УстановитьЭлемент(ЭтотОбъект, "ДанныеСертификата", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	// Наличие программы.
	Если ЗначениеЗаполнено(Программа) Тогда
		ПараметрыСоздания = ЭлектроннаяПодписьСлужебный.ПараметрыСозданияМенеджераКриптографии();
		ПараметрыСоздания.Программа = Программа;
		
		МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("ПроверкаСертификата", ПараметрыСоздания);
		ОписаниеОшибки = ПараметрыСоздания.ОписаниеОшибки;
	Иначе
		
		ПрограммаАвтоНаСервереРезультат = ЭлектроннаяПодписьСлужебный.ПрограммаПоСертификату(АдресСертификата);
		ПрограммаАвтоНаСервере = ПрограммаАвтоНаСервереРезультат.Программа;
		
		Если ПрограммаАвтоНаСервереРезультат.Программа = Неопределено Тогда
			ОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТекстОшибкиНеУдалосьОпределитьПрограмму(
				ПрограммаАвтоНаСервереРезультат.Ошибка);
			МенеджерКриптографии = Неопределено;
		Иначе
			ПараметрыСоздания = ЭлектроннаяПодписьСлужебный.ПараметрыСозданияМенеджераКриптографии();
			ПараметрыСоздания.Программа = ПрограммаАвтоНаСервере;
			МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("ПроверкаСертификата", ПараметрыСоздания);
			ОписаниеОшибки = ПараметрыСоздания.ОписаниеОшибки;
		КонецЕсли;
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		
		ОписаниеОшибки = ОписаниеОшибки + Символы.ПС + Символы.ПС
			+ НСтр("ru = 'Проверка подписания, созданной подписи, шифрования и
			|расшифровки не могут быть выполнены.'");
		
	КонецЕсли;
	УстановитьЭлемент(ЭтотОбъект, "НаличиеПрограммы", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	
	Если МенеджерКриптографии = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ЗначениеПароля;
	
	ОписаниеОшибки = "";
	
	Если Отозван Тогда
		ОписаниеОшибки = ЭлектроннаяПодписьСлужебный.ОшибкаСертификатПомеченКакОтозванный();
		УстановитьЭлемент(ЭтотОбъект, "Подписание", Истина, ОписаниеОшибки, Истина, ОбъединятьРезультаты);
	Иначе
		Если ВыполнятьПроверкуУдостоверяющегоЦентра <> ЭлектроннаяПодписьСлужебныйКлиентСервер.НеПроверятьСертификат() Тогда
			ПараметрыПроверки = Новый Структура;
			ПараметрыПроверки.Вставить("ЭтоПроверкаПодписи", Ложь);
			ПараметрыПроверки.Вставить("ПроверятьСертификат", ВыполнятьПроверкуУдостоверяющегоЦентра);
			
			РезультатПроверкиУЦ = ЭлектроннаяПодписьСлужебный.РезультатПроверкиУдостоверяющегоЦентраСертификата(
				СертификатКриптографии,, ПараметрыПроверки);
			Если Не РезультатПроверкиУЦ.Действует Тогда
				
				Если  ВыполнятьПроверкуУдостоверяющегоЦентра = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТолькоКвалифицированные() Тогда
					ПодписаниеРазрешено = Ложь;
				Иначе
					ПодписаниеРазрешено = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
						Сертификат, "РазрешитьПодписание", Неопределено);
				КонецЕсли;
				
				Если ПодписаниеРазрешено = Неопределено Или Не ПодписаниеРазрешено Тогда
					ОписаниеОшибки = РезультатПроверкиУЦ.Предупреждение.ТекстОшибки;
					УстановитьЭлемент(ЭтотОбъект, "Подписание", Истина, РезультатПроверкиУЦ.Предупреждение, Истина,
						ОбъединятьРезультаты);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если ПроверкиНаСервере.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		ДанныеПодписи = ПроверитьПодписаниеНаСервере(МенеджерКриптографии, ДанныеСертификата, СертификатКриптографии, ОписаниеОшибки);
	КонецЕсли;
	
	Если ПроверкиНаСервере.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		ПроверитьПодписьНаСервере(МенеджерКриптографии, ДанныеСертификата, ДанныеПодписи);
	КонецЕсли;
	
	ОписаниеОшибки = "";
	ЗашифрованныеДанные = ПроверитьШифрованиеНаСервере(МенеджерКриптографии, ДанныеСертификата, СертификатКриптографии, ОписаниеОшибки); 
	
	Если ПроверкиНаСервере.НаличиеСертификата = Истина И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		ПроверитьРасшифрованиеНаСервере(МенеджерКриптографии, ЗашифрованныеДанные);
	КонецЕсли;
	
	ПроверитьНаСторонеСервераДополнительныеПроверки(ЗначениеПароля, МенеджерКриптографии);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

#Область УправлениеЭлементамиФормы

&НаСервере
Процедура ДобавитьКартинку(ИмяЭлемента, Родитель, Картинка = Неопределено)
	
	Декорация = Элементы.Добавить(ИмяЭлемента, Тип("ДекорацияФормы"), Родитель);
	Декорация.Вид = ВидДекорацииФормы.Картинка;
	Декорация.Ширина = 2;
	Декорация.Высота = 1;
	Декорация.Картинка = ?(Картинка = Неопределено, Новый Картинка, Картинка);
	Декорация.РазмерКартинки = РазмерКартинки.АвтоРазмер;
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьЭлементыОписанияОшибок(ИмяПроверки, Родитель, НаСервере = Ложь)
	
	ГруппаОшибкаКлиент = ГруппаФормыБезОтображения(
			ИмяПроверки + ?(НаСервере, "ОшибкаСервер", "ОшибкаКлиент"), Родитель,
			ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда);
	ГруппаОшибкаКлиент.Видимость = Ложь;
		
	ДобавитьКартинку(ИмяПроверки + ?(НаСервере, "ОшибкаСерверКартинка", "ОшибкаКлиентКартинка"),
		ГруппаОшибкаКлиент, БиблиотекаКартинок[?(НаСервере, "КомпьютерСервер", "КомпьютерКлиент")]);
	Надпись = Элементы.Добавить(ИмяПроверки + ?(НаСервере, "ОшибкаСерверНадпись", "ОшибкаКлиентНадпись"),
		Тип("ДекорацияФормы"), ГруппаОшибкаКлиент);
	Надпись.ЦветТекста = ЦветаСтиля.ПоясняющийТекст;
	Надпись = Элементы.Добавить(ИмяПроверки + ?(НаСервере, "РешениеСерверНадпись", "РешениеКлиентНадпись"),
		Тип("ДекорацияФормы"), Родитель);
	Надпись.ЦветТекста = ЦветаСтиля.ПоясняющийТекст;
	Надпись.УстановитьДействие("ОбработкаНавигационнойСсылки", "Подключаемый_НадписьОбработкаНавигационнойСсылки");
	
КонецПроцедуры

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

&НаСервере
Процедура ОбновитьВидимостьНаСервере()
	
	ОперацииНаСервере = (ЭлектроннаяПодпись.ПроверятьЭлектронныеПодписиНаСервере()
		Или ЭлектроннаяПодпись.СоздаватьЭлектронныеПодписиНаСервере());
		
	ПроверятьЭлектронныеПодписиНаСервере = Константы.ПроверятьЭлектронныеПодписиНаСервере.Получить();
		
	ПроверкаВСервисе = (ЭтоВстроенныйКриптопровайдер Или ЭтоУчетнаяЗаписьСервиса 
		Или ПроверятьЭлектронныеПодписиНаСервере И (ЕстьУчетнаяЗаписьСервиса Или ЕстьВстроенныйКриптопровайдер));
		
	ВидимостьПроверкиНаСервере = ОперацииНаСервере Или ПроверкаВСервисе;
	ВидимостьКолонкиНаСервере = ВидимостьПроверкиНаСервере И ОбъединятьРезультаты <> "ОбъединятьПоИ" И ОбъединятьРезультаты <> "ОбъединятьПоИли";
	
	Элементы.ГруппаШапка.Видимость = ВидимостьПроверкиНаСервере;
	
	Для Каждого Проверка Из СтандартныеПроверки() Цикл
		Элементы[Проверка + "ОшибкаКлиентКартинка"].Видимость = ВидимостьПроверкиНаСервере;
		Элементы[Проверка + "НаСервереКартинка"].Видимость = ВидимостьКолонкиНаСервере;
	КонецЦикла;
	
	Для каждого Проверка Из ДополнительныеПроверки Цикл
		Элементы[Проверка.Имя + "ОшибкаКлиентКартинка"].Видимость = ВидимостьПроверкиНаСервере;
		Элементы[Проверка.Имя + "НаСервереКартинка"].Видимость = ВидимостьКолонкиНаСервере;
	КонецЦикла;
	
	Элементы.ПроверкиНаСервереКартинка.Видимость = ВидимостьКолонкиНаСервере;
	Элементы.ПроверкиНаКлиентеКартинка.Видимость = ВидимостьКолонкиНаСервере;
	
КонецПроцедуры

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

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

	Проверки.Вставить(ИмяСвойстваОшибка, ?(ОписаниеОшибки = Неопределено, "", ОписаниеОшибки));
		
	ИмяГруппыОшибкаСервер = Действие + "ОшибкаСервер"; 
	ИмяГруппыОшибкаКлиент = Действие + "ОшибкаКлиент"; 
	ИмяЭлементаНадписьОшибкаСервер = Действие + "ОшибкаСерверНадпись"; 
	ИмяЭлементаНадписьОшибкаКлиент = Действие + "ОшибкаКлиентНадпись"; 
	ИмяЭлементаНадписьРешениеСервер = Действие + "РешениеСерверНадпись"; 
	ИмяЭлементаНадписьРешениеКлиент = Действие + "РешениеКлиентНадпись"; 

	Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
		
		Если РезультатПроверки Тогда
			Возврат;
		КонецЕсли;
		
		Форма.ПроверкиУспешны = Ложь;
		
		ГруппаОшибка = Форма.Элементы[?(НаСервере, ИмяГруппыОшибкаСервер, ИмяГруппыОшибкаКлиент)];
		ГруппаОшибка.Видимость = Истина;
		ЭлементКартинка.Картинка = ?(ЭтоОшибка,
			БиблиотекаКартинок.Предупреждение,
			БиблиотекаКартинок.ПроверкаСертификатаПредупреждение);
		
		ЭлементКартинка.Подсказка = ОписаниеОшибки;
		ЭлементНадпись.Гиперссылка = Истина;
		
		ЭлементНадписьОшибка = Форма.Элементы[?(НаСервере, ИмяЭлементаНадписьОшибкаСервер, ИмяЭлементаНадписьОшибкаКлиент)]; // ДекорацияФормы, РасширениеДекорацииФормыДляНадписи
		ЭлементНадписьОшибка.Заголовок = ОписаниеОшибки;
		
		ИмяНадписиРешение = ?(НаСервере, ИмяЭлементаНадписьРешениеСервер, ИмяЭлементаНадписьРешениеКлиент);
		ЭлементФормыНадписьРешение = Форма.Элементы[ИмяНадписиРешение];
			
		ИмяЭлементаНадписьОшибкаПодписание = "Подписание" + ?(НаСервере, "ОшибкаСерверНадпись", "ОшибкаКлиентНадпись"); 
		ЭлементФормыНадписьОшибкаПодписание = Форма.Элементы[ИмяЭлементаНадписьОшибкаПодписание]; 

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

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

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

	Массив = Новый Массив;
	Массив.Добавить(ОписаниеОшибки);
	Массив.Добавить(" ");

	Строка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = '<a href = %1>Поиск решения...</a>'"), НавигационнаяСсылка);

#Если Сервер Тогда
	Массив.Добавить(СтроковыеФункции.ФорматированнаяСтрока(Строка));
#Иначе
	Массив.Добавить(СтроковыеФункцииКлиент.ФорматированнаяСтрока(Строка));
#КонецЕсли
	Возврат Новый ФорматированнаяСтрока(Массив);
	
КонецФункции

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

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

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

&НаКлиенте
Процедура ДополнитьТекстОшибками(ТекстОшибок, Проверки, НаСервере = Ложь, ТемаСообщения = "")
	
	СоставПроверок = ЭтотОбъект[?(НаСервере, "ПроверкиНаСервере", "ПроверкиНаКлиенте")];
	Для Каждого Проверка Из Проверки Цикл
		
		Если СоставПроверок = Неопределено Тогда
			ТекстОшибок = ТекстОшибок + Проверка + ": "
				+ НСтр("ru = 'Не выполнялась, так как не требуется (не настроено)'") + Символы.ПС;
		Иначе
			
			РезультатПроверки = ?(СоставПроверок.Свойство(Проверка),
				ПроверкиНаКлиенте[Проверка], Неопределено);
			
			ТекстОшибкиПроверки = ?(СоставПроверок.Свойство(Проверка + "Ошибка"),
				СокрЛП(ПроверкиНаКлиенте[Проверка + "Ошибка"]), "");
				
			Если ПустаяСтрока(ТемаСообщения) И Не ПустаяСтрока(ТекстОшибкиПроверки) Тогда
				ТемаСообщения = ТекстОшибкиПроверки;
			КонецЕсли;
			
			ТекстОшибок = ТекстОшибок + Проверка + ": "
				+ ?(РезультатПроверки = Неопределено, НСтр("ru = 'Не выполнялась из-за предыдущих ошибок'"),
				Формат(РезультатПроверки, НСтр("ru = 'БЛ=Ошибка; БИ=Успех'")))
				+ ?(ПустаяСтрока(ТекстОшибкиПроверки), "", " """ + ТекстОшибкиПроверки + """") + Символы.ПС;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

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

&НаКлиентеНаСервереБезКонтекста
Функция СтандартныеПроверки()
	
	СтандартныеПроверки = Новый Массив;
	СтандартныеПроверки.Добавить("ЗаконныйСертификат");
	СтандартныеПроверки.Добавить("НаличиеСертификата");
	СтандартныеПроверки.Добавить("ДанныеСертификата");
	СтандартныеПроверки.Добавить("НаличиеПрограммы");
	СтандартныеПроверки.Добавить("Подписание");
	СтандартныеПроверки.Добавить("ПроверкаПодписи");
	СтандартныеПроверки.Добавить("Шифрование");
	СтандартныеПроверки.Добавить("Расшифровка");
	
	Возврат СтандартныеПроверки;
	
КонецФункции

&НаКлиенте
Функция ДополнительныеДанные(ИмяОшибки = Неопределено)
	
	ДополнительныеДанные = ЭлектроннаяПодписьСлужебныйКлиент.ДополнительныеДанныеДляКлассификатораОшибок();
	ДополнительныеДанные.Сертификат = Сертификат;
	ДополнительныеДанные.ДанныеСертификата = АдресСертификата;

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

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

		Если Не РезультатПроверкиУдостоверяющегоЦентраСертификата.Действует Тогда

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

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

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

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

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

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