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

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

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

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
	
	Если ДанныеЗаполнения = Неопределено Тогда
		Программа = Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПустаяСсылка();
	КонецЕсли;	
	
КонецПроцедуры

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

		ОписаниеПрограммы = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Программа,
			"ЭтоВстроенныйКриптопровайдер, АлгоритмПодписи, АлгоритмХеширования");

		Если Не ОписаниеПрограммы.ЭтоВстроенныйКриптопровайдер Тогда
			ДвоичныеДанные = ДанныеСертификата.Получить();
			Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда

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

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

				Если Результат <> Истина Тогда

					ВызватьИсключение Результат;

				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
	
КонецПроцедуры

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

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли