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

файл
&НаКлиенте
Перем Хранилище Экспорт;

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура КоманднаяПанельСертификатыПоказать(Команда = Неопределено)
	
	ПоказатьСертификат()

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

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

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

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

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

&НаКлиенте
Процедура КоманднаяПанельСертификатыУстановитьВсеФлажки(Команда)
	
	Для Каждого Стр Из Сертификаты Цикл
		Стр.Пометка = Истина;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура КоманднаяПанельСертификатыСнятьВсеФлажки(Команда)
	
	Для Каждого Стр Из Сертификаты Цикл
		Стр.Пометка = Ложь;
	КонецЦикла;
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Функция ЛокализованноеИмяГОСТ()
	
	Возврат НСтр("ru='ГОСТ Р'");;
	
КонецФункции

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ЗначениеПоля(СтрЗначениеПоля)
	
	Возврат ?(НЕ ЗначениеЗаполнено(СтрЗначениеПоля) ИЛИ СокрЛП(СтрЗначениеПоля) = "0", "", СтрЗначениеПоля);
	
КонецФункции

&НаКлиенте
Функция АлгоритмНаАнглийском(ИмяАлгоритмаЛокализованное)
	
	Возврат СтрЗаменить(ИмяАлгоритмаЛокализованное, ЛокализованноеИмяГОСТ(), "GOST R");
	
КонецФункции

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

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

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

	// Организация
	Если ВладелецСтруктура.Свойство("O") Тогда
		Организация = ВладелецСтруктура["O"];
	Иначе
		Организация = "";
	КонецЕсли;
	
	СвойстваРезультат.Вставить("Организация", Организация);
	
	// Подразделение
	Если ВладелецСтруктура.Свойство("OU") Тогда
		Подразделение = ВладелецСтруктура["OU"];
	Иначе
		Подразделение = "";
	КонецЕсли;
	
	СвойстваРезультат.Вставить("Подразделение", Подразделение);
	
	// ЭлектроннаяПочта
	Если ВладелецСтруктура.Свойство("E") Тогда
		ЭлектроннаяПочта = ВладелецСтруктура["E"];
	Иначе
		ЭлектроннаяПочта = "";
	КонецЕсли;
	
	СвойстваРезультат.Вставить("ЭлектроннаяПочта", ЭлектроннаяПочта);	

	// Должность
	Если ВладелецСтруктура.Свойство("T") Тогда
		Должность = ВладелецСтруктура["T"];
	Иначе
		Должность = "";
	КонецЕсли;
	
	СвойстваРезультат.Вставить("Должность", Должность);
	
	// ИНН
	Если ВладелецСтруктура.Свойство("OID1_2_643_100_4") Тогда
		ИНН = ВладелецСтруктура["OID1_2_643_100_4"];
	ИначеЕсли ВладелецСтруктура.Свойство("OID1_2_643_3_131_1_1") Тогда
		ИНН = ВладелецСтруктура["OID1_2_643_3_131_1_1"];
	Иначе
		ИНН = "";
	КонецЕсли;
	
	Если СтрДлина(ИНН) = 12 и Лев(ИНН, 2) = "00" Тогда
		ИНН = Прав(ИНН, 10);
	КонецЕсли; 
	
	СвойстваРезультат.Вставить("ИНН", ИНН);
	
	// СНИЛС
	Если ВладелецСтруктура.Свойство("OID1_2_643_100_3") Тогда
		СНИЛС = ВладелецСтруктура["OID1_2_643_100_3"];
	Иначе
		СНИЛС = "";
	КонецЕсли;
	
	СвойстваРезультат.Вставить("СНИЛС", СНИЛС);

	Возврат СвойстваРезультат;

КонецФункции

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

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

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

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

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

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

&НаКлиенте
Процедура КоманднаяПанельФормыПоказыватьТолькоСертификатыГОСТ2012(Команда)
	
	Элементы.ПоказыватьТолькоСертификатыГОСТ2012.Пометка = НЕ Элементы.ПоказыватьТолькоСертификатыГОСТ2012.Пометка;
	ОтобразитьТаблицуСертификатов();
	
КонецПроцедуры

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

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