#Область ОбработчикиСобытийФормы
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Для Каждого ЭлементСписка Из НеНайденныеСертификаты Цикл
ШаблонСообщения = НСтр("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 Тогда
НеНайденныеСертификаты.Добавить(ЭлементСписка.Значение);
Иначе
Для Каждого СтрокаТаблицы Из НайденныеСтроки Цикл
СтрокаТаблицы.Пометка = Истина;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Сертификаты.Сортировать("ДействителенС, ДействителенПо");
КонецПроцедуры
#КонецОбласти