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

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

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

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

	ТекущаяДата = ТекущаяУниверсальнаяДата();
	
	ЗаполнитьТаблицуСертификатовИзЗащищенногоХранилищаНаСервере();
	
	УправлениеФормой(ЭтаФорма);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция СтруктураВСтроку(Структура, ЗаменятьПоляX501 = Ложь)
	
	КлючЗначение = Новый Массив;
	Для Каждого Элемент Из Структура Цикл
		ИмяКлючаСтруктуры = Элемент.Ключ;
		Если ЗаменятьПоляX501 И ИмяКлючаСтруктуры = "_1_2_643_100_4" Тогда
			ИмяКлючаСтруктуры = "INNLE";
		КонецЕсли;
		КлючЗначение.Добавить(СтрШаблон("%1=%2", ИмяКлючаСтруктуры, Элемент.Значение));
	КонецЦикла;
	
	Возврат СтрСоединить(КлючЗначение, "; ");
	
КонецФункции

&НаСервере
Процедура ЗаполнитьТаблицуСертификатовИзЗащищенногоХранилищаНаСервере()
	
	ПоясСеанса = ЧасовойПоясСеанса();
	
	СертификатыИзХранилища = ХранилищеСертификатов.Получить(ОбрабатываемоеХранилище);
	
	Для Каждого СертификатИзХранилища Из СертификатыИзХранилища Цикл
		
		Отпечаток = НРег(СтрЗаменить(СертификатИзХранилища.Отпечаток, " ", ""));
		
		Если НЕ (Отпечатки.Количество() > 0 И Отпечатки.НайтиПоЗначению(Отпечаток) <> Неопределено 
			ИЛИ Отпечатки.Количество() = 0) Тогда
			Продолжить;
		КонецЕсли;
		
		ДатаНачалаСертификата = СертификатИзХранилища.ДатаНачала;
		Если ТипЗнч(ДатаНачалаСертификата) = Тип("Дата") Тогда
			ДатаНачалаСертификата = МестноеВремя(ДатаНачалаСертификата, ПоясСеанса);
		КонецЕсли;
		ДатаОкончанияСертификата = СертификатИзХранилища.ДатаОкончания;
		Если ТипЗнч(ДатаОкончанияСертификата) = Тип("Дата") Тогда
			ДатаОкончанияСертификата = МестноеВремя(ДатаОкончанияСертификата, ПоясСеанса);
		КонецЕсли;
		
		НоваяСтрока = Сертификаты.Добавить();
		
		НоваяСтрока.Просрочен               = СертификатИзХранилища.ДатаОкончания < ТекущаяДата;
		НоваяСтрока.ДействителенС           = ДатаНачалаСертификата;
		НоваяСтрока.ДействителенПо          = ДатаОкончанияСертификата;
		НоваяСтрока.Отпечаток               = Отпечаток;
		НоваяСтрока.ПригоденДляПодписывания = СертификатИзХранилища.ИспользоватьДляПодписи;
		НоваяСтрока.Поставщик               = СтруктураВСтроку(СертификатИзХранилища.Издатель, Истина);
		НоваяСтрока.Наименование            = СертификатИзХранилища.Субъект.CN;
		НоваяСтрока.Владелец                = СтруктураВСтроку(СертификатИзХранилища.Субъект, Истина);
		НоваяСтрока.СерийныйНомер           = Строка(СертификатИзХранилища.СерийныйНомер);		
			
		НоваяСтрока.ИмяВладельца = ПолучитьФИОСтрокойИзСвойствСертификата(СертификатИзХранилища.Субъект);
		Если СертификатИзХранилища.Субъект.Свойство("O") Тогда
			НоваяСтрока.Организация = ЗначениеПоля(СертификатИзХранилища.Субъект.O);
		КонецЕсли;
		Если СертификатИзХранилища.Субъект.Свойство("T") Тогда
			НоваяСтрока.Должность = ЗначениеПоля(СертификатИзХранилища.Субъект.T);
		КонецЕсли;
		Если СертификатИзХранилища.Субъект.Свойство("E") Тогда
			НоваяСтрока.EMail = ЗначениеПоля(СертификатИзХранилища.Субъект.E);
		КонецЕсли;
		Если СертификатИзХранилища.Субъект.Свойство("INNLE") Тогда
			НоваяСтрока.ИНН = ЗначениеПоля(СертификатИзХранилища.Субъект.INNLE);
		ИначеЕсли СертификатИзХранилища.Субъект.Свойство("_1_2_643_100_4") Тогда
			НоваяСтрока.ИНН = ЗначениеПоля(СертификатИзХранилища.Субъект._1_2_643_100_4);
		ИначеЕсли СертификатИзХранилища.Субъект.Свойство("INN") Тогда
			Если Лев(СертификатИзХранилища.Субъект.INN, 2) = "00" Тогда
				НоваяСтрока.ИНН = ЗначениеПоля(Сред(СертификатИзХранилища.Субъект.INN, 3));
			Иначе
				НоваяСтрока.ИНН = ЗначениеПоля(СертификатИзХранилища.Субъект.INN);
			КонецЕсли;
		КонецЕсли;
		
		Если Не ПоказыватьПросроченные И НоваяСтрока.Просрочен
			И НачальноеЗначениеВыбора.НайтиПоЗначению(НоваяСтрока.Отпечаток) <> Неопределено Тогда
			ПоказыватьПросроченные = Истина;
		КонецЕсли;
	КонецЦикла;
	
	НеНайденныеСертификаты = Новый СписокЗначений;
	Для Каждого ЭлементСписка Из НачальноеЗначениеВыбора Цикл
		НайденныеСтроки = Сертификаты.НайтиСтроки(Новый Структура("Отпечаток", ЭлементСписка.Значение));
		Если НайденныеСтроки.Количество() = 0 Тогда
			НеНайденныеСертификаты.Добавить(ЭлементСписка.Значение);
		Иначе
			Для Каждого СтрокаТаблицы Из НайденныеСтроки Цикл
				СтрокаТаблицы.Пометка = Истина;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	
	Сертификаты.Сортировать("ДействителенС, ДействителенПо");
	
КонецПроцедуры

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

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