Files
2022-02-16 16:31:00 +03:00

1449 lines
93 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2022, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область ОписаниеПеременных
&НаКлиенте
Перем ПроверкаПрограммВыполнялась;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
ЭлектроннаяПодписьСлужебный.УстановитьУсловноеОформлениеСпискаСертификатов(Сертификаты, Истина);
НавигационнаяСсылка = "e1cib/app/ОбщаяФорма.НастройкиЭлектроннойПодписиИШифрования";
Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда
Элементы.СтраницаНастройки.Видимость = Ложь;
БезПраваСохранениеДанныхПользователя = Истина;
КонецЕсли;
ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь();
Если Параметры.Свойство("ПоказатьСтраницуСертификаты") Тогда
Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаСертификаты;
ИначеЕсли Параметры.Свойство("ПоказатьСтраницуНастройки") Тогда
Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаНастройки;
ИначеЕсли Параметры.Свойство("ПоказатьСтраницуПрограммы") Тогда
Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаПрограммы;
КонецЕсли;
Если ОбщегоНазначения.РазделениеВключено() Тогда
УстановитьПроверкуПодписейНаСервере(Ложь);
Элементы.ПроверятьПодписиНаСервере.Видимость = Ложь;
Элементы.ПодписыватьНаСервере.Видимость = Ложь;
Иначе
ПроверятьПодписиНаСервере = Константы.ПроверятьЭлектронныеПодписиНаСервере.Получить();
ПодписыватьНаСервере = Константы.СоздаватьЭлектронныеПодписиНаСервере.Получить();
КонецЕсли;
Если ЗначениеЗаполнено(Параметры.СертификатыПоказать) Тогда
СертификатыПоказать = Параметры.СертификатыПоказать;
ИначеЕсли ЭтоПолноправныйПользователь Тогда
СертификатыПоказать = "ВсеСертификаты";
Иначе
СертификатыПоказать = "МоиСертификаты";
КонецЕсли;
Если Не ЭтоПолноправныйПользователь ИЛИ СертификатыПоказать <> "ВсеСертификаты" Тогда
ПользовательОтбор = Пользователи.ТекущийПользователь();
КонецЕсли;
// Страница Программы
Если Не ПравоДоступа("Изменение", Метаданные.Справочники.ПрограммыЭлектроннойПодписиИШифрования) Тогда
Элементы.Программы.ИзменятьСоставСтрок = Ложь;
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"ПрограммыДобавить", "Видимость", Ложь);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"ПрограммыИзменить", "Видимость", Ложь);
Элементы.ПрограммыУстановитьПометкуУдаления.Видимость = Ложь;
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"ПрограммыКонтекстноеМенюДобавить", "Видимость", Ложь);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"ПрограммыКонтекстноеМенюИзменить", "Видимость", Ложь);
Элементы.ПрограммыКонтекстноеМенюПрограммыУстановитьПометкуУдаления.Видимость = Ложь;
Элементы.ПроверятьПодписиНаСервере.Видимость = Ложь;
Элементы.ПодписыватьНаСервере.Видимость = Ложь;
Элементы.Программы.Заголовок =
НСтр("ru = 'Список программ, предусмотренных администратором, которые можно использовать на компьютере'");
КонецЕсли;
// Страница Сертификаты
ТекстЗапроса = Сертификаты.ТекстЗапроса;
ЗаявлениеНаВыпускСертификатаДоступно = ЭлектроннаяПодпись.ОбщиеНастройки().ЗаявлениеНаВыпускСертификатаДоступно;
Если ЗаявлениеНаВыпускСертификатаДоступно Тогда
МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата");
МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ЗаполнитьСписокВыбораСостоянияЗаявления(Элементы.СертификатыПоказатьЗаявления.СписокВыбора);
МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ДополнитьЗапросСостояниемВСпискеСертификатов(ТекстЗапроса);
МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ДобавитьЛегенду(ЭтотОбъект, Элементы.ГруппаЛегенда);
Элементы.СертификатыПоказать.СписокВыбора.Добавить("МоиЗаявленияВРаботе", НСтр("ru = 'Мои заявления в работе'"));
Если Не ПравоДоступа("Добавление", Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования) Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"СертификатыДобавить", "Видимость", Ложь);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"ПеревыпуститьСертификат", "Видимость", Ложь);
КонецЕсли;
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ДополнительноеПоле", "НЕОПРЕДЕЛЕНО");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ДополнительноеСоединение", "");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ЭтоЗаявление", "Ложь");
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"СертификатыСоздать", "Видимость", Истина);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"СертификатыДобавить", "Видимость", Ложь);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"ПеревыпуститьСертификат", "Видимость", Ложь);
Элементы.СертификатыПоказатьЗаявления.Видимость = Ложь;
Элементы.СертификатыСостояниеЗаявления.Видимость = Ложь;
КонецЕсли;
СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка();
СвойстваСписка.ТекстЗапроса = ТекстЗапроса;
ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Сертификаты, СвойстваСписка);
СертификатыВЛичномХранилище = Новый СписокЗначений;
УстановитьПараметрыВСпискеСертификатовНаСервере();
СертификатыОбновитьОтбор(ЭтотОбъект);
Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда
// Состав и настройки предусмотренных программ нельзя изменять.
// Можно изменять только пути к программам на серверах Linux.
Элементы.Программы.ИзменятьСоставСтрок = Ложь;
Элементы.ПрограммыУстановитьПометкуУдаления.Доступность = Ложь;
Элементы.ПрограммыКонтекстноеМенюПрограммыУстановитьПометкуУдаления.Доступность = Ложь;
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"ПрограммыИзменить", "ТолькоВоВсехДействиях", Ложь);
Иначе
Элементы.НадписьНастройкаВЦентральномУзле.Видимость = Ложь;
КонецЕсли;
Если Не ЭлектроннаяПодписьСлужебный.ТребуетсяПутьКПрограмме(Истина) Тогда
Элементы.ГруппаПрограммыLinuxПутьКПрограмме.Видимость = Ложь;
КонецЕсли;
Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость = ОбщегоНазначения.ЭтоВебКлиент()
И Параметры.Свойство("РасширениеНеПодключено");
ЗаполнитьПрограммыИНастройки();
Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда
МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS");
Элементы.Программы.КартинкаСтрок = МодульСервисКриптографииDSS.ПолучитьКартинкуПодсистемы("ТипыСертификатов");
Элементы.Программы.ПутьКДаннымКартинкиСтроки = "Программы.ТипРазмещения";
КонецЕсли;
ОбновитьТекущуюВидимостьЭлементов();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ОпределитьУстановленныеПрограммы();
ПодключитьОбработчикОжидания("ДобавитьСертификатыВЛичномХранилищеВПараметрДинамическогоСписка", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПриПовторномОткрытии()
ОпределитьУстановленныеПрограммы();
Если ЗначениеЗаполнено(Параметры.СертификатыПоказать) Тогда
СертификатыПоказать = Параметры.СертификатыПоказать;
СертификатыОбновитьОтбор(ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ВРег(ИмяСобытия) = ВРег("Запись_СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда
Если Параметр.Количество() = 0 Тогда
Элементы.Сертификаты.Обновить();
ИначеЕсли Параметр.Установлен Тогда
ПодключитьОбработчикОжидания("ОбновитьСписокСертификатов", 0.1, Истина);
ИначеЕсли Параметр.ЭтоНовый Тогда
Элементы.Сертификаты.Обновить();
Элементы.Сертификаты.ТекущаяСтрока = Источник;
КонецЕсли;
Возврат;
КонецЕсли;
// При изменении состава или настроек программ.
Если ВРег(ИмяСобытия) = ВРег("Запись_ПрограммыЭлектроннойПодписиИШифрования")
Или ВРег(ИмяСобытия) = ВРег("Запись_ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux")
Или ВРег(ИмяСобытия) = ВРег("Запись_ЛичныеНастройкиЭлектроннойПодписиИШифрования") Тогда
ПодключитьОбработчикОжидания("ПриИзмененииСоставаИлиНастроекПрограмм", 0.1, Истина);
Возврат;
КонецЕсли;
Если ВРег(ИмяСобытия) = ВРег("Установка_РасширениеРаботыСКриптографией") Тогда
ОпределитьУстановленныеПрограммы();
Возврат;
КонецЕсли;
// При изменении настроек использования.
Если ВРег(ИмяСобытия) <> ВРег("Запись_НаборКонстант") Тогда
Возврат;
КонецЕсли;
Если ВРег(Источник) = ВРег("ИспользоватьЭлектронныеПодписи")
Или ВРег(Источник) = ВРег("ИспользоватьШифрование") Тогда
ПодключитьОбработчикОжидания("ПриИзмененияИспользованияПодписанияИлиШифрования", 0.1, Истина);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура СтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
Если ПроверкаПрограммВыполнялась <> Истина Тогда
ОпределитьУстановленныеПрограммы();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СертификатыПоказатьПриИзменении(Элемент)
СертификатыОбновитьОтбор(ЭтотОбъект, ПользователиКлиент.ТекущийПользователь());
КонецПроцедуры
&НаКлиенте
Процедура СертификатыПоказатьЗаявленияПриИзменении(Элемент)
СертификатыОбновитьОтбор(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура СертификатыТолькоДействующиеПриИзменении(Элемент)
СертификатыОбновитьОтбор(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПользовательОтборПриИзменении(Элемент)
СертификатыОбновитьОтбор(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура РасширениеДляЗашифрованныхФайловПриИзменении(Элемент)
Если ПустаяСтрока(РасширениеДляЗашифрованныхФайлов) Тогда
РасширениеДляЗашифрованныхФайлов = "p7m";
КонецЕсли;
СохранитьНастройки();
КонецПроцедуры
&НаКлиенте
Процедура РасширениеДляФайловПодписиПриИзменении(Элемент)
Если ПустаяСтрока(РасширениеДляФайловПодписи) Тогда
РасширениеДляФайловПодписи = "p7s";
КонецЕсли;
СохранитьНастройки();
КонецПроцедуры
&НаКлиенте
Процедура ДействияПриСохраненииДанныхСЭлектроннойПодписьюПриИзменении(Элемент)
СохранитьНастройки();
КонецПроцедуры
&НаКлиенте
Процедура ПроверятьПодписиНаСервереПриИзменении(Элемент)
УстановитьПроверкуПодписейНаСервере(ПроверятьПодписиНаСервере);
Оповестить("Запись_НаборКонстант", Новый Структура, "ПроверятьЭлектронныеПодписиНаСервере");
КонецПроцедуры
&НаКлиенте
Процедура ПодписыватьНаСервереПриИзменении(Элемент)
УстановитьПодписаниеНаСервере(ПодписыватьНаСервере);
Оповестить("Запись_НаборКонстант", Новый Структура, "СоздаватьЭлектронныеПодписиНаСервере");
КонецПроцедуры
&НаКлиенте
Процедура СохранятьСертификатВместеСПодписьюПриИзменении(Элемент)
СохранитьНастройки();
КонецПроцедуры
&НаКлиенте
Процедура ПрограммыLinuxПутьКПрограммеПриИзменении(Элемент)
ТекущиеДанные = Элементы.Программы.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
СохранитьПутьКПрограмме();
КонецПроцедуры
&НаКлиенте
Процедура ПрограммыLinuxПутьКПрограммеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ТекущиеДанные = Элементы.Программы.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
ДанныеВыбора = Неопределено;
СтандартнаяОбработка = Ложь;
Возврат;
КонецЕсли;
Отбор = Новый Структура("Программа", ТекущиеДанные.Ссылка);
Строки = ПутиКПрограммамПоУмолчанию.НайтиСтроки(Отбор);
Если Строки.Количество() = 0 Тогда
ДанныеВыбора = Неопределено;
СтандартнаяОбработка = Ложь;
Возврат;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПрограммыLinuxПутьКПрограммеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущиеДанные = Элементы.Программы.ТекущиеДанные;
Если Не ЗначениеЗаполнено(ВыбранноеЗначение)
Или ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Отбор = Новый Структура("Программа", ТекущиеДанные.Ссылка);
Строки = ПутиКПрограммамПоУмолчанию.НайтиСтроки(Отбор);
ТекущиеДанные.LinuxПутьКПрограмме = ?(Строки.Количество() = 0, "", Строки[0].Путь);
СохранитьПутьКПрограмме();
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыСертификаты
&НаКлиенте
Процедура СертификатыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
Отказ = Истина;
ПараметрыСоздания = Новый Структура;
Если Копирование И ЗаявлениеНаВыпускСертификатаДоступно Тогда
Если Элементы.Сертификаты.ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущиеДанные = СертификатыТекущиеДанные(Элементы.Сертификаты);
ПараметрыСоздания.Вставить("СоздатьЗаявление", Истина);
ПараметрыСоздания.Вставить("СертификатОснование", ТекущиеДанные.Ссылка);
Иначе
ПараметрыСоздания = Новый Структура;
ПараметрыСоздания.Вставить("СкрытьЗаявление", Не ЗаявлениеНаВыпускСертификатаДоступно);
КонецЕсли;
ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьСертификат(ПараметрыСоздания);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СертификатыПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
Для Каждого Строка Из Строки Цикл
Если НЕ Строка.Значение.Данные.Свойство("Пользователь") Тогда
Возврат;
КонецЕсли;
Прервать;
КонецЦикла;
Запрос = Неопределено;
Для Каждого Строка Из Строки Цикл
Если ЗначениеЗаполнено(Строка.Значение.Данные.Пользователь) Тогда
Продолжить;
КонецЕсли;
Если Запрос = Неопределено Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СертификатыКлючейЭлектроннойПодписиИШифрованияПользователи.Ссылка КАК Ссылка,
| СертификатыКлючейЭлектроннойПодписиИШифрованияПользователи.Пользователь КАК Пользователь,
| Представление(СертификатыКлючейЭлектроннойПодписиИШифрованияПользователи.Пользователь) КАК ПользовательПредставление
|ИЗ
| Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Пользователи КАК
| СертификатыКлючейЭлектроннойПодписиИШифрованияПользователи
|ГДЕ
| СертификатыКлючейЭлектроннойПодписиИШифрованияПользователи.Ссылка В (&Ссылки)
|ИТОГИ
| КОЛИЧЕСТВО(Пользователь)
|ПО
| Ссылка";
Запрос.УстановитьПараметр("Ссылки", Строки.ПолучитьКлючи());
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
ВыборкаСсылка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
КонецЕсли;
Если ВыборкаСсылка.НайтиСледующий(Строка.Значение.Данные["Ссылка"], "Ссылка") Тогда
КоличествоПользователей = ВыборкаСсылка.Пользователь;
ВыборкаПользователь = ВыборкаСсылка.Выбрать();
ВыборкаПользователь.Следующий();
Если КоличествоПользователей = 1 Тогда
Строка.Значение.Данные.Пользователь = ВыборкаПользователь.ПользовательПредставление;
Продолжить;
КонецЕсли;
Пользователь1 = ВыборкаПользователь.ПользовательПредставление;
ВыборкаПользователь.Следующий();
Пользователь2 = ВыборкаПользователь.ПользовательПредставление;
Строка.Значение.Данные.Пользователь = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПользователиСертификатаСтрокой(
Пользователь1, Пользователь2, КоличествоПользователей);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыПрограммы
&НаКлиенте
Процедура ПрограммыПриАктивизацииСтроки(Элемент)
Элементы.ПрограммыУстановитьПометкуУдаления.Доступность =
Элементы.Программы.ТекущиеДанные <> Неопределено;
Если Элементы.Программы.ТекущиеДанные <> Неопределено Тогда
LinuxПутьКТекущейПрограмме = Элементы.Программы.ТекущиеДанные.LinuxПутьКПрограмме;
КонецЕсли;
ОбновитьLinuxПутьКПрограмме();
КонецПроцедуры
&НаКлиенте
Процедура ПрограммыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
Отказ = Истина;
Если Элементы.Программы.ИзменятьСоставСтрок Тогда
Если ЭлектроннаяПодписьСлужебныйКлиент.ИспользоватьСервисОблачнойПодписи() Тогда
МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент");
МодульСервисКриптографииDSSКлиент.ДобавлениеПрограммыЭлектроннойПодписи(Неопределено);
Иначе
ОткрытьФорму("Справочник.ПрограммыЭлектроннойПодписиИШифрования.ФормаОбъекта");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПрограммыПередНачаломИзменения(Элемент, Отказ)
Отказ = Истина;
Если Элементы.Найти("ПрограммыИзменить") <> Неопределено
И Элементы.ПрограммыИзменить.Видимость Тогда
ПоказатьЗначение(, Элементы.Программы.ТекущиеДанные.Ссылка);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПрограммыПередУдалением(Элемент, Отказ)
Отказ = Истина;
Если Элементы.Найти("ПрограммыИзменить") <> Неопределено
И Элементы.ПрограммыИзменить.Видимость Тогда
ПрограммыУстановитьПометкуУдаления(Неопределено);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИнструкцияНажатие(Элемент)
ЭлектроннаяПодписьСлужебныйКлиент.ОткрытьИнструкциюПоРаботеСПрограммами();
КонецПроцедуры
&НаКлиенте
Процедура ПрограммыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ТекущиеДанные = Элементы.Программы.ТекущиеДанные;
Если Поле = Элементы.ПрограммыПодробнее
И Не ПустаяСтрока(ТекущиеДанные.Подробнее)Тогда
СтандартнаяОбработка = Ложь;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗаголовокПредупреждения", НСтр("ru = 'Результат проверки программы'"));
ПараметрыФормы.Вставить("ТекстОшибкиКлиент", ТекущиеДанные.РезультатПроверки);
ПараметрыФормы.Вставить("ПоказатьТребуетсяПомощь", Истина);
ПараметрыФормы.Вставить("ПоказатьИнструкцию", Истина);
ОткрытьФорму("ОбщаяФорма.РасширенноеПредставлениеОшибки", ПараметрыФормы, ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Обновить(Команда)
ЗаполнитьПрограммыИНастройки(Истина);
ОпределитьУстановленныеПрограммы();
ОбновитьСписокСертификатов();
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьЗаявлениеНаВыпускСертификата(Команда)
ПараметрыСоздания = Новый Структура;
ПараметрыСоздания.Вставить("СоздатьЗаявление", Истина);
ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьСертификат(ПараметрыСоздания);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьИзУстановленныхНаКомпьютере(Команда)
ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьСертификат();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьРасширение(Команда)
ЭлектроннаяПодписьКлиент.УстановитьРасширение(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьВерсиюКомпонентыExtraCryptoAPI(Команда)
УстановитьПодключитьСообщитьВерсиюКомпоненты(Ложь);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьКомпонентуExtraCryptoAPI(Команда)
УстановитьПодключитьСообщитьВерсиюКомпоненты(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ТехническаяИнформация(Команда)
ЭлектроннаяПодписьСлужебныйКлиент.СформироватьТехническуюИнформацию(
НСтр("ru = 'Настройки электронной подписи и шифрования'"));
КонецПроцедуры
&НаКлиенте
Процедура ПрограммыУстановитьПометкуУдаления(Команда)
ТекущиеДанные = Элементы.Программы.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если ТекущиеДанные.ПометкаУдаления Тогда
ТекстВопроса = НСтр("ru = 'Снять с ""%1"" пометку на удаление?'");
Иначе
ТекстВопроса = НСтр("ru = 'Пометить ""%1"" на удаление?'");
КонецЕсли;
СодержимоеВопроса = Новый Массив;
СодержимоеВопроса.Добавить(БиблиотекаКартинок.Вопрос32);
СодержимоеВопроса.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, ТекущиеДанные.Наименование));
ПоказатьВопрос(
Новый ОписаниеОповещения("ПрограммыУстановитьПометкуУдаленияПродолжить", ЭтотОбъект, ТекущиеДанные.Ссылка),
Новый ФорматированнаяСтрока(СодержимоеВопроса),
РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура ОбновитьСписокСертификатов()
СертификатыВЛичномХранилище = Новый СписокЗначений;
ОписаниеОповещения = Новый ОписаниеОповещения(
"ОбновитьСписокСертификатовПослеПолученияСвойствСертификатовНаКлиенте",
ЭтотОбъект, "ОбновитьНаСервере");
ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСвойстваСертификатовНаКлиенте(ОписаниеОповещения, Истина, Истина, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьСертификатыВЛичномХранилищеВПараметрДинамическогоСписка()
ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСвойстваСертификатовНаКлиенте(
Новый ОписаниеОповещения("ОбновитьСписокСертификатовПослеПолученияСвойствСертификатовНаКлиенте", ЭтотОбъект),
Истина, Истина, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьСписокСертификатовПослеПолученияСвойствСертификатовНаКлиенте(Результат, Параметры) Экспорт
Для Каждого КлючИЗначение Из Результат.СвойстваСертификатовНаКлиенте Цикл
СертификатыВЛичномХранилище.Добавить(КлючИЗначение.Ключ);
КонецЦикла;
Если Параметры = "ОбновитьНаСервере" Тогда
УстановитьПараметрыВСпискеСертификатовНаСервере()
Иначе
ТекущаяДата = ОбщегоНазначенияКлиент.ДатаУниверсальная();
УстановитьПараметрыВСпискеСертификатов(ЭтотОбъект, СертификатыВЛичномХранилище, ТекущаяДата);
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьПараметрыВСпискеСертификатов(Форма, СписокСертификатов, ТекущаяДата)
ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(
Форма.Сертификаты, "СертификатыВЛичномХранилище", СписокСертификатов, Истина);
ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(
Форма.Сертификаты, "ТекущаяДата", ТекущаяДата, Истина);
КонецПроцедуры
&НаСервере
Процедура УстановитьПараметрыВСпискеСертификатовНаСервере()
ЭлектроннаяПодписьСлужебный.ДополнитьСписокСертификатовВЛичномХранилищеНаСервере(СертификатыВЛичномХранилище);
УстановитьПараметрыВСпискеСертификатов(ЭтотОбъект, СертификатыВЛичномХранилище, ТекущаяУниверсальнаяДата());
КонецПроцедуры
&НаСервере
Процедура УстановитьУсловноеОформление()
ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor");
ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ТекстЗапрещеннойЯчейкиЦвет.Значение;
ЭлементЦветаОформления.Использование = Истина;
ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Программы.Установлена");
ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбораДанных.ПравоеЗначение = Ложь;
ЭлементОтбораДанных.Использование = Истина;
ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("ПрограммыРезультатПроверки");
ЭлементОформляемогоПоля.Использование = Истина;
ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("ПрограммыНаименование");
ЭлементОформляемогоПоля.Использование = Истина;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура СертификатыОбновитьОтбор(Форма, ТекущийПользователь = Неопределено)
Элементы = Форма.Элементы;
// Отбор сертификатов Все/Мои.
ПоказатьСвои = Форма.СертификатыПоказать <> "ВсеСертификаты";
Если ТекущийПользователь <> Неопределено Тогда
Если ПоказатьСвои Тогда
Форма.ПользовательОтбор = ТекущийПользователь;
Иначе
Форма.ПользовательОтбор = Неопределено;
КонецЕсли;
КонецЕсли;
// Отбор по пользователю.
Элементы.СертификатыПользователь.Видимость = Не ПоказатьСвои;
Элементы.ПользовательОтбор.Видимость = Не ПоказатьСвои;
Форма.Сертификаты.Параметры.УстановитьЗначениеПараметра("ПользовательСертификата", ?(ЗначениеЗаполнено(
Форма.ПользовательОтбор), Форма.ПользовательОтбор, Неопределено));
// Отбор по действующим.
ОтборПоДействующим = Не Форма.СертификатыПоказать = "МоиСертификатыСИстекающимСрокомДействия"
И Не Форма.СертификатыПоказать = "МоиЗаявленияВРаботе";
Элементы.СертификатыТолькоДействующие.Видимость = ОтборПоДействующим;
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Форма.Сертификаты,
"Действует", Истина, , , ОтборПоДействующим И Форма.СертификатыТолькоДействующие);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Форма.Сертификаты,
"СрокДействияСкороЗакончится", Истина, , ,Форма.СертификатыПоказать = "МоиСертификатыСИстекающимСрокомДействия");
Если Форма.СертификатыПоказать = "МоиЗаявленияВРаботе" Тогда
Форма.СертификатыПоказатьЗаявления = Неопределено;
Форма.Элементы.СертификатыПоказатьЗаявления.Видимость = Ложь;
СостоянияЗаявления = Новый Массив;
СостоянияЗаявления.Добавить(ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено"));
СостоянияЗаявления.Добавить(ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.Отклонено"));
ОтборПоСостояниюЗаявления = Неопределено;
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Форма.Сертификаты,
"СостояниеЗаявления", СостоянияЗаявления, ВидСравненияКомпоновкиДанных.НеВСписке, , Истина);
Иначе
Форма.Элементы.СертификатыПоказатьЗаявления.Видимость = Форма.ЗаявлениеНаВыпускСертификатаДоступно
И Не Форма.СертификатыПоказать = "МоиСертификатыСИстекающимСрокомДействия";
Если Элементы.СертификатыПоказатьЗаявления.Видимость Тогда
// Отбор сертификатов по состоянию заявления.
ОтборПоСостояниюЗаявления = ЗначениеЗаполнено(Форма.СертификатыПоказатьЗаявления);
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Форма.Сертификаты,
"СостояниеЗаявления", Форма.СертификатыПоказатьЗаявления, , , ОтборПоСостояниюЗаявления);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Параметры:
// ТаблицаФормы - ДанныеФормыКоллекция
//
// Возвращаемое значение:
// Структура:
// * Ссылка - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования
//
&НаКлиенте
Функция СертификатыТекущиеДанные(ТаблицаФормы)
Возврат ТаблицаФормы.ТекущиеДанные;
КонецФункции
&НаКлиенте
Процедура ПрограммыУстановитьПометкуУдаленияПродолжить(Ответ, ТекущаяПрограмма) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
ИзменитьПометкуУдаленияПрограммы(ТекущаяПрограмма);
ОповеститьОбИзменении(ТекущаяПрограмма);
Оповестить("Запись_ПрограммыЭлектроннойПодписиИШифрования", Новый Структура, ТекущаяПрограмма);
ОпределитьУстановленныеПрограммы();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ИзменитьПометкуУдаленияПрограммы(Программа)
Если ТипЗнч(Программа) = ЭлектроннаяПодписьСлужебный.ТипПрограммыСервисаПодписи() Тогда
МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный");
МодульСервисКриптографииDSSСлужебный.ИзменитьПометкуУдаленияПрограммы(Программа, УникальныйИдентификатор);
Иначе
ЗаблокироватьДанныеДляРедактирования(Программа, , УникальныйИдентификатор);
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрограммыЭлектроннойПодписиИШифрования");
ЭлементБлокировки.УстановитьЗначение("Ссылка", Программа);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
Объект = Программа.ПолучитьОбъект();
Объект.ПометкаУдаления = Не Объект.ПометкаУдаления;
Объект.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
РазблокироватьДанныеДляРедактирования(Программа, УникальныйИдентификатор);
ВызватьИсключение;
КонецПопытки;
РазблокироватьДанныеДляРедактирования(Программа, УникальныйИдентификатор);
КонецЕсли;
ЗаполнитьПрограммыИНастройки(Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПриИзмененияИспользованияПодписанияИлиШифрования()
ОбновитьТекущуюВидимостьЭлементов();
КонецПроцедуры
&НаСервере
Процедура ОбновитьТекущуюВидимостьЭлементов()
Если Константы.ИспользоватьШифрование.Получить()
Или ЭлектроннаяПодпись.ОбщиеНастройки().ЗаявлениеНаВыпускСертификатаДоступно Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"СертификатыСоздать", "Заголовок", НСтр("ru = 'Добавить...'"));
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"СертификатыКонтекстноеМенюСоздать", "Заголовок", НСтр("ru = 'Добавить...'"));
Элементы.РасширениеДляЗашифрованныхФайлов.Видимость = Истина;
Иначе
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"СертификатыСоздать", "Заголовок", НСтр("ru = 'Добавить'"));
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"СертификатыКонтекстноеМенюСоздать", "Заголовок", НСтр("ru = 'Добавить'"));
Элементы.РасширениеДляЗашифрованныхФайлов.Видимость = Ложь;
КонецЕсли;
Если Константы.ИспользоватьШифрование.Получить() Тогда
Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда
Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок =
НСтр("ru = 'Из установленных на сервере DSS и на компьютере...'");
ИначеЕсли ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда
Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок =
НСтр("ru = 'Из установленных в сервисе и на компьютере...'");
Иначе
Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок =
НСтр("ru = 'Из установленных на компьютере...'");
КонецЕсли;
Иначе
Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда
Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок =
НСтр("ru = 'Из установленных на сервере DSS и на компьютере...'");
ИначеЕсли ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда
Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок =
НСтр("ru = 'Из установленных в сервисе и на компьютере'");
Иначе
Элементы.ДобавитьИзУстановленныхНаКомпьютере.Заголовок =
НСтр("ru = 'Из установленных на компьютере'");
КонецЕсли;
КонецЕсли;
Если Константы.ИспользоватьЭлектронныеПодписи.Получить() Тогда
ЗаголовокФлажка = НСтр("ru = 'Проверять подписи и сертификаты на сервере'");
ПодсказкаФлажка =
НСтр("ru = 'Позволяет не устанавливать программу на компьютер пользователя
|для проверки электронных подписей и сертификатов.
|
|Важно: на каждый компьютер, где работает сервер 1С:Предприятия
|или веб-сервер, подключенный к файловой информационной базе,
|должна быть установлена хотя бы одна из программ в списке.'");
Элементы.РасширениеДляФайловПодписи.Видимость = Истина;
Элементы.ДействияПриСохраненииДанныхСЭлектроннойПодписью.Видимость = Истина;
Иначе
ЗаголовокФлажка = НСтр("ru = 'Проверять сертификаты на сервере'");
ПодсказкаФлажка =
НСтр("ru = 'Позволяет не устанавливать программу на компьютер пользователя
|для проверки сертификатов.
|
|Важно: на каждый компьютер, где работает сервер 1С:Предприятия
|или веб-сервер, подключенный к файловой информационной базе,
|должна быть установлена хотя бы одна из программ в списке.'");
Элементы.РасширениеДляФайловПодписи.Видимость = Ложь;
Элементы.ДействияПриСохраненииДанныхСЭлектроннойПодписью.Видимость = Ложь;
КонецЕсли;
Элементы.ПроверятьПодписиНаСервере.Заголовок = ЗаголовокФлажка;
Элементы.ПроверятьПодписиНаСервере.РасширеннаяПодсказка.Заголовок = ПодсказкаФлажка;
Если Не Константы.ИспользоватьЭлектронныеПодписи.Получить() Тогда
ЗаголовокФлажка = НСтр("ru = 'Шифровать и расшифровывать на сервере'");
ПодсказкаФлажка =
НСтр("ru = 'Позволяет не устанавливать программу и сертификат
|на компьютер пользователя для шифрования и расшифровки.
|
|Важно: на каждый компьютер, где работает сервер 1С:Предприятия
|или веб-сервер, подключенный к файловой информационной базе,
|должна быть установлена программа и сертификат с закрытым ключом.'");
ИначеЕсли Не Константы.ИспользоватьШифрование.Получить() Тогда
ЗаголовокФлажка = НСтр("ru = 'Подписывать на сервере'");
ПодсказкаФлажка =
НСтр("ru = 'Позволяет не устанавливать программу и сертификат
|на компьютер пользователя для подписания.
|
|Важно: на каждый компьютер, где работает сервер 1С:Предприятия
|или веб-сервер, подключенный к файловой информационной базе,
|должна быть установлена программа и сертификат с закрытым ключом.'");
Иначе
ЗаголовокФлажка = НСтр("ru = 'Подписывать и шифровать на сервере'");
ПодсказкаФлажка =
НСтр("ru = 'Позволяет не устанавливать программу и сертификат
|на компьютер пользователя для подписания, шифрования и расшифровки.
|
|Важно: на каждый компьютер, где работает сервер 1С:Предприятия
|или веб-сервер, подключенный к файловой информационной базе,
|должна быть установлена программа и сертификат с закрытым ключом.'");
КонецЕсли;
Элементы.ПодписыватьНаСервере.Заголовок = ЗаголовокФлажка;
Элементы.ПодписыватьНаСервере.РасширеннаяПодсказка.Заголовок = ПодсказкаФлажка;
КонецПроцедуры
&НаКлиенте
Процедура ОпределитьУстановленныеПрограммы()
Если Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаПрограммы Тогда
ПроверкаПрограммВыполнялась = Истина;
НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
"ОпределитьУстановленныеПрограммыПослеПодключенияРасширения", ЭтотОбъект));
Иначе
ПроверкаПрограммВыполнялась = Неопределено;
КонецЕсли;
КонецПроцедуры
// Продолжение процедуры ОпределитьУстановленныеПрограммы.
&НаКлиенте
Процедура ОпределитьУстановленныеПрограммыПослеПодключенияРасширения(Подключено, Контекст) Экспорт
Если Подключено Тогда
Элементы.СтраницыПрограммыИОбновление.ТекущаяСтраница = Элементы.СтраницаПрограммыОбновление;
КонецЕсли;
#Если ВебКлиент Тогда
ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределитьУстановленныеПрограммы", 0.3, Истина);
#Иначе
ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределитьУстановленныеПрограммы", 0.1, Истина);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикОжиданияДляПродолжения()
Возврат;
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммы()
НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
"ОбработчикОжиданияОпределитьУстановленныеПрограммыПослеПодключенияРасширения", ЭтотОбъект));
#Если ВебКлиент Тогда
ПодключитьОбработчикОжидания("ОбработчикОжиданияДляПродолжения", 0.3, Истина);
#Иначе
ПодключитьОбработчикОжидания("ОбработчикОжиданияДляПродолжения", 0.1, Истина);
#КонецЕсли
КонецПроцедуры
// Продолжение процедуры ОбработчикОжиданияОпределитьУстановленныеПрограммы.
&НаКлиенте
Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммыПослеПодключенияРасширения(Подключено, Контекст) Экспорт
Если Не Подключено Тогда
Если Не Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость Тогда
УстановитьВидимостьГруппаВебКлиентРасширениеНеУстановлено(Истина);
КонецЕсли;
ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределитьУстановленныеПрограммы", 3, Истина);
Возврат;
КонецЕсли;
Если Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость Тогда
УстановитьВидимостьГруппаВебКлиентРасширениеНеУстановлено(Ложь);
КонецЕсли;
ПутиКПрограммамПоУмолчанию.Очистить();
Контекст = Новый Структура;
Контекст.Вставить("Индекс", -1);
ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст);
КонецПроцедуры
// Продолжение процедуры ОбработчикОжиданияОпределитьУстановленныеПрограммы.
&НаКлиенте
Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст)
Если Программы.Количество() <= Контекст.Индекс + 1 Тогда
// После цикла.
Элементы.СтраницыПрограммыИОбновление.ТекущаяСтраница = Элементы.СтраницаПрограммыСписок;
ТекущийЭлемент = Элементы.Программы;
ОбновитьLinuxПутьКПрограмме();
Возврат;
КонецЕсли;
Контекст.Индекс = Контекст.Индекс + 1;
ОписаниеПрограммы = Программы.Получить(Контекст.Индекс);
Контекст.Вставить("ОписаниеПрограммы", ОписаниеПрограммы);
ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьПутьКПрограммеПоУмолчанию(Новый ОписаниеОповещения(
"ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклПослеПолученияПутиКПрограмме", ЭтотОбъект, Контекст),
ОписаниеПрограммы.Ссылка);
КонецПроцедуры
// Продолжение процедуры ОбработчикОжиданияОпределитьУстановленныеПрограммы.
&НаКлиенте
Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклПослеПолученияПутиКПрограмме(ОписаниеПути, Контекст) Экспорт
ОписаниеПрограммы = Контекст.ОписаниеПрограммы;
Если ЗначениеЗаполнено(ОписаниеПути.ПутьКПрограмме) Тогда
НоваяСтрока = ПутиКПрограммамПоУмолчанию.Добавить();
НоваяСтрока.Программа = ОписаниеПрограммы.Ссылка;
НоваяСтрока.Путь = ОписаниеПути.ПутьКПрограмме;
КонецЕсли;
Если ОписаниеПрограммы.ПометкаУдаления Тогда
ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверки, "");
ОбновитьЗначение(ОписаниеПрограммы.Подробнее, "");
ОбновитьЗначение(ОписаниеПрограммы.Установлена, "");
ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст);
Возврат;
ИначеЕсли ОписаниеПрограммы.ЭтоВстроенныйКриптопровайдер Тогда
ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверки, НСтр("ru = 'Доступен.'"));
ОбновитьЗначение(ОписаниеПрограммы.Установлена, Истина);
ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст);
Возврат;
ИначеЕсли ЭлектроннаяПодписьСлужебныйКлиентСервер.РазмещениеСертификата(ОписаниеПрограммы.ТипРазмещения) = "ОблачнаяПодпись" Тогда
ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверки, НСтр("ru = 'Доступен.'"));
ОбновитьЗначение(ОписаниеПрограммы.Установлена, Истина);
ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст);
Возврат;
КонецЕсли;
ОписанияПрограмм = Новый Массив;
ОписанияПрограмм.Добавить(Контекст.ОписаниеПрограммы);
ОписаниеОшибок = ЭлектроннаяПодписьСлужебныйКлиентСервер.НовоеОписаниеОшибок();
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("ОписанияПрограмм", ОписанияПрограмм);
ПараметрыВыполнения.Вставить("Индекс", -1);
ПараметрыВыполнения.Вставить("ПоказатьОшибку", Неопределено);
ПараметрыВыполнения.Вставить("ОписаниеОшибок", ОписаниеОшибок);
ПараметрыВыполнения.Вставить("АлгоритмПодписи", "");
ПараметрыВыполнения.Вставить("ИнтерактивныйРежим", Ложь);
ПараметрыВыполнения.Вставить("ЭтоLinux", ЭлектроннаяПодписьСлужебныйКлиент.ТребуетсяПутьКПрограмме());
ПараметрыВыполнения.Вставить("Менеджер", Неопределено);
ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения(
"ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклПродолжение", ЭтотОбъект, Контекст));
Контекст.Вставить("ПараметрыВыполнения", Новый Структура("ОписаниеОшибок", ОписаниеОшибок));
ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографииЦиклНачало(ПараметрыВыполнения);
КонецПроцедуры
// Продолжение процедуры ОбработчикОжиданияОпределитьУстановленныеПрограммы.
&НаКлиенте
Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклПродолжение(Менеджер, Контекст) Экспорт
ОписаниеПрограммы = Контекст.ОписаниеПрограммы;
Ошибки = Контекст.ПараметрыВыполнения.ОписаниеОшибок.Ошибки; // Массив Из см. ЭлектроннаяПодписьСлужебныйКлиентСервер.НовыеСвойстваОшибки
Если Менеджер <> Неопределено Тогда
ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверки, НСтр("ru = 'Установлена на компьютере.'"));
ОбновитьЗначение(ОписаниеПрограммы.Подробнее, "");
ОбновитьЗначение(ОписаниеПрограммы.Установлена, Истина);
ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст);
Возврат;
КонецЕсли;
Для каждого Ошибка Из Ошибки Цикл
Прервать;
КонецЦикла;
Если Ошибка.НеУказанПуть Тогда
ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверки, Ошибка.Описание);
ОбновитьЗначение(ОписаниеПрограммы.Подробнее, НСтр("ru = 'Подробнее'") + "...");
ОбновитьЗначение(ОписаниеПрограммы.Установлена, "");
Иначе
ТекстОшибки = НСтр("ru = 'Не установлена на компьютере.'") + " " + Ошибка.Описание;
Если Ошибка.КАдминистратору И Не ЭтоПолноправныйПользователь Тогда
ТекстОшибки = ТекстОшибки + " " + НСтр("ru = 'Обратитесь к администратору.'");
КонецЕсли;
ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверки, ТекстОшибки);
ОбновитьЗначение(ОписаниеПрограммы.Подробнее, НСтр("ru = 'Подробнее'") + "...");
ОбновитьЗначение(ОписаниеПрограммы.Установлена, Ложь);
КонецЕсли;
ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьLinuxПутьКПрограмме()
ТекущиеДанные = Элементы.Программы.ТекущиеДанные;
ПутьПоУмолчанию = "";
Если ТекущиеДанные <> Неопределено Тогда
Отбор = Новый Структура("Программа", ТекущиеДанные.Ссылка);
Строки = ПутиКПрограммамПоУмолчанию.НайтиСтроки(Отбор);
Если Строки.Количество() > 0 Тогда
ПутьПоУмолчанию = Строки[0].Путь;
КонецЕсли;
КонецЕсли;
Элементы.ПрограммыLinuxПутьКПрограмме.КнопкаВыпадающегоСписка = ЗначениеЗаполнено(ПутьПоУмолчанию);
Элементы.ПрограммыLinuxПутьКПрограмме.ПодсказкаВвода = ПутьПоУмолчанию;
СписокВыбораПутей = Элементы.ПрограммыLinuxПутьКПрограмме.СписокВыбора;
СписокВыбораПутей.Очистить();
Если ЗначениеЗаполнено(ПутьПоУмолчанию) Тогда
Если ОбщегоНазначенияКлиент.ЭтоLinuxКлиент() Тогда
СписокВыбораПутей.Добавить("ПутьLinux", НСтр("ru = 'Стандартный путь для Linux'"));
Иначе
СписокВыбораПутей.Добавить("ПутьMac", НСтр("ru = 'Стандартный путь для Mac OS'"));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьВидимостьГруппаВебКлиентРасширениеНеУстановлено(Знач ВидимостьЭлемента)
Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость = ВидимостьЭлемента;
КонецПроцедуры
&НаКлиенте
Процедура ПриИзмененииСоставаИлиНастроекПрограмм()
ЗаполнитьПрограммыИНастройки();
ОпределитьУстановленныеПрограммы();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПрограммыИНастройки(ОбновитьПовтИсп = Ложь)
Если ОбновитьПовтИсп Тогда
ОбновитьПовторноИспользуемыеЗначения();
КонецЕсли;
ПерсональныеНастройки = ЭлектроннаяПодпись.ПерсональныеНастройки();
ДействияПриСохраненииСЭП = ПерсональныеНастройки.ДействияПриСохраненииСЭП;
РасширениеДляЗашифрованныхФайлов = ПерсональныеНастройки.РасширениеДляЗашифрованныхФайлов;
РасширениеДляФайловПодписи = ПерсональныеНастройки.РасширениеДляФайловПодписи;
ПутиКПрограммам = ПерсональныеНастройки.ПутиКПрограммамЭлектроннойПодписиИШифрования;
СохранятьСертификатВместеСПодписью = ПерсональныеНастройки.СохранятьСертификатВместеСПодписью;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Программы.Ссылка,
| Программы.Наименование КАК Наименование,
| Программы.ИмяПрограммы,
| Программы.ТипПрограммы,
| Программы.АлгоритмПодписи,
| Программы.АлгоритмХеширования,
| Программы.АлгоритмШифрования,
| Программы.ПометкаУдаления КАК ПометкаУдаления,
| Программы.ЭтоВстроенныйКриптопровайдер,
| 1 КАК ТипРазмещения
|ИЗ
| Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК Программы
|ГДЕ
| НЕ Программы.ЭтоВстроенныйКриптопровайдер
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Программы.Ссылка,
| Программы.Наименование,
| Программы.ИмяПрограммы,
| Программы.ТипПрограммы,
| Программы.АлгоритмПодписи,
| Программы.АлгоритмХеширования,
| Программы.АлгоритмШифрования,
| Программы.ПометкаУдаления,
| Программы.ЭтоВстроенныйКриптопровайдер,
| 4
|ИЗ
| Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК Программы
|ГДЕ
| Программы.ЭтоВстроенныйКриптопровайдер
| И &ИспользоватьЭлектроннуюПодписьВМоделиСервиса
|
|УПОРЯДОЧИТЬ ПО
| Наименование";
Запрос.УстановитьПараметр("ИспользоватьЭлектроннуюПодписьВМоделиСервиса",
ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса());
ТаблицаВыборки = Запрос.Выполнить().Выгрузить();
Если ЭлектроннаяПодписьСлужебный.ИспользоватьСервисОблачнойПодписи() Тогда
МодульСервисКриптографииDSSСлужебный = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSSСлужебный");
МодульСервисКриптографииDSSСлужебный.ДополнитьВыборкуПрограмм(ТаблицаВыборки);
КонецЕсли;
ОбработанныеСтроки = Новый Соответствие;
Индекс = 0;
Для каждого СтрокаВыборки Из ТаблицаВыборки Цикл
Если Не Пользователи.ЭтоПолноправныйПользователь() И СтрокаВыборки.ПометкаУдаления Тогда
Продолжить;
КонецЕсли;
Строки = Программы.НайтиСтроки(Новый Структура("Ссылка", СтрокаВыборки.Ссылка));
Если Строки.Количество() = 0 Тогда
Если Программы.Количество()-1 < Индекс Тогда
Строка = Программы.Добавить();
Иначе
Строка = Программы.Вставить(Индекс);
КонецЕсли;
Иначе
Строка = Строки[0];
ИндексСтроки = Программы.Индекс(Строка);
Если ИндексСтроки <> Индекс Тогда
Программы.Сдвинуть(ИндексСтроки, Индекс - ИндексСтроки);
КонецЕсли;
КонецЕсли;
// Обновление только измененных значений, чтобы таблица формы не обновлялась лишний раз.
ОбновитьЗначение(Строка.Ссылка, СтрокаВыборки.Ссылка);
ОбновитьЗначение(Строка.ПометкаУдаления, СтрокаВыборки.ПометкаУдаления);
ОбновитьЗначение(Строка.Наименование, СтрокаВыборки.Наименование);
ОбновитьЗначение(Строка.ИмяПрограммы, СтрокаВыборки.ИмяПрограммы);
ОбновитьЗначение(Строка.ТипПрограммы, СтрокаВыборки.ТипПрограммы);
ОбновитьЗначение(Строка.АлгоритмПодписи, СтрокаВыборки.АлгоритмПодписи);
ОбновитьЗначение(Строка.АлгоритмХеширования, СтрокаВыборки.АлгоритмХеширования);
ОбновитьЗначение(Строка.АлгоритмШифрования, СтрокаВыборки.АлгоритмШифрования);
ОбновитьЗначение(Строка.LinuxПутьКПрограмме, ПутиКПрограммам.Получить(СтрокаВыборки.Ссылка));
ОбновитьЗначение(Строка.НомерКартинки, ?(СтрокаВыборки.ПометкаУдаления, 4, 3));
ОбновитьЗначение(Строка.ЭтоВстроенныйКриптопровайдер, СтрокаВыборки.ЭтоВстроенныйКриптопровайдер);
ОбновитьЗначение(Строка.ТипРазмещения, СтрокаВыборки.ТипРазмещения + ?(СтрокаВыборки.ПометкаУдаления, 4, 0));
Если Строка.ЭтоВстроенныйКриптопровайдер И Не Строка.ПометкаУдаления Тогда
ОбновитьЗначение(Строка.РезультатПроверки, НСтр("ru = 'Доступен.'"));
ОбновитьЗначение(Строка.Установлена, Истина);
ИначеЕсли ЭлектроннаяПодписьСлужебныйКлиентСервер.РазмещениеСертификата(СтрокаВыборки.ТипРазмещения) = "ОблачнаяПодпись"
И Не Строка.ПометкаУдаления Тогда
ОбновитьЗначение(Строка.РезультатПроверки, НСтр("ru = 'Доступен.'"));
ОбновитьЗначение(Строка.Установлена, Истина);
КонецЕсли;
ОбработанныеСтроки.Вставить(Строка, Истина);
Индекс = Индекс + 1;
КонецЦикла;
Индекс = Программы.Количество()-1;
Пока Индекс >=0 Цикл
Строка = Программы.Получить(Индекс);
Если ОбработанныеСтроки.Получить(Строка) = Неопределено Тогда
Программы.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс-1;
КонецЦикла;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьЗначение(СтароеЗначение, НовоеЗначение)
Если СтароеЗначение <> НовоеЗначение Тогда
СтароеЗначение = НовоеЗначение;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СохранитьНастройки()
СохраняемыеНастройки = Новый Структура;
СохраняемыеНастройки.Вставить("ДействияПриСохраненииСЭП", ДействияПриСохраненииСЭП);
СохраняемыеНастройки.Вставить("РасширениеДляЗашифрованныхФайлов", РасширениеДляЗашифрованныхФайлов);
СохраняемыеНастройки.Вставить("РасширениеДляФайловПодписи", РасширениеДляФайловПодписи);
СохраняемыеНастройки.Вставить("СохранятьСертификатВместеСПодписью", СохранятьСертификатВместеСПодписью);
СохранитьНастройкиНаСервере(СохраняемыеНастройки);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СохранитьНастройкиНаСервере(СохраняемыеНастройки)
ПерсональныеНастройки = ЭлектроннаяПодпись.ПерсональныеНастройки();
ЗаполнитьЗначенияСвойств(ПерсональныеНастройки, СохраняемыеНастройки);
ЭлектроннаяПодписьСлужебный.СохранитьПерсональныеНастройки(ПерсональныеНастройки);
// Требуется для обновления персональных настроек на клиенте.
ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СохранитьПутьLinuxНаСервере(Программа, ПутьLinux)
ПерсональныеНастройки = ЭлектроннаяПодпись.ПерсональныеНастройки();
ПерсональныеНастройки.ПутиКПрограммамЭлектроннойПодписиИШифрования.Вставить(Программа, ПутьLinux);
ЭлектроннаяПодписьСлужебный.СохранитьПерсональныеНастройки(ПерсональныеНастройки);
// Требуется для обновления персональных настроек на клиенте.
ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УстановитьПроверкуПодписейНаСервере(ПроверятьПодписиНаСервере)
Если Не ПравоДоступа("Изменение", Метаданные.Константы.ПроверятьЭлектронныеПодписиНаСервере)
Или Константы.ПроверятьЭлектронныеПодписиНаСервере.Получить() = ПроверятьПодписиНаСервере Тогда
Возврат;
КонецЕсли;
Константы.ПроверятьЭлектронныеПодписиНаСервере.Установить(ПроверятьПодписиНаСервере);
// Требуется для обновления общих настроек на сервере и на клиенте.
ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УстановитьПодписаниеНаСервере(ПодписыватьНаСервере)
Если Не ПравоДоступа("Изменение", Метаданные.Константы.СоздаватьЭлектронныеПодписиНаСервере)
Или Константы.СоздаватьЭлектронныеПодписиНаСервере.Получить() = ПодписыватьНаСервере Тогда
Возврат;
КонецЕсли;
Константы.СоздаватьЭлектронныеПодписиНаСервере.Установить(ПодписыватьНаСервере);
// Требуется для обновления общих настроек на сервере и на клиенте.
ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры
&НаКлиенте
Процедура СохранитьПутьКПрограмме()
ТекущиеДанные = Элементы.Программы.ТекущиеДанные;
Если БезПраваСохранениеДанныхПользователя Тогда
ТекущиеДанные.LinuxПутьКПрограмме = LinuxПутьКТекущейПрограмме;
ПоказатьПредупреждение(,
НСтр("ru = 'Невозможно сохранить путь к программе. Отсутствует право сохранения данных.
|Обратитесь к администратору.'"));
Иначе
СохранитьПутьLinuxНаСервере(ТекущиеДанные.Ссылка, ТекущиеДанные.LinuxПутьКПрограмме);
ОпределитьУстановленныеПрограммы();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПодключитьСообщитьВерсиюКомпоненты(ПредложитьЗагрузить)
ПараметрыПодключения = ОбщегоНазначенияКлиент.ПараметрыПодключенияКомпоненты();
ПараметрыПодключения.ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Требуется установка компоненты %1'"), "ExtraCryptoAPI");
ПараметрыПодключения.ПредложитьЗагрузить = ПредложитьЗагрузить;
ПараметрыПодключения.ПредложитьУстановить = Истина;
ОписаниеКомпоненты = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОписаниеКомпоненты();
ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета(
Новый ОписаниеОповещения("СообщитьРезультатПодключенияКомпоненты", ЭтотОбъект),
ОписаниеКомпоненты.ИмяОбъекта,
ОписаниеКомпоненты.ПолноеИмяМакета,
ПараметрыПодключения);
КонецПроцедуры
&НаКлиенте
Процедура СообщитьРезультатПодключенияКомпоненты(Результат, ДополнительныеПараметры) Экспорт
Если Результат.Подключено Тогда
Попытка
ОповещениеПослеПолученияВерсии = Новый ОписаниеОповещения("СообщитьВерсиюКомпонентыПослеПодключения", ЭтотОбъект);
Результат.ПодключаемыйМодуль.НачатьВызовПолучитьВерсию(ОповещениеПослеПолученияВерсии);
Возврат;
Исключение
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось определить версию компоненты.
| %1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ПоказатьПредупреждение(, ТекстОшибки);
КонецПопытки;
Иначе
Если ПустаяСтрока(Результат.ОписаниеОшибки) Тогда
// Пользователь отказался от установки.
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Компонента %1 не установлена.'"), "ExtraCryptoAPI");
ПоказатьПредупреждение(, ТекстОшибки);
Иначе
// Установка не удалась, описание ошибки в Результат.ОписаниеОшибки.
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Компонента %1 не установлена (%2).'"), "ExtraCryptoAPI", Результат.ОписаниеОшибки);
ПоказатьПредупреждение(, ТекстОшибки);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СообщитьВерсиюКомпонентыПослеПодключения(Результат, Параметры, ДополнительныеПараметры) Экспорт
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Установлена компонента %1 версии %2.'"), "ExtraCryptoAPI", Результат);
ПоказатьПредупреждение(, ТекстСообщения);
КонецПроцедуры
#КонецОбласти