Рассылки отчетов / Пароли и шифрование / Модуль формы

файл
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ИзмененыПаролиСертификаты;

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

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ИзмененыПаролиСертификаты = Ложь;
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ИспользоватьОтборПарольУстановленПриИзменении(Элемент)
	УстановитьОтборы();
КонецПроцедуры

&НаКлиенте
Процедура ОтборПарольУстановленПриИзменении(Элемент)
	УстановитьОтборы();
КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьОтборПарольИзмененПриИзменении(Элемент)
	УстановитьОтборы();
КонецПроцедуры

&НаКлиенте
Процедура ОтборПарольИзмененПриИзменении(Элемент)
	УстановитьОтборы();
КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьОтборСертификатУказанПриИзменении(Элемент)
	УстановитьОтборы();
КонецПроцедуры

&НаКлиенте
Процедура ОтборСертификатУказанПриИзменении(Элемент)
	УстановитьОтборы();
КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьОтборСертификатИзмененПриИзменении(Элемент)
	УстановитьОтборы();
КонецПроцедуры

&НаКлиенте
Процедура ОтборСертификатИзмененПриИзменении(Элемент)
	УстановитьОтборы();
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПолучателиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, ЭтоГруппа, Параметр)
	Отказ = Истина;
КонецПроцедуры

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

&НаКлиенте
Процедура ПолучателиПередУдалением(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ПолучателиПарольАрхиваПриИзменении(Элемент)
	
	СтрокаПолучатели = Элементы.Получатели.ТекущиеДанные;
	СтрокаПолучатели.ПарольИзменен = Истина;
	
	ПараметрыОтбора = Новый Структура;
	ПараметрыОтбора.Вставить("Получатель", СтрокаПолучатели.Получатель);
	
	СтрокиПолучателиБезОтбора = ПолучателиБезОтборов.НайтиСтроки(ПараметрыОтбора);
	Если СтрокиПолучателиБезОтбора.Количество() > 0 Тогда
		СтрокиПолучателиБезОтбора[0].ПарольАрхива = СтрокаПолучатели.ПарольАрхива;
		СтрокиПолучателиБезОтбора[0].ПарольИзменен = Истина;
	КонецЕсли;
	
	ИзмененыПаролиСертификаты = Истина;
		
	ОбновитьОтборы();	
		
КонецПроцедуры

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

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

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

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

	ТекстВопроса = СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр(
		"ru = 'Для получателей рассылки будут заполнены сертификаты для шифрования, если они существуют для соответствующего физического лица.
		|
		|• Нажмите <b>Да</b>, чтобы  перезаполнить сертификаты, даже если они уже были указаны.
		|• Нажмите <b>Нет</b>, чтобы заполнить только отсутствующие сертификаты.'"));

	ПоказатьВопрос(
			Новый ОписаниеОповещения("ПередЗаполнениемСертификатов", ЭтотОбъект), ТекстВопроса,
		РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Нет);

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

&НаКлиенте
Процедура УстановитьПароли(Команда)

	ТекстВопроса = СтроковыеФункцииКлиент.ФорматированнаяСтрока(НСтр(
		"ru = 'Для получателей рассылки будут установлены пароли.
		|
		|• Нажмите <b>Да</b>, чтобы  устанавливать новые пароли, даже если они уже были установлены.
		|• Нажмите <b>Нет</b>, чтобы установить пароли,  только при их отсутствии.'"));

	ПоказатьВопрос(
			Новый ОписаниеОповещения("ПередУстановкойПаролей", ЭтотОбъект), ТекстВопроса,
		РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Нет);

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

&НаКлиенте
Процедура СкрытьПоказатьПароли(Команда)
	
	Если Элементы.ПолучателиПарольАрхива.Видимость Тогда
		Элементы.ПолучателиПарольАрхива.Видимость = Ложь;
		Элементы.ПолучателиПарольАрхива2.Видимость = Истина;
		Элементы.СкрытьПоказатьПароли.Картинка = БиблиотекаКартинок.ВводимыеСимволыСкрыты;
	Иначе
		Элементы.ПолучателиПарольАрхива.Видимость = Истина;
		Элементы.ПолучателиПарольАрхива2.Видимость = Ложь;
		Элементы.СкрытьПоказатьПароли.Картинка = БиблиотекаКартинок.ВводимыеСимволыВидны;
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОтправитьПаролиПоSMS(Команда)
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("АдресПолучателей", ПоместитьПолучателейВХранилище());
	ПараметрыФормы.Вставить("ТипПолучателейРассылки", ТипПолучателейРассылки);
	ПараметрыФормы.Вставить("Ссылка", Ссылка);
	ПараметрыФормы.Вставить("НаименованиеРассылки", НаименованиеРассылки);
	ПараметрыФормы.Вставить("ИдентификаторОбъектаМетаданных", ИдентификаторОбъектаМетаданных);
	ОткрытьФорму("Справочник.РассылкиОтчетов.Форма.SMSРассылкаПаролей", ПараметрыФормы, ЭтотОбъект, , , , ,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)
	ЗаписатьПаролиИСертификатыДляШифрованияВБезопасноеХранилище();
	ИзмененыПаролиСертификаты = Ложь;
	Закрыть();
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОбновитьОтборы()
	
	Если ИспользоватьОтборПарольУстановлен Или ИспользоватьОтборПарольИзменен Или ИспользоватьОтборСертификатУказан
		Или ИспользоватьОтборСертификатИзменен Тогда
		УстановитьОтборы();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

				ПараметрыОтбора = Новый Структура;
				ПараметрыОтбора.Вставить("Получатель", СтрокаПолучатели.Получатель);

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

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

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

&НаСервере
Процедура УстановитьПаролиПолучателейНаСервере(ПереустанавливатьПароли)
	
	СвойстваПароля = Пользователи.СвойстваПароля();
	СвойстваПароля.НаименьшаяДлина = 8;
	СвойстваПароля.Сложный = Истина;
	СвойстваПароля.УчестьНастройки = "ДляПользователей";
	
	Для Каждого СтрокаПолучатели Из Получатели Цикл
		
		Если НЕ ПереустанавливатьПароли И ЗначениеЗаполнено(СтрокаПолучатели.ПарольАрхива) Тогда	
			Продолжить;	
		КонецЕсли;
		
		СтрокаПолучатели.ПарольАрхива = Пользователи.СоздатьПароль(СвойстваПароля);
		СтрокаПолучатели.ПарольИзменен = Истина;
		
		ПараметрыОтбора = Новый Структура;
		ПараметрыОтбора.Вставить("Получатель", СтрокаПолучатели.Получатель);
		
		СтрокиПолучателиБезОтбора = ПолучателиБезОтборов.НайтиСтроки(ПараметрыОтбора);
		Если СтрокиПолучателиБезОтбора.Количество() > 0 Тогда
			ЗаполнитьЗначенияСвойств(СтрокиПолучателиБезОтбора[0], СтрокаПолучатели);
		КонецЕсли;
	
	КонецЦикла;
	
	УстановитьОтборы();
	
КонецПроцедуры

&НаСервере
Процедура УстановитьОтборы()

	ТаблицаПолучателиБезОтборов = РеквизитФормыВЗначение("ПолучателиБезОтборов");

	Построитель = Новый ПостроительЗапроса;
	Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаПолучателиБезОтборов);

	Отбор = Построитель.Отбор;

	УстановленПароль = Отбор.Добавить("ПарольАрхива");
	УстановленПароль.ВидСравнения	= ?(ОтборПарольУстановлен, ВидСравнения.НеРавно, ВидСравнения.Равно);
	УстановленПароль.Значение		= "";
	УстановленПароль.Использование	= ИспользоватьОтборПарольУстановлен;

	НовыйПароль = Отбор.Добавить("ПарольИзменен");
	НовыйПароль.ВидСравнения	= ВидСравнения.Равно;
	НовыйПароль.Значение		= ОтборПарольИзменен;
	НовыйПароль.Использование	= ИспользоватьОтборПарольИзменен;

	Если РассылкаОтчетов.ДоступноШифрованиеВложений() Тогда
		ЗаполненСертификат = Отбор.Добавить("СертификатДляШифрования");
		ЗаполненСертификат.ВидСравнения	 = ?(ОтборСертификатУказан, ВидСравнения.НеРавно, ВидСравнения.Равно);
		ЗаполненСертификат.Значение = Новый (ТаблицаПолучателиБезОтборов.Колонки["СертификатДляШифрования"].ТипЗначения.Типы()[0]);
		ЗаполненСертификат.Использование = ИспользоватьОтборСертификатУказан;

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

	ЗначениеВРеквизитФормы(ТаблицаРезультат, "Получатели");
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПолучателейРассылкиСАдресомЭлектроннойПочты(ТаблицаПолучателей)
	
	ПараметрыПолучателей = РассылкаОтчетовКлиентСервер.ПараметрыПолучателей();
	ПараметрыПолучателей.Ссылка = Ссылка;
	ПараметрыПолучателей.Получатели = ТаблицаПолучателей;
	ПараметрыПолучателей.Автор = Неопределено;
	ПараметрыПолучателей.Личная = Ложь;
	ПараметрыПолучателей.ТипПолучателейРассылки = ИдентификаторОбъектаМетаданных;
	ПараметрыПолучателей.ВидПочтовогоАдресаПолучателей = ВидПочтовогоАдресаПолучателей;
	
	СписокПолучателейРассылки = РассылкаОтчетов.СформироватьСписокПолучателейРассылки(ПараметрыПолучателей, Неопределено);
	
	МассивПолучателей = Новый Массив;
	Для Каждого Получатель Из СписокПолучателейРассылки Цикл
		СтрокаПолучатели = Получатели.Добавить();
		СтрокаПолучатели.Получатель = Получатель.Ключ;
		МассивПолучателей.Добавить(Получатель.Ключ);
		СтрокаПолучатели.АдресЭлектроннойПочты = Получатель.Значение;
	КонецЦикла;
	
	ЗаполнитьПаролиАрхиваИСертификатыДляШифрования(МассивПолучателей);
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСведенияОТипеПолучателей(Отказ)
	ТаблицаТиповПолучателей = РассылкаОтчетовПовтИсп.ТаблицаТиповПолучателей();
	Найденные = ТаблицаТиповПолучателей.НайтиСтроки(Новый Структура("ТипПолучателей", ТипПолучателейРассылки));
	Если Найденные.Количество() = 1 Тогда
		СтрокаПолучатель = Найденные[0];
		ИдентификаторОбъектаМетаданных = СтрокаПолучатель.ИдентификаторОбъектаМетаданных;
	Иначе
		Отказ = Истина;
	КонецЕсли;
КонецПроцедуры

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

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

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

		ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

		Элемент = Элементы.Добавить("ПолучателиСертификатДляШифрования", Тип("ПолеФормы"), Элементы.Получатели);
		Элемент.Заголовок = НСтр("ru = 'Сертификат для шифрования'");
		Элемент.ПутьКДанным = "Получатели.СертификатДляШифрования";
		Элемент.Вид = ВидПоляФормы.ПолеВвода;
		Элемент.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;
		Элемент.Ширина = 30;
		Элемент.КартинкаШапки = БиблиотекаКартинок.Изменить;
		Элемент.ЦветФона = ЦветаСтиля.ФонУправляющегоПоля;
		Элемент.УстановитьДействие("ПриИзменении", "Подключаемый_ПолучателиСертификатДляШифрованияПриИзменении");
		
		МассивТипов = Новый Массив;
		МассивТипов.Добавить(Тип("СправочникСсылка.Пользователи"));
		МассивТипов.Добавить(Тип("СправочникСсылка.ГруппыПользователей"));

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

&НаСервере
Процедура ЗаполнитьОтборыПоУмолчанию()
	
	ОтборПарольУстановлен = Истина;
	ОтборПарольИзменен = Истина;
	ОтборСертификатУказан = Истина;
	ОтборСертификатИзменен = Истина;
	
КонецПроцедуры

&НаСервере
Функция ПоместитьПолучателейВХранилище()
	Возврат ПоместитьВоВременноеХранилище(Получатели.Выгрузить( , "Получатель, ПарольАрхива"), УникальныйИдентификатор);
КонецФункции

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

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