Документооборот с контролирующими органами / Помощник автоматической настройки новой учетной записи / Модуль формы

файл

&НаКлиенте
Перем ТаблицаИсправлений;

&НаКлиенте
Перем КонтекстЭДОКлиент;

&НаКлиенте
Перем ПараметрыФайлаНастроек;

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

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

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	ТекстПредупреждения = НСтр("ru = 'Прервать работу помощника?'");
	
	ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(
		ЭтотОбъект, 
		Отказ, 
		ЗавершениеРаботы,
		ТекстПредупреждения, 
		"ПрограммноеЗакрытие");
	
КонецПроцедуры

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

	КонецЕсли;
	
	ПереходитьДалее = Истина;
	
КонецПроцедуры


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

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

&НаКлиенте
Процедура ПереключательПараметрыВручнуюПриИзменении(Элемент)
	
	ПараметрыОрганизацииВручную = ?(ПереключательПараметрыВручную = "1", Истина, Ложь);
	УправлениеЭУ(2);
	
КонецПроцедуры

&НаКлиенте
Процедура СертификатШифрованиеФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла.Заголовок = "Укажите файл, содержащий сертификат";
	ДиалогВыбораФайла.Фильтр = "Файла сертификатов (*.cer)|*.cer|Файла сертификатов (*.crt)|*.crt";
	
	ОписаниеОповещения = Новый ОписаниеОповещения("СертификатШифрованиеФайлПослеВыбораФайла", ЭтотОбъект);
	ДиалогВыбораФайла.Показать(ОписаниеОповещения);

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

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

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

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

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

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

&НаКлиенте
Процедура СертификатШифрованиеКонтейнерНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	КонтейнерНачалоВыбора(Элемент);
	
КонецПроцедуры

&НаКлиенте
Процедура СертификатРуководителяКонтейнерНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	КонтейнерНачалоВыбора(Элемент);
	
КонецПроцедуры

&НаКлиенте
Процедура СертификатБухгалтераКонтейнерНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	КонтейнерНачалоВыбора(Элемент);
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура КомандаДалее(Команда)
	
	ИзменитьПорядковыйНомерПерехода(+1);
	
	Если Элементы.ПанельОсновная.ТекущаяСтраница = Элементы.СтраницаОжидания И ПереходитьДалее Тогда
		
		ПодключитьОбработчикОжидания("ОбработчикОжиданияКомандаДалее", 0.1, Истина);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаНазад(Команда)
	
	ИзменитьПорядковыйНомерПерехода(-1);
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаГотово(Команда)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("КомандаГотовоЗавершение", ЭтотОбъект);
	ПрименитьДанныеСтраницы6(ОписаниеОповещения);
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура ОбработчикОжиданияКомандаДалее()
	
	КомандаДалее(Неопределено);
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьПорядковыйНомерПерехода(Итератор)
	
	ОчиститьСообщения();
	
	УстановитьПорядковыйНомерПерехода(ПорядковыйНомерПерехода + Итератор);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьПорядковыйНомерПерехода(Знач Значение)
	
	ЭтоПереходДалее = (Значение > ПорядковыйНомерПерехода);
	
	ПорядковыйНомерПерехода = Значение;
	
	Если ПорядковыйНомерПерехода < 0 Тогда
		
		ПорядковыйНомерПерехода = 0;
		
	КонецЕсли;
	
	ПорядковыйНомерПереходаПриИзменении(ЭтоПереходДалее);
	
КонецПроцедуры

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

		КонецЕсли;
		
	КонецЕсли;
		
КонецПроцедуры

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

&НаКлиенте
Процедура ПорядковыйНомерПереходаПриИзмененииПродолжение(ЭтоПереходДалее)

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


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

&НаКлиенте
Процедура ТаблицаПереходовНоваяСтрока(ПорядковыйНомерПерехода,
									ИмяОсновнойСтраницы,
									ИмяСтраницыНавигации,
									ИмяСтраницыДекорации = "",
									ИмяОбработчикаПриОткрытии = "",
									ИмяОбработчикаПриПереходеДалее = "",
									ИмяОбработчикаПриПереходеНазад = ""
									)
	//
	НоваяСтрока = ТаблицаПереходов.Добавить();
	
	НоваяСтрока.ПорядковыйНомерПерехода = ПорядковыйНомерПерехода;
	НоваяСтрока.ИмяОсновнойСтраницы     = ИмяОсновнойСтраницы;
	НоваяСтрока.ИмяСтраницыДекорации    = ИмяСтраницыДекорации;
	НоваяСтрока.ИмяСтраницыНавигации    = ИмяСтраницыНавигации;
	
	НоваяСтрока.ИмяОбработчикаПриПереходеДалее = ИмяОбработчикаПриПереходеДалее;
	НоваяСтрока.ИмяОбработчикаПриПереходеНазад = ИмяОбработчикаПриПереходеНазад;
	НоваяСтрока.ИмяОбработчикаПриОткрытии      = ИмяОбработчикаПриОткрытии;
	
КонецПроцедуры

&НаКлиенте
Функция ПолучитьКнопкуФормыПоИмениКоманды(ЭлементФормы, ИмяКоманды)
	
	Для Каждого Элемент Из ЭлементФормы.ПодчиненныеЭлементы Цикл
		
		Если ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда
			
			ЭлементФормыПоИмениКоманды = ПолучитьКнопкуФормыПоИмениКоманды(Элемент, ИмяКоманды);
			
			Если ЭлементФормыПоИмениКоманды <> Неопределено Тогда
				
				Возврат ЭлементФормыПоИмениКоманды;
				
			КонецЕсли;
			
		ИначеЕсли ТипЗнч(Элемент) = Тип("КнопкаФормы")
			И СтрНайти(Элемент.ИмяКоманды, ИмяКоманды) > 0 Тогда
			
			Возврат Элемент;
			
		Иначе
			
			Продолжить;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

&НаКлиенте
Функция Подключаемый_Страница2_ПриПереходеДалее(Отказ, ВыполняемоеОповещение)
	
	Если НЕ ПереходВпередВозможен(2) Тогда
		Отказ = Истина;
	КонецЕсли;
	
	ВыполнитьОбработкуОповещения(ВыполняемоеОповещение, Отказ);
	
КонецФункции

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

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

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

&НаКлиенте
Функция Подключаемый_Страница2_ПриОткрытии(Отказ, ПропуститьСтраницу, Знач ЭтоПереходДалее)
	
	УправлениеЭУ(2);
	
КонецФункции

&НаКлиенте
Функция Подключаемый_СтраницаОжидания_ПриПереходеДалее(Отказ, ВыполняемоеОповещение)
	
	ДополнительныеПараметры = Новый Структура("ВыполняемоеОповещение", ВыполняемоеОповещение);
	ОписаниеОповещения = Новый ОписаниеОповещения("ПриПереходеДалееЗавершение", ЭтотОбъект, ДополнительныеПараметры);
	ПрименитьДанные(2, ОписаниеОповещения);
	
КонецФункции

&НаКлиенте
Функция Подключаемый_СтраницаОжидания_ПриОткрытии(Отказ, ПропуститьСтраницу, Знач ЭтоПереходДалее)
	
	Если Не ЭтоПереходДалее Тогда
		
		ПропуститьСтраницу = Истина;
		
	КонецЕсли;
	
КонецФункции

&НаКлиенте
Функция Подключаемый_Страница6_ПриОткрытии(Отказ, ПропуститьСтраницу, Знач ЭтоПереходДалее)
	
	УправлениеЭУ(6);
	
КонецФункции

&НаКлиенте
Процедура ТаблицаПереходовПоСценарию1()
	
	ТаблицаПереходов.Очистить();
	ТаблицаПереходовНоваяСтрока(1, "Страница1", "СтраницаНавигацииНачало", "СтраницаДекорацииНачало");
	ТаблицаПереходовНоваяСтрока(2, "Страница2", "СтраницаНавигацииПродолжение", , "Страница2_ПриОткрытии", "Страница2_ПриПереходеДалее", );
	ТаблицаПереходовНоваяСтрока(3, "СтраницаОжидания", "СтраницаНавигацииОжидание", , "СтраницаОжидания_ПриОткрытии", "СтраницаОжидания_ПриПереходеДалее");
	ТаблицаПереходовНоваяСтрока(4, "Страница4", "СтраницаНавигацииПродолжение", , , "Страница4_ПриПереходеДалее");
	ТаблицаПереходовНоваяСтрока(5, "Страница5", "СтраницаНавигацииПродолжение", , , "Страница5_ПриПереходеДалее");
	ТаблицаПереходовНоваяСтрока(6, "Страница6", "СтраницаНавигацииОкончание", , "Страница6_ПриОткрытии");
	
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПереходовПоСценарию2()
	
	// без сертификатов руководителя и бухгалтера
	ТаблицаПереходов.Очистить();
	ТаблицаПереходовНоваяСтрока(1, "Страница1", "СтраницаНавигацииНачало", "СтраницаДекорацииНачало");
	ТаблицаПереходовНоваяСтрока(2, "Страница2", "СтраницаНавигацииПродолжение", , "Страница2_ПриОткрытии", "Страница2_ПриПереходеДалее", );
	ТаблицаПереходовНоваяСтрока(3, "СтраницаОжидания", "СтраницаНавигацииОжидание", , "СтраницаОжидания_ПриОткрытии", "СтраницаОжидания_ПриПереходеДалее");
	ТаблицаПереходовНоваяСтрока(4, "Страница6", "СтраницаНавигацииОкончание", , "Страница6_ПриОткрытии");
	
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПереходовПоСценарию3()
	
	// без сертификата бухгалтера
	ТаблицаПереходов.Очистить();
	ТаблицаПереходовНоваяСтрока(1, "Страница1", "СтраницаНавигацииНачало", "СтраницаДекорацииНачало");
	ТаблицаПереходовНоваяСтрока(2, "Страница2", "СтраницаНавигацииПродолжение", , "Страница2_ПриОткрытии", "Страница2_ПриПереходеДалее", );
	ТаблицаПереходовНоваяСтрока(3, "СтраницаОжидания", "СтраницаНавигацииОжидание", , "СтраницаОжидания_ПриОткрытии", "СтраницаОжидания_ПриПереходеДалее");
	ТаблицаПереходовНоваяСтрока(4, "Страница4", "СтраницаНавигацииПродолжение", , , "Страница4_ПриПереходеДалее");
	ТаблицаПереходовНоваяСтрока(5, "Страница6", "СтраницаНавигацииОкончание", , "Страница6_ПриОткрытии");
	
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПереходовПоСценарию4()
	// без сертификата руководителя
	ТаблицаПереходов.Очистить();
	ТаблицаПереходовНоваяСтрока(1, "Страница1", "СтраницаНавигацииНачало", "СтраницаДекорацииНачало");
	ТаблицаПереходовНоваяСтрока(2, "Страница2", "СтраницаНавигацииПродолжение", , "Страница2_ПриОткрытии", "Страница2_ПриПереходеДалее", );
	ТаблицаПереходовНоваяСтрока(3, "СтраницаОжидания", "СтраницаНавигацииОжидание", , "СтраницаОжидания_ПриОткрытии", "СтраницаОжидания_ПриПереходеДалее");
	ТаблицаПереходовНоваяСтрока(4, "Страница5", "СтраницаНавигацииПродолжение", , , "Страница5_ПриПереходеДалее");
	ТаблицаПереходовНоваяСтрока(5, "Страница6", "СтраницаНавигацииОкончание", , "Страница6_ПриОткрытии");
	
КонецПроцедуры

&НаКлиенте
Процедура СертификатШифрованиеФайлПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СертификатШифрованиеФайл = ВыбранныеФайлы[0];
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОткрытьФайлПослеЗапускаПриложения(Результат, ДополнительныеПараметры) Экспорт
	
	// Заглушка, т.к. в НачатьЗапускПриложения первый параметр обязательный
    ЭтаПеременнаяЧтобыНеРугаласьПроверкаКонфигурацииНаПустойОбработчик = Неопределено;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьСертификатИзСтроки64(СертификатСтрока64)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьСертификатИзСтроки64ПослеЗаписиВФайл", ЭтотОбъект);
	ОперацииСФайламиЭДКОКлиент.Base64ВФайл(ОписаниеОповещения, СертификатСтрока64, ".cer");
	Возврат;	
	
КонецПроцедуры

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

&НаКлиенте
Процедура УправлениеЭУ(НомерСтраницы)
	
	Если НомерСтраницы = 1 Тогда
		
	ИначеЕсли НомерСтраницы = 2 Тогда
		
		Элементы.ГруппаИННКПП.Доступность = ПараметрыОрганизацииВручную;
		Элементы.Организация.Доступность = НЕ ПараметрыОрганизацииВручную;
		
	ИначеЕсли НомерСтраницы = 3 Тогда
	
	ИначеЕсли НомерСтраницы = 4 Тогда
		
	ИначеЕсли НомерСтраницы = 5 Тогда
		
	ИначеЕсли НомерСтраницы = 6 Тогда
		
		Если ПараметрыОрганизацииВручную Тогда
			
			Элементы.СопоставитьУчетнуюЗаписьОрганизации.Видимость = Ложь;
			
		Иначе
			
			Элементы.СопоставитьУчетнуюЗаписьОрганизации.Заголовок = "Сопоставить учетную запись организации " + Организация;
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

/////////////////////////////////////////////////////////////////////

&НаКлиенте
Функция ПереходВпередВозможен(НомерСтраницы)
	
	Если НомерСтраницы = 1 Тогда
		//не используется
	ИначеЕсли НомерСтраницы = 2 Тогда
		Возврат ПроверитьДанныеСтраницы2();
	ИначеЕсли НомерСтраницы = 3 Тогда
		//не используется
	ИначеЕсли НомерСтраницы = 4 Тогда
		Возврат ПроверитьДанныеСтраницы4();
	ИначеЕсли НомерСтраницы = 5 Тогда
		Возврат ПроверитьДанныеСтраницы5();
	ИначеЕсли НомерСтраницы = 6 Тогда
		//не используется
	КонецЕсли;
	ПереходитьДалее = Истина;
	Возврат Истина;
	
КонецФункции

&НаКлиенте
Процедура ПрименитьДанные(НомерСтраницы, ВыполняемоеОповещение)
	
	Если НомерСтраницы = 1 Тогда
		//не используется
	ИначеЕсли НомерСтраницы = 2 Тогда
		ПрименитьДанныеСтраницы2(ВыполняемоеОповещение);
		Возврат;
	ИначеЕсли НомерСтраницы = 3 Тогда
		//не используется
	ИначеЕсли НомерСтраницы = 4 Тогда
		ПрименитьДанныеСтраницы4(ВыполняемоеОповещение);
		Возврат;
	ИначеЕсли НомерСтраницы = 5 Тогда
		ПрименитьДанныеСтраницы5(ВыполняемоеОповещение);
		Возврат;
	ИначеЕсли НомерСтраницы = 6 Тогда
		ПрименитьДанныеСтраницы6(ВыполняемоеОповещение);
		Возврат;
	КонецЕсли;
	Результат = Истина;
	ПереходитьДалее = Истина;
	ВыполнитьОбработкуОповещения(ВыполняемоеОповещение, Результат);

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

//////////////////////////////////////////////////////////////////

&НаКлиенте
Функция ПроверитьДанныеСтраницы2()
	
	Если ПараметрыОрганизацииВручную Тогда
		СтрИНН = СокрЛП(ИНН);
		СтрКПП = СокрЛП(КПП);
		ДлинаИНН = СтрДлина(СтрИНН);
		ДлинаКПП = СтрДлина(СтрКПП);
		Если ДлинаИНН = 10 Тогда
			Если ДлинаКПП = 0 Тогда
				ПоказатьПредупреждение(, "Укажите КПП.");
				Возврат Ложь;
			ИначеЕсли ДлинаКПП <> 9 Тогда
				ПоказатьПредупреждение(, "Укажите корректный КПП.");
				Возврат Ложь;
			КонецЕсли;
		ИначеЕсли ДлинаИНН = 0 Тогда
			ПоказатьПредупреждение(, "Укажите ИНН" + ?(ДлинаКПП = 0, "\КПП", "") + ".");
			Возврат Ложь;
		ИначеЕсли ДлинаИНН <> 12 Тогда
			ПоказатьПредупреждение(, "Укажите корректный ИНН.");
			Возврат Ложь;
		КонецЕсли;
	Иначе
		Если Организация.Пустая() Тогда
			ПоказатьПредупреждение(, "Укажите организацию.");
			Возврат Ложь;
		КонецЕсли;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

&НаКлиенте
Функция ПроверитьДанныеСтраницы4()
	
	Если НЕ ЗначениеЗаполнено(СертификатРуководителяКонтейнер) Тогда
		ПоказатьПредупреждение(, "Выберите ключевой контейнер!");
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

&НаКлиенте
Функция ПроверитьДанныеСтраницы5()
	
	Если НЕ ЗначениеЗаполнено(СертификатБухгалтераКонтейнер) Тогда
		ПоказатьПредупреждение(, "Выберите ключевой контейнер!");
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

//////////////////////////////////////////////////////////////////

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

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

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

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

&НаКлиенте
Процедура ПоказатьПредупреждениеЗавершение(ВыполняемоеОповещение) Экспорт
	
	ПереходитьДалее = Истина;
	ВыполнитьОбработкуОповещения(ВыполняемоеОповещение, Ложь);
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ЗарегистрироватьСертификатСПривязкойКЗакрытомуКлючу(ВыполняемоеОповещение, Сертификат, СертификатКонтейнер)
	
	Если ТипЗнч(Сертификат) <> Тип("Строка") Тогда
		//Сертификат - это структура с полем Сертификат, где хранится сертификат в виде строки Base64
		
		ДополнительныеПараметры = Новый Структура("ВыполняемоеОповещение, СертификатКонтейнер", ВыполняемоеОповещение, СертификатКонтейнер);
		ОписаниеОповещения = Новый ОписаниеОповещения("ЗарегистрироватьСертификатСПривязкойКЗакрытомуКлючуПослеЗаписиСертификата64ВФайл", ЭтотОбъект, ДополнительныеПараметры);
	
		ОперацииСФайламиЭДКОКлиент.Base64ВФайл(ОписаниеОповещения, Сертификат.Сертификат);
		Возврат;
		
	Иначе
		
		//Сертификат - это имя файла сертификата
		СертификатИмяФайла = Сертификат;
		ЗарегистрироватьСертификатСПривязкойКЗакрытомуКлючуПоИмениФайла(ВыполняемоеОповещение, СертификатИмяФайла, СертификатКонтейнер);
		Возврат;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура УправлениеСтраницамиССертификатами(ТаблицаИсправлений)
	
	// решаем, показывать ли страницу с сертификатом руководителя
	КомандаИзменитьСертификатРуководителя = КонтекстЭДОКлиент.НайтиСтрокуВМассивеСтруктурКлиент(ТаблицаИсправлений, "ИзменитьСертификатРуководителя", "Настройка");
	ПоказыватьСтраницу4 = (КомандаИзменитьСертификатРуководителя <> Неопределено);
	Если ПоказыватьСтраницу4 Тогда
		СвойстваСертификата = КомандаИзменитьСертификатРуководителя.НовоеЗначение;
		СертификатРуководителя = ПредставлениеСертификатаПоСвойствам(СвойстваСертификата);
	КонецЕсли;
	
	// решаем, показывать ли страницу с сертификатом главного бухгалтера
	КомандаИзменитьСертификатГлавногоБухгалтера = КонтекстЭДОКлиент.НайтиСтрокуВМассивеСтруктурКлиент(ТаблицаИсправлений, "ИзменитьСертификатГлавногоБухгалтера", "Настройка");
	ПоказыватьСтраницу5 = (КомандаИзменитьСертификатГлавногоБухгалтера <> Неопределено);
	Если ПоказыватьСтраницу5 Тогда
		СвойстваСертификата = КомандаИзменитьСертификатГлавногоБухгалтера.НовоеЗначение;
		СертификатБухгалтера = ПредставлениеСертификатаПоСвойствам(СвойстваСертификата);
	КонецЕсли;
	
	Если ПоказыватьСтраницу4 И ПоказыватьСтраницу5 Тогда 
		// без сертификатов руководителя и бухгалтера
		ТаблицаПереходовПоСценарию2();
	ИначеЕсли ПоказыватьСтраницу4 Тогда 
		// без сертификата бухгалтера
		ТаблицаПереходовПоСценарию3();
	ИначеЕсли ПоказыватьСтраницу5 Тогда 
		// без сертификата руководителя
		ТаблицаПереходовПоСценарию4();
	Иначе
		ТаблицаПереходовПоСценарию1();
	КонецЕсли;
	
КонецПроцедуры

Функция ПредставлениеСертификатаПоСвойствам(СвойстваСертификата) Экспорт
	
	Если НЕ ЗначениеЗаполнено(СвойстваСертификата) Тогда
		Возврат "<отсутствует>";
	КонецЕсли;
	
	Если ТипЗнч(СвойстваСертификата) = Тип("ТаблицаЗначений") ИЛИ ТипЗнч(СвойстваСертификата) = Тип("Массив") Тогда
		Возврат Формат(СвойстваСертификата.Количество(), "ЧН=") + " сертификатов";
	КонецЕсли;
	
	Наименование = "";
	Владелец = "";
	ДействителенС = "";
	ДействителенПо = "";
	Отпечаток = "";
	
	СвойстваСертификата.Свойство("Наименование", Наименование);
	СвойстваСертификата.Свойство("ИмяВладельца", Владелец);
	СвойстваСертификата.Свойство("ДействителенС", ДействителенС);
	СвойстваСертификата.Свойство("ДействителенПо", ДействителенПо);
	СвойстваСертификата.Свойство("Отпечаток", Отпечаток);
	
	ПредставлениеСертификата = "";
	Если ЗначениеЗаполнено(Наименование) Тогда
		ПредставлениеСертификата = СокрЛП(Наименование);
	ИначеЕсли ЗначениеЗаполнено(Владелец) Тогда
		ПредставлениеСертификата = СокрЛП(Владелец);
	Иначе
		ПредставлениеСертификата = СокрЛП(Отпечаток);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ДействителенС) И ЗначениеЗаполнено(ДействителенПо) Тогда
		ПредставлениеСертификата = ПредставлениеСертификата + " (" + Формат(ДействителенС, "ДФ='dd.MM.yyyy HH:mm'") + " - " + Формат(ДействителенПо, "ДФ='dd.MM.yyyy HH:mm'") + ")";
	КонецЕсли;
	
	Возврат ПредставлениеСертификата;
	
КонецФункции

&НаСервереБезКонтекста
Функция ЗафиксироватьПривязкуВБД(Организация, НоваяУчетнаяЗапись, ТекстПредупреждения)
	
	ОрганизацияОбъект = Организация.ПолучитьОбъект();
	ОрганизацияОбъект.УчетнаяЗаписьОбмена = НоваяУчетнаяЗапись;
	ОрганизацияОбъект.ВидОбменаСКонтролирующимиОрганами = Перечисления.ВидыОбменаСКонтролирующимиОрганами.ОбменВУниверсальномФормате;
	Попытка
		ОрганизацияОбъект.Записать();
	Исключение
		ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru='Не удалось сопоставить вновь созданную учетной запись организации:%1'"),
		Символы.ПС + ИнформацияОбОшибке().Описание);
		Возврат Ложь;
	КонецПопытки;
	Возврат Истина;
	
КонецФункции

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

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