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

файл
&НаКлиенте
Перем СвойстваСертификатов Экспорт;

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Выбрать(Команда)
	
	ТекДанные = Элементы.Сертификаты.ТекущиеДанные;
	
	Если ТекДанные = Неопределено ИЛИ ТекДанные.Уровень <> 1 Тогда
		Возврат;
	Конецесли;
	
	СвойстваСертификата = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(СвойстваСертификатов[ВРег(ТекДанные.Сертификат)], Ложь);
	Если СвойстваСертификата = Неопределено Тогда
		ПоказатьПредупреждение(, "Выбранный сертификат не зарегистрирован в системном хранилище личных сертификатов!");
		Возврат;
	КонецЕсли;
	
	Если НЕ ЭлектронныйДокументооборотСКонтролирующимиОрганамиКлиентСервер.ЭтоФайрФоксХромИлиСафари() Тогда
		СрокИстек = ОбщегоНазначенияКлиент.ДатаСеанса() > СвойстваСертификата.ДействителенПо;
		СрокНеНачался = ОбщегоНазначенияКлиент.ДатаСеанса() < СвойстваСертификата.ДействителенС;
		Если СрокИстек ИЛИ СрокНеНачался Тогда
			ДополнительныеПараметры = Новый Структура("СвойстваСертификата", СвойстваСертификата);
			ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьЗавершение", ЭтотОбъект, ДополнительныеПараметры);
			ТекстВопроса = "Вы уверены, что хотите выбрать сертификат, срок действия которого " + ?(СрокИстек, "истек", "еще не начался") + "?";
			ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	РодительТекущихДанных = Сертификаты.НайтиПоИдентификатору(Элементы.Сертификаты.ТекущаяСтрока).ПолучитьРодителя();
	СвойстваСертификата.Вставить("Организация", РодительТекущихДанных.ОтветственноеЛицо);
	Закрыть(Новый Структура("Выполнено, ВыбранноеЗначение", Истина, СвойстваСертификата));
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура УправлениеДоступностьюКнопокВыбратьИОткрыть()
	
	ПризнакДоступности = (Элементы.Сертификаты.ТекущиеДанные <> Неопределено И Элементы.Сертификаты.ТекущиеДанные.Уровень = 1);
	Элементы.Выбрать.Доступность = ПризнакДоступности;
	Элементы.ОткрытьСертификат.Доступность = ПризнакДоступности;
	
КонецПроцедуры

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

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

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