#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СписокВыбора = Элементы.ВариантУстановки.СписокВыбора;
СписокВыбора.Очистить();
Если Не ЗначениеЗаполнено(Параметры.ВариантыУстановки) Тогда
ВариантыУстановки = ВариантыУстановкиСертификата();
Для Каждого ТекущийВариантУстановки Из ВариантыУстановки Цикл
СписокВыбора.Добавить(ТекущийВариантУстановки.Значение, ТекущийВариантУстановки.Представление);
КонецЦикла;
ИначеЕсли Параметры.ВариантыУстановки = "Контейнер" Тогда
СписокВыбора.Добавить("Контейнер", НСтр("ru = 'Контейнер и личное хранилище'"));
ИначеЕсли ТипЗнч(Параметры.ВариантыУстановки) = Тип("Строка") Тогда
СписокВыбора.Добавить(Параметры.ВариантыУстановки);
Иначе
Для Каждого ТекущийВариантУстановки Из Параметры.ВариантыУстановки Цикл
СписокВыбора.Добавить(ТекущийВариантУстановки.Значение, ТекущийВариантУстановки.Представление);
КонецЦикла;
КонецЕсли;
ВариантУстановки = СписокВыбора[0].Значение;
Элементы.ВариантУстановки.ТолькоПросмотр = СписокВыбора.Количество() = 1;
СертификатДвоичныеДанные = Неопределено;
Если ЭтоАдресВременногоХранилища(Параметры.Сертификат) Тогда
СертификатДвоичныеДанные = ПолучитьИзВременногоХранилища(Параметры.Сертификат);
АдресСертификата = Параметры.Сертификат;
ИначеЕсли ЗначениеЗаполнено(Параметры.Сертификат) Тогда
СертификатДвоичныеДанные = Base64Значение(Параметры.Сертификат);
АдресСертификата = ПоместитьВоВременноеХранилище(СертификатДвоичныеДанные, УникальныйИдентификатор);
КонецЕсли;
Если СертификатДвоичныеДанные <> Неопределено Тогда
СвойстваСертификата = ЭлектроннаяПодпись.СвойстваСертификата(
Новый СертификатКриптографии(СертификатДвоичныеДанные));
ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаполнитьОписаниеДанныхСертификата(
СертификатОписаниеДанных, СвойстваСертификата);
КонецЕсли;
Элементы.ПоказатьДанныеСертификата.Видимость = ЗначениеЗаполнено(АдресСертификата);
Элементы.ДекорацияТекущийКонтейнер.Видимость = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ВариантУстановкиПриИзменении(Неопределено);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура ВариантУстановкиПриИзменении(Элемент)
Если ВариантУстановки = "Контейнер" Тогда
Элементы.ГруппаКонтейнеры.Видимость = Истина;
Элементы.КонтейнерыОбновить.Видимость = Истина;
Если Контейнеры.Количество() = 0 Тогда
ПодключитьОбработчикОжидания("НайтиКонтейнеры", 0.1, Истина);
КонецЕсли;
Иначе
Элементы.ГруппаКонтейнеры.Видимость = Ложь;
Элементы.КонтейнерыОбновить.Видимость = Ложь;
КонецЕсли;
Элементы.ДекорацияПредупреждение.Видимость = ВРег(ВариантУстановки) = "ROOT";
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Обновить(Команда)
ПодключитьОбработчикОжидания("НайтиКонтейнеры", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура Установить(Команда)
Если Не ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
ПараметрыУстановкиСертификата = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыУстановкиСертификата(Параметры.Сертификат);
ПараметрыУстановкиСертификата.Форма = ЭтотОбъект;
ПараметрыУстановкиСертификата.ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеУстановкиСертификата", ЭтотОбъект, ПараметрыУстановкиСертификата);
Если ВариантУстановки = "Контейнер" Тогда
ТекущиеДанные = Элементы.Контейнеры.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Выберите контейнер'"));
Возврат;
КонецЕсли;
СвойстваКонтейнера = ЭлектроннаяПодписьСлужебныйКлиент.НовыеСвойстваКонтейнера();
ЗаполнитьЗначенияСвойств(СвойстваКонтейнера, ТекущиеДанные);
ПараметрыУстановкиСертификата.СвойстваКонтейнера = СвойстваКонтейнера;
ПараметрыУстановкиСертификата.Хранилище = НСтр("ru = 'контейнер'");
Иначе
ЭлементСписка = Элементы.ВариантУстановки.СписокВыбора.НайтиПоЗначению(ВариантУстановки);
ПараметрыУстановкиСертификата.Хранилище = Новый Структура("Значение, Представление", ВариантУстановки, ЭлементСписка.Представление);
КонецЕсли;
ЭлектроннаяПодписьСлужебныйКлиент.УстановитьСертификатПослеВыбораВариантаУстановки(ПараметрыУстановкиСертификата);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьДанныеСертификата(Команда)
ЭлектроннаяПодписьКлиент.ОткрытьСертификат(АдресСертификата, Истина);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура ПослеУстановкиСертификата(Результат, Контекст) Экспорт
Если Результат.УстановкаВыполнена = Истина Тогда
Закрыть(Результат);
Иначе
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗаголовокПредупреждения", НСтр("ru = 'Не удалось установить сертификат.'"));
ПараметрыФормы.Вставить("ТекстОшибкиКлиент", Результат.Сообщение);
ЭлектроннаяПодписьСлужебныйКлиент.ОткрытьФормуРасширенногоПредставленияОшибки(ПараметрыФормы, Контекст.Форма);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Асинх Процедура НайтиКонтейнеры()
Элементы.ГруппаКонтейнеры.ТекущаяСтраница = Элементы.ОбновлениеТаблицы;
Контейнеры.Очистить();
Элементы.ДекорацияТекущийКонтейнер.Видимость = Ложь;
Элементы.ДекорацияТекущийКонтейнер.Заголовок= "";
КонтейнерыПоСертификату = Ждать ЭлектроннаяПодписьСлужебныйКлиент.КонтейнерыПоСертификату(
Параметры.Сертификат);
Если КонтейнерыПоСертификату = Неопределено Тогда
Элементы.ГруппаКонтейнеры.ТекущаяСтраница = Элементы.ТаблицаКонтейнеры;
Возврат;
КонецЕсли;
Для Каждого Контейнер Из КонтейнерыПоСертификату Цикл
НоваяСтрока = Контейнеры.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Контейнер);
НоваяСтрока.Считыватель = Считыватель(Контейнер.Имя);
Если Контейнер.ЭтоТекущийКонтейнер = Истина Тогда
Элементы.ДекорацияТекущийКонтейнер.Видимость = Истина;
Элементы.ДекорацияТекущийКонтейнер.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Сертификат установлен в контейнер: %1'"), Контейнер.Имя);
КонецЕсли;
КонецЦикла;
Элементы.ГруппаКонтейнеры.ТекущаяСтраница = Элементы.ТаблицаКонтейнеры;
Если КонтейнерыПоСертификату.Количество() = 0 Тогда
Элементы.ДекорацияТекущийКонтейнер.Заголовок = НСтр("ru = 'Не найдено подходящих контейнеров для установки сертификата'");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция Считыватель(Знач ИмяКонтейнера)
ИмяКонтейнера = ВРег(ИмяКонтейнера);
Если СтрНачинаетсяС(ИмяКонтейнера, "\\.\REGISTRY") Тогда
Возврат НСтр("ru = 'Реестр'");
КонецЕсли;
Если СтрНачинаетсяС(ИмяКонтейнера, "\\.\FAT12") Тогда
Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Диск %1'"), Сред(ИмяКонтейнера, 11, 1));
КонецЕсли;
Если СтрНачинаетсяС(ИмяКонтейнера, "\\.\HDIMAGE") Тогда
Возврат НСтр("ru = 'Диск'");
КонецЕсли;
Возврат "";
КонецФункции
&НаСервере
Функция ВариантыУстановкиСертификата()
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить("MY", НСтр("ru = 'Личное хранилище сертификатов'"));
СписокЗначений.Добавить("CA", НСтр("ru = 'Промежуточные сертификаты'"));
СписокЗначений.Добавить("ROOT", НСтр("ru = 'Доверенные корневые сертификаты'"));
СписокЗначений.Добавить("Контейнер", НСтр("ru = 'Контейнер и личное хранилище'"));
Возврат СписокЗначений;
КонецФункции
#КонецОбласти