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

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

&НаКлиенте
Перем Криптография, РаботаСДвоичнымиДанными, ПрограммыАвто;

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Не ЗначениеЗаполнено(Параметры.СертификатСсылка) Тогда
		КлючНаТокене = Параметры.НаТокене;
		ВыполнитьПроверкуПравДоступа("Добавление", Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования);
	КонецЕсли;
	
	УстановитьДоступностьВариантовЗаявления();
	
	Если Не ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.ЗаявленияНаВыпускСертификата) Тогда
		ТолькоПросмотрЗаявления = Истина;
	КонецЕсли;
	
	Если ЭлектроннаяПодпись.УправлениеОповещениямиОСертификатах() 
		И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда
		МодульНапоминанияПользователя = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователя");
		ДоступныНапоминанияПользователя = МодульНапоминанияПользователя.ИспользуютсяНапоминанияПользователя();
	КонецЕсли;
	
	Элементы.НаименованиеСокращенное.Видимость = Ложь;
	Элементы.ВладелецСертификатаСтрокой.Видимость = Ложь;
	Элементы.ОчиститьПаспорт.Видимость = Ложь;
	Элементы.ОчиститьСНИЛС.Видимость = Ложь;
	Элементы.ОчиститьДоверенность.Видимость = Ложь;
	
	ЭтоПодчиненныйУзелРИБ = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ();
	ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь();
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		ИнтернетПоддержкаПользователейПодключена = Истина;
	ИначеЕсли ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда
		МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей");
		ИнтернетПоддержкаПользователейПодключена = МодульИнтернетПоддержкаПользователей.ЗаполненыДанныеАутентификацииПользователяИнтернетПоддержки();
	КонецЕсли;
	
	ЗаполнитьЗаголовкиРеквизитов();
	
	Если ЗначениеЗаполнено(Параметры.СертификатСсылка) Тогда
		
		Попытка
			ЗагрузитьЗаявление();
			Если ЗначениеЗаполнено(ДанныеЗаявления.СертификатОснование) Тогда
				ПродлениеСертификатаСтороннегоУЦ = СертификатВыпущенСтороннимУЦ(ДанныеЗаявления.СертификатОснование);
				СертификатОснованиеДействуетДо = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
					ДанныеЗаявления.СертификатОснование, "ДействителенДо");
			КонецЕсли;
			ПриИзмененииОрганизацииНаСервере(Истина);
		Исключение
			РазблокироватьДанныеДляРедактирования(Параметры.СертификатСсылка, УникальныйИдентификатор);
			ВызватьИсключение;
		КонецПопытки;
		
	ИначеЕсли ЗначениеЗаполнено(Параметры.СертификатОснование) Тогда
		ПродлениеСертификатаСтороннегоУЦ = СертификатВыпущенСтороннимУЦ(Параметры.СертификатОснование);
		СкопироватьЗаявление(Параметры.СертификатОснование);
		ПриИзмененииОрганизацииНаСервере(Истина);
	Иначе
		ДокументыПартнерЭтоИП = Ложь;
		
		Объект.Добавил = Пользователи.ТекущийПользователь();
		Объект.Пользователь = Объект.Добавил;
		
		Если ЗаявлениеДляФизическихЛицДоступно
			И ЗначениеЗаполнено(Параметры.ФизическоеЛицо) Тогда
			
			ЭтоФизическоеЛицо = Истина;
			Сотрудник = Параметры.ФизическоеЛицо;
			СозданиеПоПараметруФизическоеЛицо = Истина;
			
		ИначеЕсли ЗаявлениеДляОрганизацийДоступно
			И ЗначениеЗаполнено(Параметры.Организация) Тогда
			
			Организация = Параметры.Организация;
			СозданиеПоПараметруОрганизация = Истина;
		КонецЕсли;
		
		ПриИзмененииОрганизацииНаСервере(Ложь);
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ДанныеЗаявления.СостояниеЗаявления) Тогда
		ДанныеЗаявления.СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.НеПодготовлено;
	КонецЕсли;
	
	УстановитьВидимостьИДоступность();
	УстановитьОтображениеРеквизитовЗависимыхОтВидаПродления();
	
	Если Не ТолькоПросмотрЗаявления
		И ЗначениеЗаполнено(Параметры.СертификатСсылка) 
		И ДанныеЗаявления.СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.Подготовлено
		И Не ЗначениеЗаполнено(ВладелецИНН)
		И Не ЭтоФизическоеЛицо И Не ЭтоИндивидуальныйПредприниматель Тогда
		
		ПриПотереГотовности(ЭтотОбъект, Истина);
		
	Иначе
		Модифицированность = Ложь;
	КонецЕсли;
	
	Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Ложь;
	
	ПодсказкаОбслуживающейОрганизации = СтроковыеФункции.ФорматированнаяСтрока(
		НСтр("ru = 'Узнать контакты партнера можно <a href = ""%1"">на сайте</a>.'"), СсылкаНаКонтактыПартнеров());
	ПодсказкаДляПрограммы = СтроковыеФункции.ФорматированнаяСтрока(
	НСтр("ru = 'Для создания запроса на сертификат используется приложение электронной подписи и шифрования <b>%1</b> или <b>%2</b> или активный ключевой носитель (<b>Рутокен</b> или <b>JaCarta</b>).
		|По вопросам работы приложения обратитесь к его документации или воспользуйтесь <a href=""СсылкаНаСтатьюИТС"">дополнительной инструкцией на сайте 1С</a>.
		|Для работы с <b>Рутокеном</b> скачайте и установите <a href=""СсылкаНаДрайверРутокена"">библиотеку с сайта производителя</a> и вставьте токен в компьютер.
		|Для работы с <b>JaCarta</b> скачайте и установите <a href=""СсылкаНаДрайверJaCarta"">библиотеку с сайта производителя</a> и вставьте токен в компьютер.
		|
		|<b>Ключ электронной подписи</b> - это секретная информация, которая сохраняется на компьютер, флешку, устройство или другой носитель информации и используется в дальнейшем для создания электронных подписей.
		|
		|<b>Запрос на сертификат</b> - это не секретная информация, которая создается на основе ключа электронной подписи, отправляется вместе с заявлением на выпуск сертификата и требуется для выпуска сертификата.'"),
		ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыКриптоПро(),
		ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыVipNet());
	
	Элементы.ДокументыПартнерРасширеннаяПодсказка.Заголовок = ПодсказкаОбслуживающейОрганизации;
	Элементы.ПрограммаРасширеннаяПодсказка.Заголовок = ПодсказкаДляПрограммы;
	Элементы.ПредставлениеПрограммыРасширеннаяПодсказка.Заголовок = ПодсказкаДляПрограммы;
	Элементы.ДекорацияПрограмма.Видимость = Ложь;
	СтандартныеПодсистемыСервер.СброситьРазмерыИПоложениеОкна(ЭтотОбъект);
	
	// СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку") Тогда
		
		МодульОбращенияВТехническуюПоддержкуСлужебный = ОбщегоНазначения.ОбщийМодуль(
			"ОбращенияВТехническуюПоддержкуСлужебный");
		
		МодульОбращенияВТехническуюПоддержкуСлужебный.ПриСозданииНаСервере(ЭтотОбъект);
		
	Иначе
		Элементы.ГруппаОбращенияВТехническуюПоддержку.Видимость = Ложь;
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ОбращенияВТехническуюПоддержку
	
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура РеквизитПриИзменении(Элемент)
	
	ПриПотереГотовности(ЭтотОбъект);
	
	ЭтотОбъект[Элемент.Имя] = СокрЛП(ЭтотОбъект[Элемент.Имя]);
	
КонецПроцедуры

&НаКлиенте
Процедура ЭлектронноеПродлениеПриИзменении(Элемент)
	
	ОчиститьСообщения();
	ПриПотереГотовности(ЭтотОбъект);
	ПодключитьОбработчикОжидания("ЭлектронноеПродлениеПриИзмененииОбработчикОжидания", 0.1, Истина);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОчиститьДокумент(Элемент)
	
	ВидДокумента = Сред(Элемент.Имя, СтрДлина("Очистить") + 1);
	
	Элементы["Выбрать" + ВидДокумента].Заголовок = Новый ФорматированнаяСтрока(
		НСтр("ru = 'выбрать файл'"), , , , "ВыбратьДокумент");
	ЭтотОбъект["АдресФайла" + ВидДокумента] = "";
	Элементы["Очистить" + ВидДокумента].Видимость = Ложь;
	
КонецПроцедуры

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

&НаКлиенте
Асинх Процедура ВыбратьДокументОбработкаНавигационнойСсылкиПродолжение(Элемент, НавигационнаяСсылкаФорматированнойСтроки)
	
	ВыполняетсяУстановкаДополнительныхКомпонент = Ждать ЭлектроннаяПодписьСлужебныйКлиент.ВыполнитьУстановкуДополнительныхКомпонентПослеПроверкиРасширенияРаботыС1СПредприятием();
	Если ВыполняетсяУстановкаДополнительныхКомпонент Тогда
		Возврат;
	КонецЕсли;
	
	Если НавигационнаяСсылкаФорматированнойСтроки = "ВыбратьДокумент" Тогда
		
		ОписаниеОповещения = Новый ОписаниеОповещения("ПослеДобавленияДокумента", ЭтотОбъект, Элемент.Имя);
			
		ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
		ПараметрыЗагрузки.ДействиеПередНачаломПомещенияФайлов = Новый ОписаниеОповещения("ПроверитьФайл", ЭтотОбъект);
		ПараметрыЗагрузки.Диалог.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Сканированные документы (%1)'"), "*.pdf;*.png;*.jpg;*.zip")
			+ "|*.pdf;*.png;*.jpg;*.jpeg;*.zip";
		
		ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
		
		ФайловаяСистемаКлиент.ЗагрузитьФайл(ОписаниеОповещения, ПараметрыЗагрузки);
		
	ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "ОткрытьФайл" Тогда
		
		ВидДокумента = Сред(Элемент.Имя, СтрДлина("Выбрать") + 1);
		
#Если ВебКлиент Тогда
		ФайловаяСистемаКлиент.ОткрытьФайл(ЭтотОбъект["АдресФайла" + ВидДокумента],, Строка(Элемент.Заголовок));
#Иначе
		ФайловаяСистемаКлиент.ОткрытьФайл(Строка(Элемент.Заголовок));
#КонецЕсли
		
	КонецЕсли;
	
КонецПроцедуры

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

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

#Область Организация

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

&НаКлиенте
Процедура ОрганизацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка);
	
КонецПроцедуры

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

&НаКлиенте
Процедура НаименованиеСокращенноеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка, "ОрганизацияТип");
	
КонецПроцедуры

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

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

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

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

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

#Область ВладелецСертификата

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

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

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

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

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

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

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

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

#Область ПодписантЗаявления

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

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

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

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

&НаКлиенте
Процедура ДокументыРуководительОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	ЗначениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка);
	ПодключитьОбработчикОжидания("ОбработчикОжиданияРеквизитыРуководителяПриИзменении", 0.1, Истина);
	
КонецПроцедуры

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

#Область ОбслуживающаяОрганизация

&НаКлиенте
Процедура ДокументыПартнерПриИзменении(Элемент)
	
	Модифицированность = Истина;
	
	ДокументыПартнерСсылка = Неопределено;
	Элементы.ДокументыПартнер.КнопкаОткрытия = Неопределено;
	
	ДокументыПартнер = СокрЛП(ДокументыПартнер);
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ДокументыПартнерОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	ЗначениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка);
	ПодключитьОбработчикОжидания("ОбработчикОжиданияРеквизитыПартнераПриИзменении", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ДокументыПартнерИННПриИзменении(Элемент)
	
	ДокументыПартнерЭтоИП = СтрДлина(ТолькоЦифры(ДокументыПартнерИНН)) > 10;
	Если ДокументыПартнерЭтоИП Тогда
		ОчиститьРеквизит("ДокументыПартнерКПП");
	КонецЕсли;
	
	Модифицированность = Истина;
	Элементы.ДокументыПартнерКПП.Доступность = Не ДокументыПартнерЭтоИП;
	
КонецПроцедуры

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

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

#Область Программа

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

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

		Возврат;
	КонецЕсли;
	
	Если Объект.Программа <> ВыбранноеЗначение Тогда
		ПриПотереГотовности(ЭтотОбъект);
	КонецЕсли;
	
	Объект.Программа = ВыбранноеЗначение;
	ПрограммаИдентификатор = Неопределено;
	УстановитьВидимостьПрограммы();
	ПодключитьОбработчикОжидания("ПослеВыбораПрограммыОбработчикОжидания", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ПрограммаАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	ЗаполнитьДанныеВыбораПрограммы(ДанныеВыбора, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПрограммаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
	
	ЗаполнитьДанныеВыбораПрограммы(ДанныеВыбора, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПрограммаРасширеннаяПодсказкаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Если НавигационнаяСсылка = "СсылкаНаДрайверРутокена" Тогда
		ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("https://www.rutoken.ru/support/download/pkcs/");
	ИначеЕсли НавигационнаяСсылка = "СсылкаНаДрайверJaCarta" Тогда	
		ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("https://aladdin-rd.ru/support/downloads/jacarta/");
	Иначе
		ЭлектроннаяПодписьСлужебныйКлиент.ОткрытьИнструкциюПоРаботеСПрограммами();
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ИнструкцияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если НавигационнаяСсылка <> "КомплектДокументов" Тогда
		Возврат;
	КонецЕсли;
	
	Если ЭтоФизическоеЛицо Тогда
		ТекстПредупреждения = 
		НСтр("ru = 'Комплект документов:
		|1. Заявление на выпуск сертификата (подготовленное на предыдущем шаге).
		|2. Копия документа, удостоверяющего личность физического лица.
		|3. Копия страхового свидетельства обязательного пенсионного страхования (СНИЛС) физического лица или уведомления о регистрации в системе персонифицированного учета (Форма АДИ-РЕГ).'");
	ИначеЕсли ЭтоИндивидуальныйПредприниматель Тогда
		ТекстПредупреждения =
		НСтр("ru = 'Комплект документов:
		|1. Заявление на выпуск сертификата (подготовленное на предыдущем шаге).
		|2. Копия документа, удостоверяющего личность владельца сертификата.
		|3. Копия страхового свидетельства обязательного пенсионного страхования (СНИЛС) владельца сертификата или уведомления о регистрации в системе персонифицированного учета (Форма АДИ-РЕГ).'");
	Иначе
		ТекстПредупреждения = СтроковыеФункцииКлиент.ФорматированнаяСтрока(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Комплект документов:
			|1. Заявление на выпуск сертификата (подготовленное на предыдущем шаге).
			|2. Копия* документа, удостоверяющего личность представителя организации, указанного для выпуска сертификата.
			|3. Копия* страхового свидетельства обязательного пенсионного страхования (СНИЛС) представителя организации, указанного для выпуска сертификата.
			|4. Копия* документа, подтверждающего полномочия представителя организации, указанного для выпуска сертификата (решение собственника, протокол собрания учредителей, выписка ЕГРЮЛ или <a href=""%1"">доверенность</a>).
			|
			|* Копии документов заверяются подписью руководителя и печатью организации.'"),
			СсылкаНаДоверенность()));
	КонецЕсли;
	
	ПоказатьПредупреждение(, ТекстПредупреждения);
	
КонецПроцедуры

&НаКлиенте
Процедура ДекорацияДоверенностьОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СсылкаНаДоверенность());
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ДекорацияОписаниеНажатие(Элемент)
	
	ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("https://portal.1c.ru/applications/31");
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ВопросВПоддержку(Команда)
	
	ВыгрузитьТехническуюИнформацию(Ложь);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

#Область ДействияСЗаявлением

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

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

&НаКлиенте
Функция ЗаявлениеИсполнено()
	
	Возврат ДанныеЗаявления.СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено");
	
КонецФункции

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

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

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

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

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

				КопируемыеСвойства = КопируемыеСвойства + ?(ПустаяСтрока(КопируемыеСвойства), "", ", ") + Реквизит.Ключ;

			КонецЦикла;

			КопируемыеСвойства = КопируемыеСвойства + ", Организация, ЮридическийАдресXML, ТелефонXML";

			Для Каждого Реквизит Из РеквизитыПодписанта() Цикл
				КопируемыеСвойства = КопируемыеСвойства + ", " + Реквизит.Ключ;
			КонецЦикла;

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

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

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

&НаСервере
Функция ЗаявлениеПроверено()
	
	Результат = ПроверитьЗаполнениеОсновныхРеквизитов();
	Результат = ПроверитьЗаполнениеДополнительныхРеквизитов() И Результат;
	
	Возврат Результат;
	
КонецФункции

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

&НаСервере
Процедура ЗаписатьИРазблокироватьОбъект()
	
	ЗаписатьЗаявление();
	РазблокироватьОбъект(Объект.Ссылка, УникальныйИдентификатор);
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура РазблокироватьОбъект(Ссылка, ИдентификаторФормы)
	
	РазблокироватьДанныеДляРедактирования(Ссылка, ИдентификаторФормы);
	
КонецПроцедуры

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

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

&НаСервереБезКонтекста
Функция СостояниеЗаявления(Сертификат)
	Возврат Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.СостояниеЗаявления(Сертификат)
КонецФункции

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ЗаявлениеОтправлено(Форма)
	
	ДанныеЗаявления = Форма.ДанныеЗаявления;
	
	Возврат ЗначениеЗаполнено(ДанныеЗаявления.СостояниеЗаявления)
		И ДанныеЗаявления.СостояниеЗаявления <> ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.НеПодготовлено")
		И ДанныеЗаявления.СостояниеЗаявления <> ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.Подготовлено");
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция СертификатПолучен(Форма)
	
	ДанныеЗаявления = Форма.ДанныеЗаявления;
	
	Возврат ДанныеЗаявления.СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.Исполнено")
		ИЛИ ДанныеЗаявления.СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.ИсполненоСертификатНеУстановлен")
		ИЛИ ДанныеЗаявления.СостояниеЗаявления = ПредопределенноеЗначение("Перечисление.СостоянияЗаявленияНаВыпускСертификата.ИсполненоРаспискаНеОтправлена");
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция СсылкаНаКонтактыПартнеров()
	
	Возврат "https://its.1c.ru/db/aboutitsnew/content/23/hdoc?order[comment]=%D0%97%D0%B0%D0%BA%D0%B0%D0%B7%20%D0%BD%D0%B0%201%D0%A1:%D0%9F%D0%BE%D0%B4%D0%BF%D0%B8%D1%81%D1%8C";
	
КонецФункции

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

#Область ЗаполнениеРеквизитов

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

&НаКлиенте
Процедура ЗначениеОткрытие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Значение = ЭтотОбъект[Элемент.Имя + "Ссылка"];
	
	Если ЗначениеЗаполнено(Значение) Тогда
		ПоказатьЗначение(, Значение);
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ЗначениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ЭтотОбъект[Элемент.Имя + "Ссылка"] = ВыбранноеЗначение;
	
КонецПроцедуры

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

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

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

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

#Область ИзменениеОсновныхРеквизитов

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

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

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

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

&НаКлиенте
Функция СведенияОбОрганизации()
	
	СведенияОбОрганизации = РеквизитыОрганизации();
	СведенияОбОрганизации.Вставить("ТелефонXML");
	СведенияОбОрганизации.Вставить("ЮридическийАдресXML");
	ЗаполнитьЗначенияСвойств(СведенияОбОрганизации, ЭтотОбъект);
	
	Возврат СведенияОбОрганизации;
	
КонецФункции

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

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

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

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

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

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

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

&НаСервере
Процедура ПриИзмененииВидаДокументаНаСервере()
	
	Если ДокументВид = "" Тогда
		ДокументВид = "21";
	КонецЕсли;
	
	Если ДокументВид <> "21" Тогда
		ДокументКодПодразделения = "";
	КонецЕсли;
	
	Если ДокументВид = 91 Тогда
		ДокументВид = "";
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура УстановитьОтображениеРеквизитовЗависимыхОтОрганизацииОбработчикОжидания()
	
	УстановитьОтображениеРеквизитовЗависимыхОтОрганизации();
	
КонецПроцедуры

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

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

	УстановитьРеквизит(Реквизиты, "ДокументВид", Истина);
	УстановитьРеквизит(Реквизиты, "ДокументНомер", ДокументВид = "21");
	УстановитьРеквизит(Реквизиты, "ДокументКемВыдан");
	УстановитьРеквизит(Реквизиты, "ДокументКодПодразделения", Истина);
	УстановитьРеквизит(Реквизиты, "ДокументДатаВыдачи");
	
	Если ЭтоФизическоеЛицо Тогда
		УстановитьРеквизит(Реквизиты, "ВладелецАдресРегистрации", , Истина);
		УстановитьРеквизит(Реквизиты, "ВладелецТелефон", , Ложь);
	Иначе
		ВладелецАдресРегистрации = "";
		ВладелецАдресРегистрацииXML = "";
		ВладелецТелефон = "";
		ВладелецТелефонXML = "";
	КонецЕсли;
	
	УстановитьРеквизит(Реквизиты, "ЭлектроннаяПочта", , Ложь);
	
	ПриИзмененииВидаДокументаНаСервере();
	
	УстановитьОтображениеРеквизитовЗависимыхОтВладельца();
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьОтображениеРеквизитовЗависимыхОтВладельцаОбработчикОжидания()
	
	УстановитьОтображениеРеквизитовЗависимыхОтВладельца();
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура ОчиститьРеквизитыВладельца()
	
	Реквизиты = РеквизитыВладельцаСертификата();
	Реквизиты.Вставить("ГражданствоПредставление");
	Реквизиты.Вставить("ГражданствоОКСМКодАльфа3");
	Реквизиты.Вставить("ВладелецАдресРегистрацииXML");
	Реквизиты.Вставить("ВладелецТелефонXML");
	Реквизиты.Вставить("ЭлектроннаяПочтаXML");
	
	Для Каждого РеквизитВладельца Из Реквизиты Цикл
		ЭтотОбъект[РеквизитВладельца.Ключ] = Неопределено;
	КонецЦикла;
	
КонецПроцедуры

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

&НаСервереБезКонтекста
Функция РеквизитыОрганизации()
	
	Реквизиты = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.РеквизитыОрганизации(Неопределено);
	Возврат Новый Структура(СтрСоединить(Реквизиты.ВыгрузитьЗначения(), ","));
	
КонецФункции

&НаСервереБезКонтекста
Функция РеквизитыОрганизацииСписок(Форма)
	
	Реквизиты = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.РеквизитыОрганизации(Форма);
	Возврат Реквизиты;
	
КонецФункции

&НаСервереБезКонтекста
Функция РеквизитыВладельцаСертификата()
	
	Реквизиты = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.РеквизитыВладельцаСертификата(Неопределено);
	
	Возврат Новый Структура(СтрСоединить(Реквизиты.ВыгрузитьЗначения(), ","));
	
КонецФункции

&НаСервереБезКонтекста
Функция РеквизитыВладельцаСертификатаСписок(Форма)
	
	Реквизиты = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.РеквизитыВладельцаСертификата(Форма);
	
	Возврат Реквизиты;
	
КонецФункции

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

#Область ИзменениеДополнительныхРеквизитов

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

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

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

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

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

			Если ЗначениеЗаполнено(СведенияОбОрганизации.НаименованиеСокращенное)
				И СведенияОбОрганизации.НаименованиеСокращенное <> НаименованиеСокращенное Тогда

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

&НаСервере
Процедура УстановитьРеквизитИзСертификата(Сведения, ИмяСведения, РеквизитыСертификата, ИмяРеквизита)
	
	Если Сведения.Свойство(ИмяСведения) = Неопределено 
		Или РеквизитыСертификата.Свойство(ИмяРеквизита) = Неопределено Тогда
		Возврат; // Заполнение реквизита не внедрено.
	КонецЕсли;
	
	Сведения[ИмяСведения] = РеквизитыСертификата[ИмяРеквизита];
	
КонецПроцедуры

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

&НаСервере
Процедура ОчиститьРеквизитыПодписанта()
	
	РеквизитыПодписанта = РеквизитыПодписанта();
	РеквизитыПодписанта.Вставить("ДокументыРуководительСсылка");
	
	Для Каждого Реквизит Из РеквизитыПодписанта Цикл
		ЭтотОбъект[Реквизит.Ключ] = Неопределено;
	КонецЦикла;
	
КонецПроцедуры

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

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

&НаКлиентеНаСервереБезКонтекста
Функция РеквизитыПодписанта()
	
	Реквизиты = РеквизитыПодписантаСписок(Неопределено);
	Возврат Новый Структура(СтрСоединить(Реквизиты.ВыгрузитьЗначения(), ","));
	
КонецФункции

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

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

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

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

#Область Печать

&НаКлиенте
Функция ОписаниеЗапросаНаКвалифицированныйСертификат(Поля, ТекстОшибки)
	
	Поля = ЗаполнитьПоляСертификата();
	
	СписокПараметров = Новый СписокЗначений;
	СписокПараметров.Добавить("2.5.4.3", Поля.CN);
	СписокПараметров.Добавить("2.5.4.4", Поля.SN);
	СписокПараметров.Добавить("2.5.4.42", Поля.G);
	СписокПараметров.Добавить("2.5.4.6", Поля.C);
	
	Если Поля.Свойство("S") Тогда
		СписокПараметров.Добавить("2.5.4.8", Поля.S);
	КонецЕсли;
	Если Поля.Свойство("L") Тогда
		СписокПараметров.Добавить("2.5.4.7", Поля.L);
	КонецЕсли;
	Если Поля.Свойство("Street") Тогда
		СписокПараметров.Добавить("2.5.4.9", Поля.Street);
	КонецЕсли;
	Если Поля.Свойство("OGRNIP") Тогда
		СписокПараметров.Добавить("1.2.643.100.5", Поля.OGRNIP);
	КонецЕсли;
	Если Поля.Свойство("O") Тогда
			СписокПараметров.Добавить("2.5.4.10", Поля.O);
	КонецЕсли;
	Если Поля.Свойство("OU") Тогда
		СписокПараметров.Добавить("2.5.4.11", Поля.OU);
	КонецЕсли;
	Если Поля.Свойство("T") Тогда
			СписокПараметров.Добавить("2.5.4.12", Поля.T);
	КонецЕсли;
	Если Поля.Свойство("OGRN") Тогда
		СписокПараметров.Добавить("1.2.643.100.1", Поля.OGRN);
	КонецЕсли;
	
	СписокПараметров.Добавить("1.2.643.100.3", Поля.SNILS);
	
	Если Поля.Свойство("INN") Тогда
		СписокПараметров.Добавить("1.2.643.3.131.1.1", Поля.INN);
	КонецЕсли;
	
	Если Поля.Свойство("INNLE") Тогда
		СписокПараметров.Добавить("1.2.643.100.4", Поля.INNLE);
	КонецЕсли;
	
	СписокПараметров.Добавить("1.2.840.113549.1.9.1", Поля.E);
	
	// Подготовка строки запроса.
	
	Свойства = "";
	Для Каждого Параметр Из СписокПараметров Цикл 
		Свойства = Свойства + ",<" + Параметр.Значение + "=" + СокрЛП(Параметр.Представление) + ">";
	КонецЦикла;
	Свойства = Сред(Свойства, 2);
	
	// Использование ключа - Проверка подлинности клиента, Защищенная электронная почта.
	ИспользованиеКлюча = "1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.4"; 
	
	// Для УЦ КриптоПро 2.0 требуется указать шаблон сертификата.
	// Без встроенной лицензии шаблон - "1.2.643.2.2.46.0.8", со встроенной лицензией
	// шаблон - "1.2.643.2.2.50.1.9.8791462.1882306.9191997.3049782.15111.41178" - Калуга-Астрал,
	// "1.2.643.2.2.50.1.9.48013.6498827.11094235.2141279.19877.56253" - 1С.
	
	Если ВключатьЛицензиюКриптоПроВСертификат И ВыбранаПрограммаКриптоПро(ПрограммаИдентификатор, СписокПрограмм, Объект.Программа) Тогда
		ШаблонСертификата = "1.2.643.2.2.50.1.9.48013.6498827.11094235.2141279.19877.56253";
	Иначе
		ШаблонСертификата = "1.2.643.2.2.46.0.8";
	КонецЕсли;
	
	Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		"pRequestInfo:{
		|CertAttrs:{%1}
		|CertEnhKeyUsage:{%2}
		|CertPolicies:{<1.2.643.100.113.1=>}
		|dwKeyUsage:{240}
		|SignTool:{%3}
		|CertTemplate:{%4}
		|IdentKind:{%5}
		|}",
		Свойства,
		ИспользованиеКлюча,
		ПредставлениеПрограммы,
		ШаблонСертификата,
		Поля.IdentKind);

КонецФункции

&НаКлиенте
Функция ЗаполнитьПоляСертификата()
	
	Поля = Новый Структура;
	
	Адрес = АдресСтруктура(?(ЭтоФизическоеЛицо, ВладелецАдресРегистрацииXML, ЮридическийАдресXML));
	
	// Поле CN - общее имя (организация или индивидуальный предприниматель или физическое лицо).
	Если ЭтоИндивидуальныйПредприниматель Или ЭтоФизическоеЛицо Тогда
		ПолеОбщееИмя = СокрП(Фамилия
			+ " " + Имя
			+ " " + Отчество);
	Иначе
		ПолеОбщееИмя = НаименованиеСокращенное;
	КонецЕсли;
	Поля.Вставить("CN", Лев(ПолеОбщееИмя, 255));
	
	// Поле SN - фамилия должностного лица или индивидуального предпринимателя или физического лица.
	ПолеФамилия = Фамилия;
	Поля.Вставить("SN", Лев(ПолеФамилия, 255));
	
	// Поле G - имя и отчество должностного лица или индивидуального предпринимателя или физического лица.
	ПолеОтчество = СокрП(Имя + " " + Отчество);
	
	Поля.Вставить("G", Лев(ПолеОтчество, 255));
		
	// Поле C - страна.
	Поля.Вставить("C", "RU");
		
	// Следующие поля S, L, Street - адрес местонахождения организации или
	// регистрации индивидуального предпринимателя или прописки физического лица (без дома и квартиры).
	// Для физического лица заполнение не обязательно.
	
	Если ЗначениеЗаполнено(ВладелецАдресРегистрацииXML) И ЭтоФизическоеЛицо Или Не ЭтоФизическоеЛицо Тогда
		
		// Поле S (ST) - регион (<код региона> <имя региона>) - наименование субъекта РФ для СКПЭП,
		// например, "77 г. Москва".
		Если ЭтоФизическоеЛицо Тогда
			ТекстОшибки = НСтр("ru = 'Некорректный адрес регистрации физического лица:'") + Символы.ПС;
		Иначе
			ТекстОшибки = НСтр("ru = 'Некорректный адрес регистрации организации:'") + Символы.ПС;
		КонецЕсли;
		
		ПолеРегион = Адрес.КодРегиона + " " + ИмяРегионаРФПоРекомендациямДляСКПЭП(Адрес.КодРегиона, ТекстОшибки);
		Если ЗначениеЗаполнено(ТекстОшибки) Тогда
			Возврат "";
		КонецЕсли;
		Поля.Вставить("S", Лев(ПолеРегион, 255));
			
		// Поле L - населенный пункт:
		// "<округ> и/или <район> и/или <город> и/или <внутригородской район> и/или <населенный пункт>".
		// Например, "<район>, <город>, <населенный пункт>":
		// "Москва г, Зеленоград г, Крюково п", "Москва г, Зеленоград г, Малино п".
		ПолеНаселенныйПункт = Лев(НаселенныйПунктПолностью(Адрес), 255);
		Если ЗначениеЗаполнено(ПолеНаселенныйПункт) Тогда
			Поля.Вставить("L", ПолеНаселенныйПункт);
		КонецЕсли;
		
		// Поле Street - улица:
		// "<улица> и/или <дополнительная территория> и/или <элемент дополнительной территории>, дом, офис".
		ПолеУлица = Лев(ПредставлениеЧастиАдреса(Адрес,
		"Улица,
		|ДополнительнаяТерритория,
		|ЭлементДополнительнойТерритории" + ?(ЭтоФизическоеЛицо, "", ",
		|Здание, Корпуса, Помещения")), 255);
		Если ЗначениеЗаполнено(ПолеУлица) Тогда
			Поля.Вставить("Street", ПолеУлица);
		КонецЕсли;
		
	КонецЕсли;
	
	Если ЭтоИндивидуальныйПредприниматель Тогда
		// Поле OGRNIP - ОГРНИП индивидуального предпринимателя 15 символов.
		Поля.Вставить("OGRNIP", ОГРН);
		
	ИначеЕсли Не ЭтоФизическоеЛицо Тогда
		// Поле O - организация.
		Поля.Вставить("O", Лев(НаименованиеСокращенное, 255));
		
		// Поле OU - обособленное подразделение должностного лица.
		Если ЗначениеЗаполнено(Подразделение) Тогда
			Поля.Вставить("OU", Лев(Подразделение, 255));
		КонецЕсли;
		
		// Поле T - должность должностного лица.
		Поля.Вставить("T", Лев(Должность, 255));
			
		Если ЗначениеЗаполнено(ОГРН) Тогда
			// Поле OGRN - ОГРН юридического лица 13 символов.
			Поля.Вставить("OGRN", ОГРН);
		КонецЕсли;
	КонецЕсли;
	
	// Поле SNILS - СНИЛС должностного лица или индивидуального предпринимателя или физического лица.
	Поля.Вставить("SNILS", СтраховойНомерПФР);
	
	Если ЭтоИндивидуальныйПредприниматель Тогда
		// Поле INN - ИНН индивидуального предпринимателя или физического лица.
		Поля.Вставить("INN", ИНН);
	Иначе
		Если Не ЭтоФизическоеЛицо Тогда
			// Поле INNLE - ИНН организации.
			Поля.Вставить("INNLE", Прав(ИНН, 10));
		КонецЕсли;
		Поля.Вставить("INN", ВладелецИНН);
	КонецЕсли;
	
	// Поле IdentificationKind - способ идентификации заявителя. 0 - при личном присутствии,
	// 1 - с использованием квалифицированной ЭП.
	
	СпособИдентификации = ?(ДанныеЗаявления.ОформленоВЭлектронномВиде, 1, 0);
	Поля.Вставить("IdentKind", СпособИдентификации);
	
	// Поле E - электронная почта должностного лица организации или индивидуального предпринимателя или физического лица.
	Поля.Вставить("E", Лев(ЭлектроннаяПочта, 255));
	
	Возврат Поля;
	
КонецФункции

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

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

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

&НаСервере
Функция ПодготовленныйДокумент()
		
	Макет = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ПолучитьМакет(
		?(ЭтоИндивидуальныйПредприниматель Или ЭтоФизическоеЛицо,
			"ИндивидуальныйПредприниматель", "ЮридическоеЛицо"));
	
	СвойстваУЦ = СвойстваУЦ(ВариантУдостоверяющегоЦентра);
	ЗаполнитьЗначенияСвойств(Макет.Параметры, СвойстваУЦ);
	
	Смещать = ТипСмещенияТабличногоДокумента.ПоВертикали;
	
	Если ЭтоФизическоеЛицо Тогда
		Макет.УдалитьОбласть(Макет.Области.OGRNIP, Смещать);
	
	ИначеЕсли Не ЭтоИндивидуальныйПредприниматель Тогда
		Если Не ДокументыПоляСертификата.Свойство("OU") Тогда
			Макет.УдалитьОбласть(Макет.Области.OU, Смещать);
		КонецЕсли;
		Если Не ДокументыПоляСертификата.Свойство("OGRN") Тогда
			Макет.Область("OGRN").Объединить();
			Макет.Область("OGRN").Объединить();
		КонецЕсли;
	КонецЕсли;
	
	Если Не ЭтоФизическоеЛицо И Не ЭтоИндивидуальныйПредприниматель
		И Не ДокументыПоляСертификата.Свойство("INNLE") Тогда
		Макет.Область("Должность").Объединить();
		Макет.Параметры.INNLE = ДокументыПоляСертификата.INN;
	КонецЕсли;
	
	Если Не ДокументыПоляСертификата.Свойство("L") Тогда
		Макет.УдалитьОбласть(Макет.Области.L, Смещать);
	КонецЕсли;

	Если Не ДокументыПоляСертификата.Свойство("S") Тогда
		Макет.УдалитьОбласть(Макет.Области.S, Смещать);
	КонецЕсли;
	
	Если Не ДокументыПоляСертификата.Свойство("Street") Тогда
		Макет.УдалитьОбласть(Макет.Области.Street, Смещать);
	КонецЕсли;
	
	Документ = Новый ТабличныйДокумент;
	ЗаполнитьЗначенияСвойств(Макет.Параметры, ЭтотОбъект);
	ЗаполнитьЗначенияСвойств(Макет.Параметры, ДокументыПоляСертификата);
	
	Если Не ЭтоФизическоеЛицо И Не ЭтоИндивидуальныйПредприниматель
		И Не ДокументыПоляСертификата.Свойство("INNLE") Тогда
		Макет.Область("Должность").Объединить();
		Макет.Параметры.INNLE = ДокументыПоляСертификата.INN;
	КонецЕсли;
	
	Макет.Параметры.Телефон = ?(ЭтоФизическоеЛицо, ВладелецТелефон, Телефон);
	
	ДокументВидПредставление = ПредставлениеВидаДокумента(ДокументВид);
	ДокументВидПредставление = НРег(Лев(ДокументВидПредставление, 1)) + Сред(ДокументВидПредставление, 2); 
	
	ДокументНомерПредставление =
		?(ДокументВид = "21", ПредставлениеРеквизитаНомерПаспортаРФ(ДокументНомер), ДокументНомер);
	
	ДокументКодПодразделенияПредставление = ПредставлениеРеквизитаДокументКодПодразделения(ДокументКодПодразделения);
	ДокументДатаВыдачиПредставление = ПредставлениеРеквизитаДокументДатаВыдачи(ДокументДатаВыдачи);
	
	Макет.Параметры.УдостоверениеЛичности = ДокументВидПредставление + " " + ДокументНомерПредставление + " "
		+ НСтр("ru = 'от'") + " " + ДокументДатаВыдачиПредставление + " "
		+ НСтр("ru = 'выданный'") + " " + ДокументКемВыдан
		+ ?(ЗначениеЗаполнено(ДокументКодПодразделенияПредставление), ", " + НСтр("ru = 'код подразделения'")
			+ " " + ДокументКодПодразделенияПредставление + "", "");
	
	Если ЭтоИндивидуальныйПредприниматель Или ЭтоФизическоеЛицо Тогда
		Документ.Вывести(Макет);
	Иначе
		Шапка = Макет.ПолучитьОбласть("Шапка");
		Документ.Вывести(Шапка);
		
		Если Должность <> ДокументыРуководительДолжность
			Или СокрЛП(Фамилия + " " + Имя + " " + Отчество) <> СокрЛП(ДокументыРуководитель) Тогда
			
			СогласиеНаОбработкуПД = Макет.ПолучитьОбласть("СогласиеНаОбработкуПД");
			Документ.Вывести(СогласиеНаОбработкуПД);
			
		КонецЕсли;
		
		Подвал = Макет.ПолучитьОбласть("Подвал");
		Документ.Вывести(Подвал);
	КонецЕсли;
	
	Возврат Документ;
	
КонецФункции

&НаСервере
Функция ПечатьИнформацииЗаявления()
	
	Макет = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ПолучитьМакет("ИнформацияЗаявления");
	
	СвойстваУЦ = СвойстваУЦ(ВариантУдостоверяющегоЦентра);
	ЗаполнитьЗначенияСвойств(Макет.Параметры, СвойстваУЦ);
	
	Смещать = ТипСмещенияТабличногоДокумента.ПоВертикали;
	
	Если Не ДокументыПоляСертификата.Свойство("L") Тогда
		Макет.УдалитьОбласть(Макет.Области.L, Смещать);
	КонецЕсли;
	
	Если Не ДокументыПоляСертификата.Свойство("S") Тогда
		Макет.УдалитьОбласть(Макет.Области.S, Смещать);
	КонецЕсли;
	
	Если Не ДокументыПоляСертификата.Свойство("OGRNIP") Тогда
		Макет.УдалитьОбласть(Макет.Области.OGRNIP, Смещать);
	КонецЕсли;
	
	Если Не ДокументыПоляСертификата.Свойство("O") Тогда
		Макет.УдалитьОбласть(Макет.Области.Организация, Смещать);
	КонецЕсли;
	
	Если Не ДокументыПоляСертификата.Свойство("Street") Тогда
		Макет.УдалитьОбласть(Макет.Области.Street, Смещать);
	КонецЕсли;
	
	Документ = Новый ТабличныйДокумент;
	
	Макет.Параметры.ЗаголовокШапки = НСтр("ru = 'Сведения о заявлении и владельце сертификата'");
	Если ВключатьЛицензиюКриптоПроВСертификат Тогда
		Макет.Параметры.ЛицензияКриптоПро = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Включить в сертификат лицензию %1'"),
			ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыКриптоПро());
	КонецЕсли;
	
	ЗаполнитьЗначенияСвойств(Макет.Параметры, ЭтотОбъект);
	ЗаполнитьЗначенияСвойств(Макет.Параметры, ДокументыПоляСертификата);
	
	ДокументВидПредставление = ПредставлениеВидаДокумента(ДокументВид);
	ДокументВидПредставление = НРег(Лев(ДокументВидПредставление, 1)) + Сред(ДокументВидПредставление, 2);
	
	ДокументНомерПредставление =
		?(ДокументВид = "21", ПредставлениеРеквизитаНомерПаспортаРФ(ДокументНомер), ДокументНомер);
	
	ДокументКодПодразделенияПредставление = ПредставлениеРеквизитаДокументКодПодразделения(ДокументКодПодразделения);
	ДокументДатаВыдачиПредставление = ПредставлениеРеквизитаДокументДатаВыдачи(ДокументДатаВыдачи);
	
	Макет.Параметры.УдостоверениеЛичности = ДокументВидПредставление + " " + ДокументНомерПредставление + " "
		+ НСтр("ru = 'от'") + " " + ДокументДатаВыдачиПредставление + " "
		+ НСтр("ru = 'выданный'") + " " + ДокументКемВыдан
		+ ?(ЗначениеЗаполнено(ДокументКодПодразделенияПредставление), ", " + НСтр("ru = 'код подразделения'")
			+ " " + ДокументКодПодразделенияПредставление + "", "");
	Макет.Параметры.ИдентификаторАбонента = ДанныеЗаявления.ИдентификаторАбонента;
	
	Документ.Вывести(Макет);
	
	Возврат Документ;
	
КонецФункции

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

		ДанныеУЦ = СертификатКриптографии.ДополненияСертификата.Получить("1.2.643.100.112");
		Если ДанныеУЦ <> Неопределено И ДанныеУЦ.Количество() = 4 Тогда
			РасширенныеДанныеДляПечатиСертификата.СКЗИ = ДанныеУЦ[0];
			РасширенныеДанныеДляПечатиСертификата.СКЗИ_УЦ = ДанныеУЦ[1];
			РасширенныеДанныеДляПечатиСертификата.Заключение = ДанныеУЦ[2];
			РасширенныеДанныеДляПечатиСертификата.ЗаключениеУЦ = ДанныеУЦ[3];
		КонецЕсли;
		
		Если ЗначениеЗаполнено(СертификатКриптографии.УниверсальнаяДатаНачалаЗакрытогоКлюча) И ЗначениеЗаполнено(
			СертификатКриптографии.УниверсальнаяДатаОкончанияЗакрытогоКлюча) Тогда

			Макет.Параметры.ПериодДействияЗакрытогоКлюча = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 по %2'"), Формат(СертификатКриптографии.УниверсальнаяДатаНачалаЗакрытогоКлюча, НСтр(
				"ru = 'ДФ=''dd MMMM yyyy ""г."" H:mm:ss'''")), Формат(
				СертификатКриптографии.УниверсальнаяДатаОкончанияЗакрытогоКлюча, НСтр("ru = 'ДФ=''dd MMMM yyyy ""г."" H:mm:ss'''")));

		КонецЕсли;
		Макет.Параметры.Алгоритм = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПредставлениеАлгоритмаПодписи(
				СвойстваСертификата.АлгоритмОткрытогоКлюча, Истина, Истина);
	Иначе
		
		РасширенныеДанныеДляПечатиСертификата = ЭлектроннаяПодписьСлужебный.РасширенныеДанныеДляПечатиСертификата(
			ДанныеСертификата);

		Если ЗначениеЗаполнено(СвойстваСертификата.ДатаНачалаЗакрытогоКлюча) И ЗначениеЗаполнено(
			СвойстваСертификата.ДатаОкончанияЗакрытогоКлюча) Тогда

			Макет.Параметры.ПериодДействияЗакрытогоКлюча = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '%1 по %2'"), Формат(СвойстваСертификата.ДатаНачалаЗакрытогоКлюча
					- ЭлектроннаяПодписьСлужебный.РазницаСУниверсальнымВременем(), НСтр(
					"ru = 'ДФ=''dd MMMM yyyy ""г."" H:mm:ss'''")), Формат(
					СвойстваСертификата.ДатаОкончанияЗакрытогоКлюча
					- ЭлектроннаяПодписьСлужебный.РазницаСУниверсальнымВременем(), НСтр(
					"ru = 'ДФ=''dd MMMM yyyy ""г."" H:mm:ss'''")));

		КонецЕсли;
		
		Макет.Параметры.Алгоритм = ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписиСертификата(
			АдресСертификата, Истина);
		
	КонецЕсли;

	ЗаполнитьЗначенияСвойств(Макет.Параметры, РасширенныеДанныеДляПечатиСертификата);

	ТипИдентификацииДляПечати = "";
	Если РасширенныеДанныеДляПечатиСертификата.ТипИдентификации = 0 Тогда
		ТипИдентификацииДляПечати = НСтр("ru = 'При личном присутствии'");
	ИначеЕсли РасширенныеДанныеДляПечатиСертификата.ТипИдентификации = 1 Тогда
		ТипИдентификацииДляПечати = НСтр("ru = 'Без личного присутствия с использованием квалифицированной электронной подписи'");
	КонецЕсли;
	
	Макет.Параметры.СерийныйНомер = СвойстваСертификата.СерийныйНомер;
	Макет.Параметры.ПериодДействия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = '%1 по %2'"), 
		Формат(СертификатКриптографии.ДатаНачала, НСтр("ru = 'ДФ=''dd MMMM yyyy ""г."" H:mm:ss'''")),
		Формат(СертификатКриптографии.ДатаОкончания, НСтр("ru = 'ДФ=''dd MMMM yyyy ""г."" H:mm:ss'''")));
	
	Макет.Параметры.НаименованиеУЦ = СвойстваИздателяСертификата.ОбщееИмя;
	Макет.Параметры.АдресУЦ = АдресИзСертификатаКриптографии(СвойстваИздателяСертификата);
		
	Смещать = ТипСмещенияТабличногоДокумента.ПоВертикали;
	
	Если ЗначениеЗаполнено(СвойстваСубъектаСертификата.ИННЮЛ)
	 Или СтрДлина(СвойстваСубъектаСертификата.ИНН) = 10
	 Или СтрНачинаетсяС(СвойстваСубъектаСертификата.ИНН, "00") Тогда
		Макет.Параметры.Наименование = СвойстваСубъектаСертификата.Организация;
		Макет.Параметры.ОГРН = СвойстваСубъектаСертификата.ОГРН;
		Макет.Параметры.ИННЮЛ = ?(ЗначениеЗаполнено(СвойстваСубъектаСертификата.ИННЮЛ),
									СвойстваСубъектаСертификата.ИННЮЛ,
									СвойстваСубъектаСертификата.ИНН); 
		Макет.Параметры.Адрес = АдресИзСертификатаКриптографии(СвойстваСубъектаСертификата);
		Макет.Параметры.Должность = СвойстваСубъектаСертификата.Должность;
		Макет.УдалитьОбласть(Макет.Области.ОГРНИП, Смещать);
		Макет.Параметры.ИНН = ?(ЗначениеЗаполнено(СвойстваСубъектаСертификата.ИННЮЛ),
									СвойстваСубъектаСертификата.ИНН, "");
	Иначе
		Макет.УдалитьОбласть(Макет.Области.СведенияЮЛ, Смещать);
		Макет.УдалитьОбласть(Макет.Области.УполномоченноеЛицо, Смещать);
		Если Не ЗначениеЗаполнено(СвойстваСубъектаСертификата.ОГРНИП) Тогда
			Макет.УдалитьОбласть(Макет.Области.ОГРНИП, Смещать);
		Иначе
			Макет.Параметры.ОГРНИП = СвойстваСубъектаСертификата.ОГРНИП;
		КонецЕсли;
		Макет.Параметры.ИНН = СвойстваСубъектаСертификата.ИНН;
	КонецЕсли;

	Макет.Параметры.ФИО = СокрЛП(СтрШаблон("%1 %2 %3",
			СвойстваСубъектаСертификата.Фамилия,
			СвойстваСубъектаСертификата.Имя,
			СвойстваСубъектаСертификата.Отчество));
	Макет.Параметры.СНИЛС = СвойстваСубъектаСертификата.СНИЛС;
	
	Если ПустаяСтрока(ТипИдентификацииДляПечати) Тогда
		Макет.УдалитьОбласть(Макет.Области.ТипИдентификации, Смещать);
	Иначе
		Макет.Параметры.ТипИдентификации = ТипИдентификацииДляПечати;
	КонецЕсли;
	
	Макет.Параметры.Класс = НСтр("ru = 'Класс средства ЭП КС1 (OID 1.2.643.100.113.1); Класс средства ЭП КС2 (OID 1.2.643.100.113.2)'");
	Макет.Параметры.КлассУЦ = НСтр("ru = 'КС2'");
	Макет.Параметры.ОбластьИспользования = НСтр("ru = 'Цифровая подпись, Неотрекаемость, Шифрование ключей, Шифрование данных'");
	Макет.Параметры.ОткрытыйКлюч = СертификатКриптографии.ОткрытыйКлюч;	
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.Вывести(Макет);
	
	Возврат ТабличныйДокумент;
	
КонецФункции

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

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

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

&НаКлиенте
Асинх Процедура СоздатьКлючИЗапросНаСертификатНаТокене()
	
	Контекст = Новый Структура;
	
	Контекст.Вставить("ПоляСертификата", ЗаполнитьПоляСертификата());
	
	Найдено = СписокТокенов.НайтиСтроки(Новый Структура("ПрограммаИдентификатор", ПрограммаИдентификатор));
	Если Найдено.Количество() = 0 Тогда
		Ждать ЗаполнитьСписокУстройств();
	КонецЕсли;
	Найдено = СписокТокенов.НайтиСтроки(Новый Структура("ПрограммаИдентификатор", ПрограммаИдентификатор));
	Если Найдено.Количество() = 0 Тогда
		Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1: %2.
			|%3'"), ПредставлениеПрограммы, ОшибкаНеНайденТокен(), РекомендацииДляТокена());
		ОткрытьФормуОшибки(НовыйОписаниеОшибки(НСтр("ru = 'Создание ключа электронной подписи'"), Ошибка));
		ОбработатьЗаявлениеПослеСозданияКлючаИЗапросаНаСертификат(Ложь, Контекст);
		Возврат;
	КонецЕсли;
	
	СвойстваТокена = Найдено[0];
	
	Если ЗначениеЗаполнено(СвойстваТокена.Ошибка) Тогда
		
		ОткрытьФормуОшибки(НовыйОписаниеОшибки(НСтр("ru = 'Создание ключа электронной подписи'"), СвойстваТокена.Ошибка));
		ОбработатьЗаявлениеПослеСозданияКлючаИЗапросаНаСертификат(Ложь, Контекст);
		
		Возврат;
	КонецЕсли;
	
	ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Для создания ключа электронной подписи требуется установка внешней компоненты %1.'"), "ExtraCryptoAPI");
	
	Попытка
		ОбъектКомпоненты = Ждать ЭлектроннаяПодписьСлужебныйКлиент.ОбъектВнешнейКомпонентыExtraCryptoAPI(Истина, ТекстПояснения);
	Исключение
		Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		ОткрытьФормуОшибки(НовыйОписаниеОшибки(НСтр("ru = 'Создание ключа электронной подписи'"), Ошибка));
		ОбработатьЗаявлениеПослеСозданияКлючаИЗапросаНаСертификат(Ложь, Контекст);
		Возврат;
	КонецПопытки;
	
	Контекст.Вставить("ОбъектКомпоненты", ОбъектКомпоненты);
	Контекст.Вставить("СвойстваТокена", СвойстваТокена);
	Ждать ЭлектроннаяПодписьКлиентЛокализация.ОчиститьОшибкиКомпоненты(ОбъектКомпоненты);
	
	Попытка
		НастройкиТокена = Ждать ОбъектКомпоненты.PKCS11ПолучитьНастройкиБэкендаПоУмолчаниюАсинх(СвойстваТокена.Токен);
		Ждать ЭлектроннаяПодписьКлиентЛокализация.ОшибкаКомпоненты(ОбъектКомпоненты);
		НастройкиТокена = НастройкиТокена.Значение;
	Исключение
		Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		ОткрытьФормуОшибки(НовыйОписаниеОшибки(НСтр("ru = 'Создание ключа электронной подписи'"), Ошибка));
		ОбработатьЗаявлениеПослеСозданияКлючаИЗапросаНаСертификат(Ложь, Контекст);
		Возврат;
	КонецПопытки;
	
	Попытка
		Ждать ОбъектКомпоненты.PKCS11ИнициализацияАсинх(НастройкиТокена);
	Исключение
		Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		ОткрытьФормуОшибки(НовыйОписаниеОшибки(НСтр("ru = 'Создание ключа электронной подписи'"), Ошибка));
		ОбработатьЗаявлениеПослеСозданияКлючаИЗапросаНаСертификат(Ложь, Контекст);
		Возврат;
	КонецПопытки;
	
	Ждать ОбъектКомпоненты.ПолучитьСписокОшибокАсинх();

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

&НаКлиенте
Функция ОшибкаНеНайденТокен()
	Возврат ЭлектроннаяПодписьСлужебныйКлиент.ОшибкаНеНайденТокен();
КонецФункции

&НаКлиенте
Асинх Процедура ПродолжитьПослеВводаПинКода(ПинКод, Контекст) Экспорт
	
	Если ПинКод = Неопределено Тогда 
		ОбработатьЗаявлениеПослеСозданияКлючаИЗапросаНаСертификат(Ложь, Контекст);
		Возврат;
	КонецЕсли;
	
	ОбъектКомпоненты = Контекст.ОбъектКомпоненты; 
	СвойстваТокена = Контекст.СвойстваТокена;
	
	Если Не ЗначениеЗаполнено(КонтейнерКлючаИмя) Тогда
		
		КонтейнерКлючаИмя =  Прав(СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""), 32);
		
		ТипМеханизмаГенерацииКлючевойПары = СвойстваТокена.ТипМеханизмаГенерацииКлючевойПары; 
		Ждать ЭлектроннаяПодписьКлиентЛокализация.ОчиститьОшибкиКомпоненты(ОбъектКомпоненты);
		
		Попытка
			Результат = Ждать ОбъектКомпоненты.PKCS11СоздатьКлючевуюПаруАсинх(СвойстваТокена.Слот, ПинКод, ТипМеханизмаГенерацииКлючевойПары, КонтейнерКлючаИмя);
			Ждать ЭлектроннаяПодписьКлиентЛокализация.ОшибкаКомпоненты(ОбъектКомпоненты);
		Исключение
			Ошибка = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
			КонтейнерКлючаИмя = "";
			ОткрытьФормуОшибки(НовыйОписаниеОшибки(НСтр("ru = 'Создание ключа электронной подписи'"), Ошибка));
			ОбработатьЗаявлениеПослеСозданияКлючаИЗапросаНаСертификат(Ложь, Контекст);
			Возврат;
		КонецПопытки;
		
	КонецЕсли;
	
	Атрибуты = Новый Соответствие;
	Атрибуты.Вставить("2.5.4.3", СтрШаблон("UTF8String:%1", Контекст.ПоляСертификата.CN));
	Атрибуты.Вставить("2.5.4.4",  СтрШаблон("UTF8String:%1",  Контекст.ПоляСертификата.SN));
	Атрибуты.Вставить("2.5.4.42", СтрШаблон("UTF8String:%1",  Контекст.ПоляСертификата.G));
	Атрибуты.Вставить("1.2.643.100.3",  Контекст.ПоляСертификата.SNILS);
	Атрибуты.Вставить("1.2.643.3.131.1.1",  Контекст.ПоляСертификата.INN);
	Атрибуты.Вставить("2.5.4.6", "RU");
	Атрибуты.Вставить("1.2.840.113549.1.9.1",  Контекст.ПоляСертификата.E);
	
	АтрибутыJSON = СтрокаJSON(Атрибуты);
	
	РасширенныеАтрибуты = Новый Соответствие;
	РасширенныеАтрибуты.Вставить("keyUsage", "digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment");
	РасширенныеАтрибуты.Вставить("extendedKeyUsage", "1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.4");
	РасширенныеАтрибуты.Вставить("certificatePolicies", "1.2.643.100.113.1");  
	РасширенныеАтрибуты.Вставить("1.2.643.100.111", СтрШаблон("ASN1:UTF8String:%1", ИмяСредства(СвойстваТокена.Токен)));
	РасширенныеАтрибуты.Вставить("1.3.6.1.4.1.311.21.7", "DER:30:10:06:08:2A:85:03:02:02:2E:00:08:02:01:01:02:01:00"); //CertTemplate  
	РасширенныеАтрибуты.Вставить("1.2.643.100.114", СтрШаблон("DER:02:01:0%1",  Контекст.ПоляСертификата.IdentKind));
	
	РасширенныеАтрибутыJSON =  СтрокаJSON(РасширенныеАтрибуты);
	
	Ждать ЭлектроннаяПодписьКлиентЛокализация.ОчиститьОшибкиКомпоненты(ОбъектКомпоненты);
	
	Попытка
		
		РезультатЗапрос = Ждать ОбъектКомпоненты.PKCS11СоздатьCSRАсинх(СвойстваТокена.Слот, ПинКод, КонтейнерКлючаИмя, АтрибутыJSON, РасширенныеАтрибутыJSON);
		РезультатОткрытыйКлюч = Ждать ОбъектКомпоненты.PKCS11ПолучитьОткрытыйКлючАсинх(СвойстваТокена.Слот, ПинКод, КонтейнерКлючаИмя);
		Ждать ЭлектроннаяПодписьКлиентЛокализация.ОшибкаКомпоненты(ОбъектКомпоненты);
		
	Исключение 
		
		Ошибка =  ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		ОткрытьФормуОшибки(НовыйОписаниеОшибки(НСтр("ru = 'Создание ключа электронной подписи'"), Ошибка));
		ОбработатьЗаявлениеПослеСозданияКлючаИЗапросаНаСертификат(Ложь, Контекст);
		Возврат;
		
	КонецПопытки;
	
	Контекст.Вставить("ТекущаяОткрытаяЧастьКлючаЭП", ПолучитьHexСтрокуИзДвоичныхДанных(РезультатОткрытыйКлюч.Значение));
	Контекст.Вставить("ТекущийИКС", ИдентификаторКлючаСубъектаHexСтрокой(Контекст.ТекущаяОткрытаяЧастьКлючаЭП));
	Контекст.Вставить("ИмяФайлаЗапроса", РезультатЗапрос.Значение);
	Контекст.Вставить("ПомещаемыеФайлы", Новый Массив);
	Контекст.Вставить("ЗапросСоздан", Истина);
	
	Контекст.ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(РезультатЗапрос.Значение));
	
	Вызовы = Новый Массив;
	ДобавитьВызов(Вызовы, "НачатьПомещениеФайлов", Контекст.ПомещаемыеФайлы, Неопределено, Ложь, УникальныйИдентификатор);
	ДобавитьВызов(Вызовы, "НачатьУдалениеФайлов",  Контекст.ИмяФайлаЗапроса, Неопределено);
	
	НачатьЗапросРазрешенияПользователя(Новый ОписаниеОповещения(
		"СоздатьКлючИЗапросНаСертификатНаТокенеПослеПолученияРазрешений", ЭтотОбъект, Контекст), Вызовы);

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

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

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

&НаКлиенте
Асинх Процедура СоздатьКлючИЗапросНаСертификатНаТокенПослеПомещенияФайлов(ПомещенныеФайлы, Контекст) Экспорт
	
	Если Не ЗначениеЗаполнено(ПомещенныеФайлы) Тогда
		Контекст.ЗапросСоздан = Ложь;
		Контекст.Вставить("Файл", Новый Файл(Контекст.ИмяФайлаЗапроса));
		СоздатьКлючИЗапросНаСертификатЗавершение(Контекст);
		Возврат;
	КонецЕсли;
	
	Модифицированность         = Истина;
	ДокументыПоляСертификата = Контекст.ПоляСертификата;
	АдресЗапросаНаСертификат   = ПомещенныеФайлы[0].Хранение;
	ОткрытаяЧастьКлючаЭП = ПредставлениеДвоичныхДанных(Контекст.ТекущаяОткрытаяЧастьКлючаЭП);
	ИдентификаторКлючаСубъекта = ПредставлениеДвоичныхДанных(Контекст.ТекущийИКС);
	ДатаЗаявления = Формат(ОбщегоНазначенияКлиент.ДатаСеанса(), "ДФ=dd.MM.yyyy"); // АПК:335 Не локализуется (формат веб-сервиса).
	Попытка
		Ждать УдалитьФайлыАсинх(Контекст.ИмяФайлаЗапроса);
	Исключение
		ИмяСобытия = НСтр("ru = 'Электронная подпись.Заявление на выпуск сертификата'",
			ОбщегоНазначенияКлиент.КодОсновногоЯзыка());
		ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытия, "Ошибка",
			НСтр("ru = 'Не удалось удалить файл запроса на сертификат.'") + Символы.ПС 
			+ ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина);
	КонецПопытки;
	
	ОбработатьЗаявлениеПослеСозданияКлючаИЗапросаНаСертификат(Истина, Контекст);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция СтрокаJSON(Данные)
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, Данные);
	
	Возврат ЗаписьJSON.Закрыть();
	
КонецФункции

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

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

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

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

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

#Область ОтправкаЗаявления

&НаКлиенте
Процедура ПроверитьДоступностьОтправки(ЭтоПроверкаПередОтправкой = Ложь)
	
	Если Не ЭтоФизическоеЛицо И Не ЭтоИндивидуальныйПредприниматель
		И ЗаявлениеДляСотрудниковЮридическихЛицДоступно И Не ЗаявлениеДляРуководителейЮридическихЛицДоступно Тогда
		
		// Заявление для сотрудников юридических лиц.
		
		ПоказыватьИнформациюОДоступностиОтправкиЗаявления = ОбщегоНазначенияКлиент.ХранилищеОбщихНастроекЗагрузить(
			"ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата",
			"ПоказыватьИнформациюОДоступностиВыпускаСертификатаДляРуководителей", Истина);
		
		Если Не ПоказыватьИнформациюОДоступностиОтправкиЗаявления Тогда
			Если ЭтоПроверкаПередОтправкой Тогда
				ОтправитьЗаявлениеПродолжениеПроверок();
			КонецЕсли;
			Возврат;
		КонецЕсли;
		
		ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПоказаИнформацииОДоступностиВыпускаСертификата", ЭтотОбъект,
			ЭтоПроверкаПередОтправкой);
			
		ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'В соответствии с Федеральным законом от 06.04.2011 N 63-ФЗ ""Об электронной подписи""
					|выпуск квалифицированных сертификатов в коммерческих удостоверяющих центрах более недоступен для лиц,
					|имеющих право действовать от имени юридического лица без доверенности.
					|Выпуск сертификатов для таких лиц осуществляется %1.
					|Заявления принимаются только для сотрудников, действующих по доверенности.'"),
					СсылкаНаСайтФНС(НСтр("ru = 'Удостоверяющим центром ФНС'")));
		
		ПараметрыФормы = Новый Структура("ТекстСообщения, ЭтоПроверкаПередОтправкой",
			ТекстСообщения, ЭтоПроверкаПередОтправкой);
		
		ОткрытьФорму("Обработка.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.Форма.ИнформацияОДоступностиВыпуска",
			ПараметрыФормы, ЭтотОбъект, Истина,,,ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		
	ИначеЕсли ЭтоИндивидуальныйПредприниматель И Не ЗаявлениеДляИндивидуальныхПредпринимателейДоступно Тогда

		ТекстСообщения = СтроковыеФункцииКлиент.ФорматированнаяСтрока(
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'В соответствии с Федеральным законом от 06.04.2011 N 63-ФЗ ""Об электронной подписи""
				|выпуск квалифицированных сертификатов в коммерческих удостоверяющих центрах более недоступен для индивидуальных предпринимателей.
				|Получите новый сертификат в %1.'"), СсылкаНаСайтФНС(НСтр("ru = 'Удостоверяющем центре ФНС'"))));
		ПоказатьПредупреждение(, ТекстСообщения);
		Возврат;
		
	ИначеЕсли Не ЭтоФизическоеЛицо И Не ЭтоИндивидуальныйПредприниматель 
		И Не ЗаявлениеДляСотрудниковЮридическихЛицДоступно И Не ЗаявлениеДляРуководителейЮридическихЛицДоступно Тогда
		
		ТекстСообщения = СтроковыеФункцииКлиент.ФорматированнаяСтрока(
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'В соответствии с Федеральным законом от 06.04.2011 N 63-ФЗ ""Об электронной подписи""
					|выпуск квалифицированных сертификатов в коммерческих удостоверяющих центрах более недоступен для юридических лиц.
					|Получите новый сертификат в %1.'"), СсылкаНаСайтФНС(НСтр("ru = 'Удостоверяющем центре ФНС'"))));
			ПоказатьПредупреждение(, ТекстСообщения);
			Возврат;
		
	ИначеЕсли ЭтоПроверкаПередОтправкой Тогда
		
		ОтправитьЗаявлениеПродолжениеПроверок();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Функция СсылкаНаСайтФНС(ТекстСсылки)
	
	Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("<a href=""%1"">%2</a>",
		"https://www.nalog.gov.ru/rn77/related_activities/ucfns/el_sign_getting/", ТекстСсылки);
	
КонецФункции

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

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

#Область ОтправкаЗаявленияВБумажномВиде

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

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

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

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

&НаКлиенте
Процедура ОтправитьЗаявлениеПослеПредупреждения(Результат, ДополнительныеПараметры) Экспорт
	
	ОтправитьЗаявлениеВБумажномВидеПродолжение("Отправить", Неопределено);
	
КонецПроцедуры

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

#Область ОтправкаЗаявленияВЭлектронномВиде

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

&НаКлиенте
Процедура ПродолжитьОтправкуЗаявлениеНаПродлениеСертификатаСтороннегоУЦ()
	
	Оповещение = Новый ОписаниеОповещения("СформироватьИОтправитьФайлыЗаявления", ЭтотОбъект);
	ПроверитьИнтернетПоддержку(Оповещение);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура СформироватьИОтправитьФайлыЗаявления(Результат, ДополнительныеПараметры) Экспорт
	
	Если ТипЗнч(Результат) <> Тип("Структура") Тогда
		ИнтернетПоддержкаПользователейПодключена = Ложь;
		Возврат;
	КонецЕсли;
	
	ОписаниеОшибки = НовыйОписаниеОшибки();
	ЗаявлениеXML = ЗаявлениеXMLДляЭлектронногоПродления(ОписаниеОшибки);
	
	Если ЗаявлениеXML = Неопределено Тогда
		
		Если ИнтернетПоддержкаПользователейПодключена Тогда
			ОбработкаПродолжения = Неопределено;
		Иначе
			
			ОбработкаПродолжения = Новый ОписаниеОповещения("ПослеПодтвержденияИнформации",
															ЭтотОбъект,
															"ИнформацияЗаявления");
		КонецЕсли;
		
		ОписаниеОшибки.Описание = НСтр("ru = 'Не удалось сформировать заявление'");
		ОписаниеОшибки.Текст = УстановитьГиперссылку(ОписаниеОшибки.Текст, "its.1c.ru", "http://its.1c.ru");
		ОткрытьФормуОшибки(ОписаниеОшибки, ОбработкаПродолжения);
		
		Возврат;
	КонецЕсли;
	
	ДанныеДляПодписания = Новый Массив; // Массив из НовыйОписаниеДанных
	
	ОписаниеДанных = НовыйОписаниеДанных();
	ОписаниеДанных.Данные = ЗаявлениеXML;
	ОписаниеДанных.ОписаниеДляПакета.ИдентификаторДокумента = НовыйСжатыйУникальныйИдентификатор();
	ОписаниеДанных.ОписаниеДляПакета.ТипДокумента = "Заявление";
	ОписаниеДанных.ОписаниеДляПакета.ТипСодержимого = "xml";
	ИмяФайла = НовыйСжатыйУникальныйИдентификатор();
	ОписаниеДанных.ОписаниеДляПакета.ИмяФайла = ИмяФайла + ".bin";
	ОписаниеДанных.Представление.Представление = НСтр("ru = 'Заявление (файл сформирован)'");
	ОписаниеДанных.Представление.Значение = Новый ОписаниеОповещения(
		"ОткрытьФайлОбработкаОповещения", ЭтотОбъект, Новый Структура("АдресФайла, ИмяФайла", ЗаявлениеXML, ИмяФайла + ".xml"));
	
	ДанныеДляПодписания.Добавить(ОписаниеДанных);
	
	ОписаниеДанных = НовыйОписаниеДанных();
	ОписаниеДанных.Данные = АдресЗаявлениеНаПодключение;
	ОписаниеДанных.ОписаниеДляПакета.ИдентификаторДокумента = НовыйСжатыйУникальныйИдентификатор();
	ОписаниеДанных.ОписаниеДляПакета.ТипДокумента = "ЗаявлениеНаПодключение";
	ОписаниеДанных.ОписаниеДляПакета.ТипСодержимого = "pdf";
	ИмяФайла = НовыйСжатыйУникальныйИдентификатор();
	ОписаниеДанных.ОписаниеДляПакета.ИмяФайла = ИмяФайла + ".bin";
	ОписаниеДанных.Представление.Представление = НСтр("ru = 'Заявление на подключение (файл сформирован)'");
	ОписаниеДанных.Представление.Значение = Новый ОписаниеОповещения(
		"ОткрытьФайлОбработкаОповещения", ЭтотОбъект, Новый Структура("АдресФайла, ИмяФайла", АдресЗаявлениеНаПодключение, ИмяФайла + ".pdf"));
	
	ДанныеДляПодписания.Добавить(ОписаниеДанных);
	
	ПриложитьДокумент(ДанныеДляПодписания, "Паспорт");
	
	Если ПродлениеСертификатаСтороннегоУЦ Тогда
		ПриложитьДокумент(ДанныеДляПодписания, "СНИЛС");
	КонецЕсли;
	
	Если Не ЭтоФизическоеЛицо И Не ЭтоИндивидуальныйПредприниматель
		И Не ЗаявлениеДляРуководителейЮридическихЛицДоступно Тогда
		
		ПриложитьДокумент(ДанныеДляПодписания, "Доверенность");
		
	КонецЕсли;
	
	ОтборСертификатов = Новый Массив; // Массив из СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования
	ОтборСертификатов.Добавить(ДанныеЗаявления.СертификатОснование);
	
	ОписаниеДанныхДляПодписания = Новый Структура;
	ОписаниеДанныхДляПодписания.Вставить("ОповеститьОбОкончанииСрокаДействия", Ложь);
	ОписаниеДанныхДляПодписания.Вставить("НаборДанных",         ДанныеДляПодписания);
	ОписаниеДанныхДляПодписания.Вставить("ПредставлениеНабора", НСтр("ru = 'Файлы заявления (%1)'"));
	ОписаниеДанныхДляПодписания.Вставить("СообщитьОЗавершении", Истина);
	ОписаниеДанныхДляПодписания.Вставить("БезПодтверждения",    Истина);
	ОписаниеДанныхДляПодписания.Вставить("Операция",            НСтр("ru = 'Подписание данных заявления'"));
	ОписаниеДанныхДляПодписания.Вставить("ЗаголовокДанных",     НСтр("ru = 'Файл'"));
	ОписаниеДанныхДляПодписания.Вставить("ОтборСертификатов",   ОтборСертификатов);
	
	ЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанныхДляПодписания, 
		УникальныйИдентификатор,
		Новый ОписаниеОповещения("ОтправитьЗаявлениеПослеПодписанияФайлов", ЭтотОбъект),
		ПредопределенноеЗначение("Перечисление.ТипыПодписиКриптографии.БазоваяCAdESBES"));
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

	ЭлектроннаяПодписьСлужебныйКлиент.ОткрытьФормуРасширенногоПредставленияОшибки(ПараметрыОшибки, ЭтотОбъект, ОбработкаПродолжения);

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

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

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

#Область ОтправкаЗаявленияОбщиеПроцедурыИФункции

// Описание ошибки.
// 
// Возвращаемое значение:
//  Структура:
//   * Код - Строка
//   * Текст - Строка
//   * Описание - Строка
//
&НаКлиенте
Функция НовыйОписаниеОшибки(Описание = "", Текст = "", Код = "")
	
	ОписаниеОшибки = Новый Структура;
	ОписаниеОшибки.Вставить("Код", Код);
	ОписаниеОшибки.Вставить("Текст", Текст);
	ОписаниеОшибки.Вставить("Описание", Описание);
	
	Возврат ОписаниеОшибки;
	
КонецФункции

&НаСервере
Функция КодОшибкиПортала(Метод, КодОшибки)
	Возврат СтрШаблон("regservice.1c.%1(%2)", Метод, КодОшибки)
КонецФункции

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

// Пакет заявления.
// 
// Параметры:
//  ОписанияФайловПакета - Массив - описания файлов пакета
//  ТипТранзакции - Строка - тип транзакции
// 
// Возвращаемое значение:
//  Структура:
//   * ДанныеПакета - Строка - Base64Строка архива с файлами заявления.
//   * ИдентификаторДокументооборота - Строка
//   * ЭтоПовторнаяОтправкаПакета - Булево
//
&НаСервере
Функция ПакетЗаявления(Знач ОписанияФайловПакета, Знач ТипТранзакции)
	
	// Подготовка пакета заявления.
	ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(
		ПолучитьИмяВременногоФайла("package"));
	
	СоздатьКаталог(ВременныйКаталог);
	
	ЭтоПовторнаяОтправкаПакета = ЗначениеЗаполнено(ДанныеЗаявления.ИдентификаторДокументооборота) 
		И ТипТранзакции = "Регистрация";
				
	Если Не ЭтоПовторнаяОтправкаПакета И ТипТранзакции = "Регистрация" Тогда
		ИдентификаторДокументооборота = НовыйСжатыйУникальныйИдентификатор();
	Иначе
		ИдентификаторДокументооборота = ДанныеЗаявления.ИдентификаторДокументооборота;
	КонецЕсли;
	
	ИмяФайлаОписания  = ВременныйКаталог + "packageDescription.xml";
	ИмяФайлаПакета    = ВременныйКаталог + ИдентификаторДокументооборота + ".zip";
	
	Для Каждого ОписаниеФайла Из ОписанияФайловПакета Цикл
		ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ОписаниеФайла.Данные); // ДвоичныеДанные
		ДвоичныеДанныеФайла.Записать(ВременныйКаталог + ОписаниеФайла.ОписаниеДляПакета.ИмяФайла);
		Если ОписаниеФайла.Свойство("СвойстваПодписи") Тогда
			ИмяФайлаПодписи = НовыйСжатыйУникальныйИдентификатор() + ".bin";
			Если ТипЗнч(ОписаниеФайла.СвойстваПодписи) = Тип("Строка")Тогда
				ОписаниеФайла.СвойстваПодписи = ПолучитьИзВременногоХранилища(ОписаниеФайла.СвойстваПодписи); // см. ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваПодписи
			КонецЕсли;
			
			СвойстваПодписи = ОписаниеФайла.СвойстваПодписи; // см. ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваПодписи
			СвойстваПодписи.Подпись.Записать(ВременныйКаталог + ИмяФайлаПодписи);
			СвойстваПодписи.Вставить("ИмяФайлаПодписи", ИмяФайлаПодписи);
		КонецЕсли;
	КонецЦикла;
	
	ОписаниеПакетаXML = ОписаниеПакетаXML(ОписанияФайловПакета, ТипТранзакции, ИдентификаторДокументооборота);
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ИмяФайлаОписания, "windows-1251");
	ЗаписьXML.ЗаписатьБезОбработки(ОписаниеПакетаXML);
	ЗаписьXML.Закрыть();
	
	ЗаписьАрхива = Новый ЗаписьZipФайла(ИмяФайлаПакета, , , , УровеньСжатияZIP.Максимальный);
	ЗаписьАрхива.Добавить(ИмяФайлаОписания);
	Для Каждого ОписаниеФайла Из ОписанияФайловПакета Цикл
		ЗаписьАрхива.Добавить(ВременныйКаталог + ОписаниеФайла.ОписаниеДляПакета.ИмяФайла);
		Если ОписаниеФайла.Свойство("СвойстваПодписи") Тогда
			ЗаписьАрхива.Добавить(ВременныйКаталог + ОписаниеФайла.СвойстваПодписи.ИмяФайлаПодписи);
		КонецЕсли;	
	КонецЦикла;
	ЗаписьАрхива.Записать();
	
	ПакетЗаявления = Base64Строка(Новый ДвоичныеДанные(ИмяФайлаПакета));
	УдалитьФайлы(ВременныйКаталог);
	
	Возврат Новый Структура("ДанныеПакета, ИдентификаторДокументооборота, ЭтоПовторнаяОтправкаПакета",
		ПакетЗаявления, ИдентификаторДокументооборота, ЭтоПовторнаяОтправкаПакета);
	
КонецФункции

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

&НаСервере
Функция ОтправитьЗаявлениеНаПортал(ПакетЗаявления, ТипТранзакции, ОписаниеОшибки)
	
	Попытка
		ВебСервис = ВебСервисУЦ();
	Исключение
		
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ОписаниеОшибки.Текст = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
		
		Возврат Ложь;
		
	КонецПопытки;
	
	Попытка
		Ответ = ВебСервис.SendPacket(ПакетЗаявления.ДанныеПакета);
	Исключение
		
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ОписаниеОшибки.Текст = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
		
		Возврат Ложь;
		
	КонецПопытки;
	
	Если Не ЗначениеЗаполнено(Ответ) Тогда
		ОписаниеОшибки.Текст = НСтр("ru = 'Сервер вернул пустой ответ.'");
		Возврат Ложь;
	КонецЕсли;
	
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(Ответ);
	
	ПостроительDOM = Новый ПостроительDOM();
	ПостроительDOM = ПостроительDOM.Прочитать(ЧтениеXML);
	
	ЧтениеXML.Закрыть();
	
	УзелDOM = ПостроительDOM.ПолучитьЭлементыПоИмени("code");
	КодРезультата = УзелDOM[0].ТекстовоеСодержимое;
	 
	Если ТипТранзакции = "Регистрация" Тогда
		Если КодРезультата = "0" Тогда
			ДанныеЗаявления.ДатаОтправки = ТекущаяДатаСеанса();
			ДанныеЗаявления.ИдентификаторДокументооборота = ПакетЗаявления.ИдентификаторДокументооборота;
			Возврат Истина;
		ИначеЕсли КодРезультата = "60" // Документооборот уже зарегистрирован.
			И ПакетЗаявления.ЭтоПовторнаяОтправкаПакета Тогда
				ДанныеЗаявления.ДатаОтправки = ТекущаяДатаСеанса();
			Возврат Истина;
		КонецЕсли;
	ИначеЕсли КодРезультата = "0" ИЛИ КодРезультата = "60" Тогда // Расписка.
		Возврат Истина;
	КонецЕсли;
	
	ОписаниеОшибки.Код = КодОшибкиПортала("SendPacket", КодРезультата);
	УзелDOM = ПостроительDOM.ПолучитьЭлементыПоИмени("errorMessage");
	Если УзелDOM.Количество() > 0 Тогда
		ОписаниеОшибки.Текст = УзелDOM[0].ТекстовоеСодержимое;
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции

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

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

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

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

#Область ПрограммыРаботыЭП

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

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

		Если ТипЗнч(ТипМеханизмаГенерацииКлючевойПары) = Тип("Строка") Тогда
			НоваяСтрока.Ошибка = ТипМеханизмаГенерацииКлючевойПары;
		Иначе
			НоваяСтрока.ТипМеханизмаГенерацииКлючевойПары = ТипМеханизмаГенерацииКлючевойПары;
		КонецЕсли;
		
	КонецЦикла;
	
	ОтобразитьПоискПриложений(Ложь, Истина);

	Возврат УстановленныеТокеныРезультат.ПроверкаВыполнена;
	
КонецФункции

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

	Если ИдетПоиск Тогда
		Если ЭтоТокен Тогда
			Элементы.ДекорацияПоискПриложенийТекст.Заголовок = НСтр(
				"ru = 'Идет поиск токенов...'");
		Иначе
			Элементы.ДекорацияПоискПриложенийТекст.Заголовок = НСтр(
				"ru = 'Идет поиск приложений электронной подписи...'");
		КонецЕсли;
	КонецЕсли;
	
	Элементы.ДекорацияПоискПриложенийТекст.Видимость = ИдетПоиск;
	
КонецПроцедуры

&НаКлиенте
Функция РекомендацииДляТокена()
	
	Возврат ЭлектроннаяПодписьСлужебныйКлиент.РекомендацииДляТокена();
	
КонецФункции

&НаКлиенте
Функция ТипМеханизмаГенерацииКлючевойПары(Механизмы, Представление)
	
	Если Не ЗначениеЗаполнено(Механизмы) Тогда
		Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Токен %1 предназначен только для хранения ключей электронной подписи, для создания ключа выберите %2 или %3.'"),
			Представление,
			ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыКриптоПро(),
			ЭлектроннаяПодписьКлиентСерверЛокализация.ИмяПрограммыVipNet());
	КонецЕсли;
	
	СписокМеханизмов = Прочитать(Механизмы);
	СписокМеханизмов = СписокМеханизмов.Получить("support_mechanisms");
	СписокПоддерживаемыхМеханизмов = Новый Массив;

	Для Каждого Элемент Из СписокМеханизмов Цикл
		ТипМеханизма = Элемент.Получить("type");
		Если ТипМеханизма = 4608 Тогда
			Возврат ТипМеханизма;
		КонецЕсли;

		ИмяМеханизма = СокрЛП(Элемент.Получить("name"));
		Если ИмяМеханизма = "CKM_GOSTR3410_256_KEY_PAIR_GEN" Тогда
			Возврат ТипМеханизма;
		КонецЕсли;

		Если ЗначениеЗаполнено(ИмяМеханизма) Тогда
			СписокПоддерживаемыхМеханизмов.Добавить(СтрШаблон("%1 (%2)", ИмяМеханизма, ТипМеханизма));
		КонецЕсли;
	КонецЦикла;
	
	Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'На токене %1 не поддерживается механизм создания ключевой пары с алгоритмом ГОСТ 34.10-2012 (256).
			 |Поддерживаемые механизмы: %2'"), Представление, СтрСоединить(СписокПоддерживаемыхМеханизмов, ", "));
	
КонецФункции

&НаКлиенте
Функция ИмяПрограммы(Модель)
	
	Если СтрНачинаетсяС(НРег(Модель), "rutoken") Тогда
		Возврат "Aktiv ruToken CSP 2.0";
	ИначеЕсли СтрНачинаетсяС(НРег(Модель), "jacarta") Тогда
		Возврат "JaCarta GOST R 34.10-2012";
	КонецЕсли;
	
	Возврат Модель;
	
КонецФункции

&НаКлиенте
Функция ИмяСредства(Модель)
	
	Если СтрНачинаетсяС(НРег(Модель), "rutoken") Тогда
		Возврат "СКЗИ Рутокен ЭЦП"; // АПК:1297 Название для внешней системы.
	ИначеЕсли СтрНачинаетсяС(НРег(Модель), "jacarta") Тогда
		Возврат "SKZI Kriptotoken 2 EP";
	КонецЕсли;
	
	Возврат Модель;
	
КонецФункции

&НаКлиенте
Функция ТипПрограммы(Модель)
	
	Возврат 100;
	
КонецФункции

&НаСервереБезКонтекста
Функция Прочитать(Строка)
	
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(Строка);
	Результат = ПрочитатьJSON(ЧтениеJSON, Истина);
	Возврат Результат;
	
КонецФункции

&НаКлиенте
Процедура ПоказатьПодсказкуКриптопровайдеры(Результат)
	
	Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Истина;
	Элементы.ДекорацияПроверкаУстановкиКриптопровайдера.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока(
			НСтр(
		"ru = '<a href = ""%1"">Нажмите здесь</a>, чтобы определить установленные приложения и токены для работы с электронной подписью.'"),
		"ПроверитьУстановкуПрограммКриптографии");
	Элементы.ДекорацияПроверкаУстановкиКриптопровайдераРасширеннаяПодсказка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Не удалось определить установленные приложения электронной подписи и шифрования по причине:
		|%1'"), Результат.Ошибка);
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьПрограммуПослеПроверкиУстановленных(Результат, ВыбранноеЗначение) Экспорт

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

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

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

		ПоказатьПредупреждение( , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Приложение %1 не включено в список используемых приложений и не установлено на компьютере.
					 |Обратитесь к администратору.'"), Представление));

	ИначеЕсли ЭтоПодчиненныйУзелРИБ Тогда

		ПоказатьПредупреждение( , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Приложение %1 не включено в список используемых приложений и не установлено на компьютере.
					 |Добавьте приложение в главном узле распределенной информационной базы.'"), Представление));

	Иначе

		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить("Добавить", НСтр("ru = 'Добавить'"));
		Кнопки.Добавить("НеДобавлять", НСтр("ru = 'Не добавлять'"));
		ПоказатьВопрос(Новый ОписаниеОповещения("ПрограммаОбработкаВыбораПродолжение", ЭтотОбъект, ВыбранноеЗначение),
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Приложение %1 не включено в список используемых приложений и не установлено на компьютере.
						 |Добавить?'"), Представление), Кнопки, , "НеДобавлять");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОпределитьУстановленныеПрограммыПослеПодключенияРасширения(Подключено, Контекст) Экспорт
	
#Если ВебКлиент Тогда
		ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределитьУстановленныеПрограммы", 0.3, Истина);
#Иначе
		ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределитьУстановленныеПрограммы", 0.1, Истина);
#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммы()
	
	НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
		"ОбработчикОжиданияОпределитьУстановленныеПрограммыПослеПодключенияРасширения", ЭтотОбъект));
	
КонецПроцедуры

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

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

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

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

&НаСервереБезКонтекста
Процедура ЗаполнитьСписокПрограммНаСервере(СписокПрограмм, ВариантАлгоритмов,
			СостояниеЗаявления, КонтейнерКлючаПуть, ВстроенныйКриптопровайдер, ПрограммыАвто)
	
	Если Не ЗначениеЗаполнено(КонтейнерКлючаПуть)
		И СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.НеПодготовлено Тогда
		
		ТекстОшибки = "";
		ВариантАлгоритмов = ВариантАлгоритмов(ТекстОшибки);
		Если ЗначениеЗаполнено(ТекстОшибки) Тогда
			ВариантАлгоритмов = "2012";
		КонецЕсли;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ВариантАлгоритмов) Тогда
		ВариантАлгоритмов = "2012";
	КонецЕсли;
	
	ИдентификаторыНастроек = Новый Соответствие;
	Если ВариантАлгоритмов = "2012" Тогда
		ИдентификаторыНастроек.Вставить("VipNet2012",    Истина);
		ИдентификаторыНастроек.Вставить("CryptoPro2012", Истина);
	Иначе
		ИдентификаторыНастроек.Вставить("VipNet2001",    Истина);
		ИдентификаторыНастроек.Вставить("CryptoPro2001", Истина);
	КонецЕсли;
	
	ЭтоСеансWindows = ОбщегоНазначения.ЭтоWindowsКлиент();
	ЭтоСеансLinux = ОбщегоНазначения.ЭтоLinuxКлиент();
	ЭтоСеансMacOS = ОбщегоНазначения.ЭтоMacOSКлиент();
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Программы.Ссылка КАК Ссылка,
	|	Программы.ИмяПрограммы КАК ИмяПрограммы,
	|	Программы.ТипПрограммы КАК ТипПрограммы
	|ИЗ
	|	Справочник.ПрограммыЭлектроннойПодписиИШифрования КАК Программы";
	
	Программы = Запрос.Выполнить().Выгрузить();
	
	Настройки = Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПоставляемыеНастройкиПрограмм();
	Для Каждого Настройка Из Настройки Цикл
		
		Если ИдентификаторыНастроек.Получить(Настройка.Идентификатор) = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Если ЭтоСеансWindows И Настройка.НетВWindows
			Или ЭтоСеансLinux И Настройка.НетВLinux
			Или ЭтоСеансMacOS И Настройка.НетВMacOS
			Или Настройка.Неактуальная Тогда
			Продолжить;
		КонецЕсли;
		
		Строка = НовыйЭлементСпискаПрограмм();
		ЗаполнитьЗначенияСвойств(Строка, Настройка);
		
		ПрограммаАвто = ПрограммыАвто.Получить(Настройка.Идентификатор);
		Если ПрограммаАвто <> Неопределено Тогда
			Строка.Установлена = Истина;
			Строка.ПутьКПрограмме = ПрограммаАвто.ПутьКПрограммеАвто;
		КонецЕсли;
		
		ПрограммыВСправочнике = Программы.НайтиСтроки(Новый Структура("ИмяПрограммы, ТипПрограммы",
			Настройка.ИмяПрограммы, Настройка.ТипПрограммы));
			
		Если ПрограммыВСправочнике.Количество() > 0 Тогда
			Строка.Ссылка = ПрограммыВСправочнике[0].Ссылка;
		КонецЕсли;
		
		СписокПрограмм.Добавить(Строка);
		
	КонецЦикла;
	
	Если ЗначениеЗаполнено(ВстроенныйКриптопровайдер) Тогда
		НоваяПрограмма = НовыйЭлементСпискаПрограмм();
		НоваяПрограмма.Ссылка = ВстроенныйКриптопровайдер;
		НоваяПрограмма.Представление = НСтр("ru = 'Встроенный криптопровайдер'");
		СписокПрограмм.Добавить(НоваяПрограмма);
	КонецЕсли;
	
КонецПроцедуры

// Возвращаемое значение:
//  Структура:
//   * Ссылка - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования
//   * Представление - Строка
//   * Идентификатор - Строка
//   * ИмяПрограммы  - Строка
//   * ТипПрограммы  - Число
//   * Установлена   - Булево
//
&НаСервереБезКонтекста
Функция НовыйЭлементСпискаПрограмм()
	
	НовыйЭлемент = Новый Структура;
	НовыйЭлемент.Вставить("Ссылка", ПредопределенноеЗначение("Справочник.ПрограммыЭлектроннойПодписиИШифрования.ПустаяСсылка"));
	НовыйЭлемент.Вставить("Представление", "");
	НовыйЭлемент.Вставить("Идентификатор", "");
	НовыйЭлемент.Вставить("ИмяПрограммы", "");
	НовыйЭлемент.Вставить("ТипПрограммы", 0);
	НовыйЭлемент.Вставить("Установлена", Ложь);
	НовыйЭлемент.Вставить("ПутьКПрограмме", Ложь);
	
	Возврат НовыйЭлемент;
	
КонецФункции

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

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

// Параметры:
//   Контекст - Структура:
//    * Строка - СтрокаТаблицыЗначений:
//      ** Ссылка - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования
//
&НаКлиенте
Процедура ЗаполнитьПрограммуЦиклНачало(Контекст)
	
	Если СписокПрограмм.Количество() <= Контекст.Индекс + 1 Тогда
		
		Если Контекст.ПерваяДобавленнаяПрограмма <> Неопределено Тогда
			Если ТипЗнч(Контекст.ПерваяДобавленнаяПрограмма) = Тип("СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования") Тогда
				Объект.Программа = Контекст.ПерваяДобавленнаяПрограмма;
			Иначе
				ПрограммаИдентификатор = Контекст.ПерваяДобавленнаяПрограмма;
			КонецЕсли;
		КонецЕсли;
		
		ПредставлениеПрограммы = ПоставляемоеПредставлениеПрограммы(СписокПрограмм,
			?(ЗначениеЗаполнено(Объект.Программа), Объект.Программа, ПрограммаИдентификатор));
		ПослеВыбораПрограммы(Ложь, Контекст.Оповещение);
		Возврат;
		
	КонецЕсли;
	
	Контекст.Индекс = Контекст.Индекс + 1;
	Контекст.Вставить("Строка", СписокПрограмм[Контекст.Индекс]);
	
	Если Контекст.ПерваяДобавленнаяПрограмма = Неопределено Тогда
		Если ЗначениеЗаполнено(Контекст.Строка.Ссылка) Тогда
			Контекст.ПерваяДобавленнаяПрограмма = Контекст.Строка.Ссылка;
		Иначе
			Контекст.ПерваяДобавленнаяПрограмма = Контекст.Строка.Идентификатор;
		КонецЕсли;
	КонецЕсли;
	
	ПараметрыСоздания = ЭлектроннаяПодписьСлужебныйКлиент.ПараметрыСозданияМенеджераКриптографии();
	Если ЗначениеЗаполнено(Контекст.Строка.Ссылка) Тогда
		ПараметрыСоздания.Программа = Контекст.Строка.Ссылка;
	Иначе
		ПрограммаАвто = ПрограммыАвто.Получить(Контекст.Строка.Идентификатор);
		Если ПрограммаАвто <> Неопределено Тогда
			ПараметрыСоздания.Программа = ПрограммаАвто;
		Иначе
			ЗаполнитьПрограммуЦиклНачало(Контекст);
			Возврат;
		КонецЕсли;
	КонецЕсли;

	ПараметрыСоздания.ПоказатьОшибку = Ложь;
	ПараметрыСоздания.ИнтерактивныйРежим = Истина;
	
	ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(
		Новый ОписаниеОповещения("ЗаполнитьПрограммуЦиклПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
		"", ПараметрыСоздания);
	
КонецПроцедуры

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

	УстановитьВидимостьПрограммы();

	Если Контекст.Оповещение <> Неопределено Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ПоставляемоеПредставлениеПрограммы(СписокПрограмм, Программа)
	
	Если ТипЗнч(Программа) = Тип("Строка") Тогда
		Строки = СписокПрограмм.НайтиСтроки(Новый Структура("Идентификатор", Программа));
	Иначе
		Строки = СписокПрограмм.НайтиСтроки(Новый Структура("Ссылка", Программа));
	КонецЕсли;
	
	Если Строки.Количество() = 0 Тогда
		Возврат "";
	КонецЕсли;
	
	Возврат Строки[0].Представление;
	
КонецФункции

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

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

#Область WebСервис

&НаСервереБезКонтекста
Функция ВебСервисУЦ()
	
	Возврат Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ВебСервисУЦ(20);
	
КонецФункции

&НаСервереБезКонтекста
Функция ВариантАлгоритмов(ТекстОшибки)
	
	Возврат НастройкаУЦ(ТекстОшибки, Истина);
	
КонецФункции

&НаСервереБезКонтекста
Функция ВариантУдостоверяющегоЦентра(ТекстОшибки)
	
	Возврат НастройкаУЦ(ТекстОшибки, Ложь);
	
КонецФункции

&НаСервереБезКонтекста
Функция НастройкаУЦ(ТекстОшибки, ПолучитьВариантАлгоритмов)
	
	ПолученнаяНастройка =?(ПолучитьВариантАлгоритмов, "", "1C");
	
	Попытка
		
		ВебСервис = ВебСервисУЦ();
		
		Фабрика = ВебСервис.Определение.ФабрикаXDTO;
		URIПространстваИмен = ВебСервис.ТочкаПодключения.Интерфейс.URIПространстваИмен;
		
		СвойстваФункции = Фабрика.Пакеты.Получить(URIПространстваИмен).КорневыеСвойства.Получить("GetCertificateSettings");
		Если СвойстваФункции = Неопределено Тогда
			
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'В веб-сервисе ""%1"" не определена обязательная функция ""%2"".'"),
				ВебСервис.ТочкаПодключения.Местоположение + "?wsdl",
				"GetCertificateSettings");
			
		КонецЕсли;
		
		ТипПустогоПараметра = СвойстваФункции.Тип;
		ЗначениеПустогоПараметра = Фабрика.Создать(ТипПустогоПараметра); 
		
		Ответ = ВебСервис.GetCertificateSettings(ЗначениеПустогоПараметра).GetCertificateSettingsResult;
		
		ЧтениеXML = Новый ЧтениеXML;
		ЧтениеXML.УстановитьСтроку(Ответ);
		ПостроительDOM = Новый ПостроительDOM();
		ПостроительDOM = ПостроительDOM.Прочитать(ЧтениеXML);
		ЧтениеXML.Закрыть();
		
		УзелDOM = ПостроительDOM.ПолучитьЭлементыПоИмени("algorithm");
		ВариантАлгоритмов = ?(УзелDOM.Количество() > 0, УзелDOM[0].ТекстовоеСодержимое, "");
		Если ВариантАлгоритмов <> "2001"
			И ВариантАлгоритмов <> "2012" Тогда
			
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Следующий ответ сервера не соответствует ожидаемому в части элемента ""%1"":
				|%2'"), "algorithm", Ответ);
			
		КонецЕсли;
		
		Если ПолучитьВариантАлгоритмов Тогда
			ПолученнаяНастройка = ВариантАлгоритмов;
		Иначе
			АтрибутУзлаDOM = УзелDOM[0].Атрибуты.ПолучитьИменованныйЭлемент ("CA");
			Если АтрибутУзлаDOM <> Неопределено Тогда
				ПолученныйВариантУдостоверяющегоЦентра = ВРег(АтрибутУзлаDOM.ТекстовоеСодержимое);
				Если ПолученныйВариантУдостоверяющегоЦентра <> "1C"
				   И ПолученныйВариантУдостоверяющегоЦентра <> "KA"
				   И ПолученныйВариантУдостоверяющегоЦентра <> "RT"
				   И ПолученныйВариантУдостоверяющегоЦентра <> "TK" Тогда
					
					ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Следующий ответ сервера не соответствует ожидаемому в части атрибута ""%1"":
						|%2'"), "CA", Ответ);
				КонецЕсли;
				ПолученнаяНастройка = ПолученныйВариантУдостоверяющегоЦентра;
			КонецЕсли;
		КонецЕсли;
		
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		
		Если ПолучитьВариантАлгоритмов Тогда
			ЗаголовокОшибки =
				НСтр("ru = 'Не удалось получить требуемый вариант алгоритмов от сервера 1С:Подпись по причине:'")
				+ Символы.ПС;
		Иначе
			ЗаголовокОшибки =
				НСтр("ru = 'Не удалось получить требуемый вариант удостоверяющего центра от сервера 1С:Подпись по причине:'")
				+ Символы.ПС;
		КонецЕсли;
		
		ИмяСобытия = НСтр("ru = 'Электронная подпись.Заявление на выпуск сертификата'",
			ОбщегоНазначения.КодОсновногоЯзыка());
		
		ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,,,
			ЗаголовокОшибки + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
		
		ТекстОшибки = ЗаголовокОшибки + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
		Возврат "";
	КонецПопытки;
	
	Возврат ПолученнаяНастройка;
	
КонецФункции

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

#Область РаботаСXML

&НаСервере
Функция ЗаявлениеXMLДляБумажногоПродления(Билет)
	
	ПризнакЮридическогоЛица = Не ЭтоИндивидуальныйПредприниматель И Не ЭтоФизическоеЛицо;
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку("windows-1251");
	ЗаписьXML.ЗаписатьОбъявлениеXML();
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("Заявление");
	ЗаписьXML.ЗаписатьАтрибут("ВерсФорм", "1.3"); // АПК:1036 внешний идентификатор
	ЗаписьXML.ЗаписатьАтрибут("ДатаВремяФормирования", XMLСтрока(ТекущаяДатаСеанса()));
	ЗаписьXML.ЗаписатьАтрибут("ВерсПрог", "1С"); // АПК:1036 внешний идентификатор
	
		ЗаписьXMLЭлемент(ЗаписьXML, "ТипЗаявления", "1");
		ЗаписьXMLЭлемент(ЗаписьXML, "ВидСертификатаКод", ДанныеЗаявления.КодТарифа);
		ЗаписьXMLЭлемент(ЗаписьXML, "ПризнакЮридическогоЛица", ПризнакЮридическогоЛица);
		ЗаписьXMLЭлемент(ЗаписьXML, "ПризнакФизическогоЛица", ЭтоФизическоеЛицо);
		ЗаписьXMLЭлемент(ЗаписьXML, "ИНН", ?(ЭтоФизическоеЛицо, ВладелецИНН, ИНН));
		Если Не ЭтоИндивидуальныйПредприниматель И Не ЭтоФизическоеЛицо Тогда
			ЗаписьXMLЭлемент(ЗаписьXML, "КПП");
		КонецЕсли;
		
		Если ЭтоФизическоеЛицо Тогда
			ЗаписьXMLЭлемент(ЗаписьXML, "КраткоеНаименование", СокрП(Фамилия + " " + Имя + " " + Отчество));
		Иначе
			ЗаписьXMLЭлемент(ЗаписьXML, "ОГРН", ?(ЭтоИностраннаяОрганизация, "0000000000000", Неопределено));
			ЗаписьXMLЭлемент(ЗаписьXML, "ПолноеНаименование",  НаименованиеПолное);
			ЗаписьXMLЭлемент(ЗаписьXML, "КраткоеНаименование", НаименованиеСокращенное);
		КонецЕсли;
		ЗаписьXMLЭлемент(ЗаписьXML, "ТелефонОсновной",
			Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ТелефонДляОтправкиВСервис(
				?(ЭтоФизическоеЛицо, ВладелецТелефонXML, ТелефонXML)));
		
		АдресЮридический = ?(ЭтоФизическоеЛицо, ВладелецАдресРегистрацииXML, ЮридическийАдресXML);
		ЗаписьXMLАдрес(ЗаписьXML, "АдресЮридический", АдресЮридический);
		ЗаписьXMLАдрес(ЗаписьXML, "АдресФактический", АдресЮридический);
		
		ЗаписьXML.ЗаписатьНачалоЭлемента("ВладельцыЭЦП");
		ЗаписьXML.ЗаписатьНачалоЭлемента("ВладелецЭЦП");
		ЗаписьXML.ЗаписатьАтрибут("СНИЛС", ПредставлениеРеквизитаСтраховойНомерПФР(СтраховойНомерПФР));
			
			ЗаписьXML.ЗаписатьНачалоЭлемента("ФИО");
			ЗаписьXML.ЗаписатьАтрибут("Фамилия",  Фамилия);
			ЗаписьXML.ЗаписатьАтрибут("Имя",      Имя);
			ЗаписьXML.ЗаписатьАтрибут("Отчество", Отчество);
			ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента ФИО.
			
			ЗаписьXML.ЗаписатьНачалоЭлемента("ЛичныеДанные");
			ЗаписьXML.ЗаписатьАтрибут("ДатаРождения",  ПредставлениеРеквизитаДатаРождения(ДатаРождения));
			ЗаписьXML.ЗаписатьАтрибут("Пол",           Пол);
			ЗаписьXML.ЗаписатьАтрибут("МестоРождения", МестоРождения);
			ЗаписьXML.ЗаписатьАтрибут("Гражданство",   ГражданствоОКСМКодАльфа3);
			ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента ЛичныеДанные.
			
			Если ПризнакЮридическогоЛица Тогда
				ЗаписьXMLЭлемент(ЗаписьXML, "ИНН", ВладелецИНН);
			КонецЕсли;
			
			Если ДокументВид = "21" Тогда
				ДокументНомерПредставление = ПредставлениеРеквизитаНомерПаспортаРФ(ДокументНомер);
				ДокументКодПодразделенияПредставление =
					ПредставлениеРеквизитаДокументКодПодразделения(ДокументКодПодразделения);
			Иначе
				ДокументНомерПредставление = ДокументНомер;
				ДокументКодПодразделенияПредставление = "";
			КонецЕсли;
			ДокументДатаВыдачиПредставление = ПредставлениеРеквизитаДокументДатаВыдачи(ДокументДатаВыдачи);
			
			ЗаписьXML.ЗаписатьНачалоЭлемента("УдЛичн"); // АПК:1036 внешний идентификатор
			ЗаписьXML.ЗаписатьАтрибут("КодВидДок", ДокументВид);
			ЗаписьXML.ЗаписатьАтрибут("СерНомДок", ДокументНомерПредставление);
			ЗаписьXML.ЗаписатьАтрибут("ДатаДок",   ДокументДатаВыдачиПредставление);
			ЗаписьXML.ЗаписатьАтрибут("ВыдДок",    ДокументКемВыдан); // АПК:1036 внешний идентификатор
			ЗаписьXML.ЗаписатьАтрибут("КодВыдДок", ДокументКодПодразделенияПредставление); // АПК:1036 внешний идентификатор
			ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента УдЛичн. АПК:1036 внешний идентификатор
			
			Если ПризнакЮридическогоЛица Тогда
				ЗаписьXMLЭлемент(ЗаписьXML, "Должность", Должность);
			КонецЕсли;
			
			ЗаписьXMLЭлемент(ЗаписьXML, "ЭлектроннаяПочта", ЭлектроннаяПочта);
			
			ЗаписьXML.ЗаписатьНачалоЭлемента("Криптопровайдер");
			ЗаписьXMLЭлемент(ЗаписьXML, "ТипКриптопровайдера", XMLСтрока(ПрограммаТип));
			ЗаписьXMLЭлемент(ЗаписьXML, "ИмяКриптопровайдера", XMLСтрока(ПрограммаИмя));
			ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента Криптопровайдер.
			
			ЗаписьXML.ЗаписатьНачалоЭлемента("ЗапросНаСертификат");
			ЗаписьXML.ЗаписатьАтрибут("УдостоверяющийЦентр", УдостоверяющийЦентр());
			ЗаписьXML.ЗаписатьТекст(ТекстФайлаЗапросаНаСертификат());
			ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента ЗапросНаСертификат.
		
		ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента ВладелецЭЦП.
		ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента ВладельцыЭЦП.
		
		ЗаписьXMLЭлемент(ЗаписьXML, "ИННПартнера", ДокументыПартнерИНН);
		Если Не ДокументыПартнерЭтоИП Тогда
			ЗаписьXMLЭлемент(ЗаписьXML, "КПППартнера", ДокументыПартнерКПП);
		КонецЕсли;
		
		ЗаписьXMLЭлемент(ЗаписьXML, "БилетПользователя", Билет);
		
	ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента Заявление.
	СтрокаXML = ЗаписьXML.Закрыть();
	
	ОписаниеДанных = НовыйОписаниеДанных();
	ОписаниеДанных.Данные = АдресФайлаЗаявления(СтрокаXML);
	ОписаниеДанных.Представление.Представление = НСтр("ru = 'Файл заявления'");
	ОписаниеДанных.ОписаниеДляПакета.ИмяФайла = НовыйСжатыйУникальныйИдентификатор() + ".bin";
	ОписаниеДанных.ОписаниеДляПакета.ИдентификаторДокумента = НовыйСжатыйУникальныйИдентификатор();
	ОписаниеДанных.ОписаниеДляПакета.ТипДокумента = "Заявление";
	ОписаниеДанных.ОписаниеДляПакета.ТипСодержимого = "xml";
	
	МассивОписаний = Новый Массив; // Массив из НовыйОписаниеДанных
	МассивОписаний.Добавить(ОписаниеДанных);
	
	Возврат МассивОписаний;
	
КонецФункции

&НаСервере
Функция ЗаявлениеXMLДляЭлектронногоПродления(ОписаниеОшибки)
	
	Билет = ТикетАутентификацииНаПорталеПоддержки(ОписаниеОшибки);
	Если Билет = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	ПризнакЮридическогоЛица = Не ЭтоИндивидуальныйПредприниматель И Не ЭтоФизическоеЛицо;
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку("windows-1251");
	ЗаписьXML.ЗаписатьОбъявлениеXML();
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("Заявление");
	ЗаписьXML.ЗаписатьАтрибут("ВерсФорм", "1.4"); // АПК:1036 внешний идентификатор
	ЗаписьXML.ЗаписатьАтрибут("ДатаВремяФормирования", XMLСтрока(ТекущаяДатаСеанса()));
	ЗаписьXML.ЗаписатьАтрибут("ВерсПрог", "1С"); // АПК:1036 внешний идентификатор
	
		ЗаписьXMLЭлемент(ЗаписьXML, "ТипЗаявления", ?(ПродлениеСертификатаСтороннегоУЦ, "2", "3"));
		ЗаписьXMLЭлемент(ЗаписьXML, "ВидСертификатаКод", ДанныеЗаявления.КодТарифа);
		Если Не ПродлениеСертификатаСтороннегоУЦ Тогда
			ЗаписьXMLЭлемент(ЗаписьXML, "УчетнаяЗапись", ДанныеЗаявления.ИдентификаторАбонента);
		КонецЕсли;
		ЗаписьXMLЭлемент(ЗаписьXML, "ПризнакЮридическогоЛица", ПризнакЮридическогоЛица);
		ЗаписьXMLЭлемент(ЗаписьXML, "ПризнакФизическогоЛица", ЭтоФизическоеЛицо);
		ЗаписьXMLЭлемент(ЗаписьXML, "ИНН", ?(ЭтоФизическоеЛицо, ВладелецИНН, ИНН));
		Если ПризнакЮридическогоЛица Тогда
			ЗаписьXMLЭлемент(ЗаписьXML, "КПП");
		КонецЕсли;
		Если ЭтоФизическоеЛицо Тогда
			ЗаписьXMLЭлемент(ЗаписьXML, "КраткоеНаименование", СокрП(Фамилия + " " + Имя + " " + Отчество));
		Иначе
			ЗаписьXMLЭлемент(ЗаписьXML, "ОГРН", ?(ЭтоИностраннаяОрганизация, "0000000000000", Неопределено));
			ЗаписьXMLЭлемент(ЗаписьXML, "ПолноеНаименование",  НаименованиеПолное);
			ЗаписьXMLЭлемент(ЗаписьXML, "КраткоеНаименование", НаименованиеСокращенное);
		КонецЕсли;
		
		ЗаписьXMLЭлемент(ЗаписьXML, "ТелефонОсновной",
			Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ТелефонДляОтправкиВСервис(
				?(ЭтоФизическоеЛицо, ВладелецТелефонXML, ТелефонXML)));
		
		АдресЮридический = ?(ЭтоФизическоеЛицо, ВладелецАдресРегистрацииXML, ЮридическийАдресXML);
		ЗаписьXMLАдрес(ЗаписьXML, "АдресЮридический", АдресЮридический);
		ЗаписьXMLАдрес(ЗаписьXML, "АдресФактический", АдресЮридический);
		
		ЗаписьXML.ЗаписатьНачалоЭлемента("ВладельцыЭЦП");
		ЗаписьXML.ЗаписатьНачалоЭлемента("ВладелецЭЦП");
		ЗаписьXML.ЗаписатьАтрибут("СНИЛС", ПредставлениеРеквизитаСтраховойНомерПФР(СтраховойНомерПФР));
			
			ЗаписьXML.ЗаписатьНачалоЭлемента("ФИО");
			ЗаписьXML.ЗаписатьАтрибут("Фамилия",  Фамилия);
			ЗаписьXML.ЗаписатьАтрибут("Имя",      Имя);
			ЗаписьXML.ЗаписатьАтрибут("Отчество", Отчество);
			ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента ФИО.
			
			ЗаписьXML.ЗаписатьНачалоЭлемента("ЛичныеДанные");
			ЗаписьXML.ЗаписатьАтрибут("ДатаРождения",  ПредставлениеРеквизитаДатаРождения(ДатаРождения));
			ЗаписьXML.ЗаписатьАтрибут("Пол",           Пол);
			ЗаписьXML.ЗаписатьАтрибут("МестоРождения", МестоРождения);
			ЗаписьXML.ЗаписатьАтрибут("Гражданство",   ГражданствоОКСМКодАльфа3);
			ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента ЛичныеДанные.
			Если ПризнакЮридическогоЛица Тогда
				ЗаписьXMLЭлемент(ЗаписьXML, "ИНН", ВладелецИНН);
			КонецЕсли;
			Если ДокументВид = "21" Тогда
				ДокументНомерПредставление = ПредставлениеРеквизитаНомерПаспортаРФ(ДокументНомер);
				ДокументКодПодразделенияПредставление =
					ПредставлениеРеквизитаДокументКодПодразделения(ДокументКодПодразделения);
			Иначе
				ДокументНомерПредставление = ДокументНомер;
				ДокументКодПодразделенияПредставление = "";
			КонецЕсли;
			ДокументДатаВыдачиПредставление = ПредставлениеРеквизитаДокументДатаВыдачи(ДокументДатаВыдачи);
			
			ЗаписьXML.ЗаписатьНачалоЭлемента("УдЛичн"); // АПК:1036 внешний идентификатор
			ЗаписьXML.ЗаписатьАтрибут("КодВидДок", ДокументВид);
			ЗаписьXML.ЗаписатьАтрибут("СерНомДок", ДокументНомерПредставление);
			ЗаписьXML.ЗаписатьАтрибут("ДатаДок",   ДокументДатаВыдачиПредставление);
			ЗаписьXML.ЗаписатьАтрибут("ВыдДок",    ДокументКемВыдан); // АПК:1036 внешний идентификатор
			ЗаписьXML.ЗаписатьАтрибут("КодВыдДок", ДокументКодПодразделенияПредставление); // АПК:1036 внешний идентификатор
			ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента УдЛичн. АПК:1036 внешний идентификатор
			
			Если ПризнакЮридическогоЛица Тогда
				ЗаписьXMLЭлемент(ЗаписьXML, "Должность",  Должность);
			КонецЕсли;
			
			ЗаписьXMLЭлемент(ЗаписьXML, "ЭлектроннаяПочта", ЭлектроннаяПочта);
			
			ЗаписьXML.ЗаписатьНачалоЭлемента("Криптопровайдер");
			ЗаписьXMLЭлемент(ЗаписьXML, "ТипКриптопровайдера", XMLСтрока(ПрограммаТип));
			ЗаписьXMLЭлемент(ЗаписьXML, "ИмяКриптопровайдера", XMLСтрока(ПрограммаИмя));
			ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента Криптопровайдер.
			
			ЗаписьXML.ЗаписатьНачалоЭлемента("ЗапросНаСертификат");
			ЗаписьXML.ЗаписатьАтрибут("УдостоверяющийЦентр", УдостоверяющийЦентр());
			ЗаписьXML.ЗаписатьТекст(ТекстФайлаЗапросаНаСертификат());
			ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента ЗапросНаСертификат.
		
		ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента ВладелецЭЦП.
		ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента ВладельцыЭЦП.
		
		Если ПродлениеСертификатаСтороннегоУЦ Тогда
			ЗаписьXMLЭлемент(ЗаписьXML, "ИННПартнера", ДокументыПартнерИНН);
			Если Не ДокументыПартнерЭтоИП Тогда
				ЗаписьXMLЭлемент(ЗаписьXML, "КПППартнера", ДокументыПартнерКПП);
			КонецЕсли;
		КонецЕсли;
		
		ЗаписьXMLЭлемент(ЗаписьXML, "БилетПользователя", Билет);
		
	ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента Заявление.
	СтрокаXML = ЗаписьXML.Закрыть();
	
	Возврат АдресФайлаЗаявления(СтрокаXML);
	
КонецФункции

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

&НаСервере
Функция УдостоверяющийЦентр()
	
	Если ВариантУдостоверяющегоЦентра = "KA" Тогда
		Возврат "АО ""КАЛУГА АСТРАЛ"""; // АПК:1297 Не локализуется (формат веб-сервиса).
		
	ИначеЕсли ВариантУдостоверяющегоЦентра = "RT" Тогда
		Возврат "АО ""ЕЭТП"""; // АПК:1297 Не локализуется (формат веб-сервиса).
		
	ИначеЕсли ВариантУдостоверяющегоЦентра = "TK" Тогда
		Возврат "ООО ""ТАКСКОМ"""; // АПК:1297 Не локализуется (формат веб-сервиса).
	КонецЕсли;
	
	Возврат "ООО ""НПЦ ""1С"""; // АПК:1297 Не локализуется (формат веб-сервиса).
	
КонецФункции

&НаСервере
Процедура ЗаписьXMLЭлемент(ЗаписьXML, ИмяЭлемента, Значение = Неопределено)
	
	Если Значение = Неопределено Тогда
		Значение = ЭтотОбъект[ИмяЭлемента];
	КонецЕсли;
	
	ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяЭлемента);
	ЗаписьXML.ЗаписатьТекст(XMLСтрока(Значение));
	ЗаписьXML.ЗаписатьКонецЭлемента();
	
КонецПроцедуры

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

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

&НаСервере
Функция ОписаниеПакетаXML(ОписанияФайловПакета, ТипТранзакции, ИдентификаторДокументооборота)
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку("windows-1251");
	ЗаписьXML.ЗаписатьОбъявлениеXML();
	
	ЗаписьXML.ЗаписатьНачалоЭлемента("пакет");
	ЗаписьXML.ЗаписатьАтрибут("версияФормата", "1С:1.0");
	
	ЗаписьXML.ЗаписатьАтрибут("версПрог", "1.0"); // АПК:1036 внешний идентификатор
	ЗаписьXML.ЗаписатьАтрибут("типДокументооборота", "РегистрацияАбонентаЭДО");
	ЗаписьXML.ЗаписатьАтрибут("типТранзакции", ТипТранзакции);
	ЗаписьXML.ЗаписатьАтрибут("идентификаторДокументооборота", ИдентификаторДокументооборота);
	
		ЗаписьXML.ЗаписатьНачалоЭлемента("отправитель");
		Если ЗначениеЗаполнено(ДанныеЗаявления.ИдентификаторАбонента) Тогда
			ЗаписьXML.ЗаписатьАтрибут("идентификаторСубъекта", ДанныеЗаявления.ИдентификаторАбонента);
		КонецЕсли;	
		ЗаписьXML.ЗаписатьАтрибут("типСубъекта", "абонент");
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
		ЗаписьXML.ЗаписатьНачалоЭлемента("получатель");
		ЗаписьXML.ЗаписатьАтрибут("идентификаторСубъекта", "КалугаАстрал");
		ЗаписьXML.ЗаписатьАтрибут("типСубъекта", "спецоператор");
		ЗаписьXML.ЗаписатьКонецЭлемента();
		
		Для Каждого ОписаниеФайла Из ОписанияФайловПакета Цикл
			ЗаписатьОписаниеФайла(ЗаписьXML, ОписаниеФайла);
		КонецЦикла;	
	
	ЗаписьXML.ЗаписатьКонецЭлемента(); // КонецЭлемента пакет.
	
	СтрокаXML = ЗаписьXML.Закрыть();
	
	Возврат СтрокаXML;
	
КонецФункции

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

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

#Область КлючИЗапросНаСертификат

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СоздатьКлючИЗапросНаСертификатПослеУточненияОшибкиВызоваПолучитьОткрытыйКлюч(ТекстОшибки, Контекст) Экспорт
	
	СоздатьКлючИЗапросНаСертификатЗавершение(Контекст, ТекстОшибки,
		НСтр("ru = 'Не удалось получить открытую часть ключа по причине:
		|%1'"));
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура СоздатьКлючИЗапросНаСертификатПослеОшибкиПомещенияФайлов(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
	
	СтандартнаяОбработка = Ложь;
	СоздатьКлючИЗапросНаСертификатЗавершение(Контекст, ИнформацияОбОшибке,
		НСтр("ru = 'Не удалось передать файл запроса на сертификат на сервер по причине:'"));
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

#Область КонтейнерКлючей

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПроверитьСуществованиеКонтейнераКлючейПослеПолученияИменКонтейнеров(ОписаниеИмен, Контекст) Экспорт
	
	Результат = Контекст.Результат;
	Результат.ТекстОшибки = ОписаниеИмен.ТекстОшибки;
	
	Если ЗначениеЗаполнено(Результат.ТекстОшибки) Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
		Возврат;
	КонецЕсли;
	
	ИменаКонтейнеровКлючей = ОписаниеИмен.ИменаКонтейнеровКлючей;
	
	Если ВыбранаПрограммаКриптоПро(ПрограммаИдентификатор, СписокПрограмм, Объект.Программа) Тогда
		Результат.Существует = НайтиБезУчетаРегистраИРазделителяПути(
			ИменаКонтейнеровКлючей, Контекст.ИмяДляСоздания) > 0;
		ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
		Возврат;
	КонецЕсли;
	
	Позиция = СтрНайти(Контекст.ПутьПослеСоздания, ":.");
	Если Позиция = 0 Тогда
		Результат.Существует = НайтиБезУчетаРегистраИРазделителяПути(
			ИменаКонтейнеровКлючей, Контекст.ИмяДляСоздания) > 0;
		ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
		Возврат;
	КонецЕсли;
	
	ИмяПослеСоздания = Лев(Контекст.ПутьПослеСоздания, Позиция - 1);
	
	Если НайтиБезУчетаРегистраИРазделителяПути(ИменаКонтейнеровКлючей, ИмяПослеСоздания) > 0 Тогда
		Результат.Существует = Истина;
		ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
		Возврат;
	КонецЕсли;
	
	Позиция = НайтиБезУчетаРегистраИРазделителяПути(ИмяПослеСоздания, "\Infotecs\Containers\");
	Если Позиция = 0 Тогда
		ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
		Возврат;
	КонецЕсли;
	
	// ViPNet 3.2 (основная папка контейнеров не указана).
	ИмяПослеСоздания = Сред(ИмяПослеСоздания, Позиция);
	
	Результат.Существует = НайтиБезУчетаРегистраИРазделителяПути(
		ИменаКонтейнеровКлючей, ИмяПослеСоздания) > 0;
	ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
	
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьИмяНовогоКонтейнераКлюча(Оповещение)
	
	Дата = ТекущаяДата(); // АПК:143 Используется только для уникальности имени, поэтому требуется время компьютера, а не текущая дата сеанса.
	ДатаСоздания = Формат(Дата, "ДФ=гггг-ММ-дд") + " " + Формат(Дата, "ДФ=ЧЧ") + "-" + Формат(Дата, "ДФ=мм");
	
	Субъект = СубъектНовогоИмениКонтейнераКлюча();
	
	Контекст = Новый Структура;
	Контекст.Вставить("Оповещение", Оповещение);
	Контекст.Вставить("НовоеИмя1",  ДатаСоздания + ", " + Лев(Субъект, 60));
	Контекст.Вставить("НовоеИмя2",  ДатаСоздания + "-" + Формат(Дата, "ДФ=сс") + ", " + Лев(Субъект, 57));
	
	ПолучитьИменаКонтейнеровКлючей(Новый ОписаниеОповещения(
		"ПолучитьИмяНовогоКонтейнераКлючаПослеПолученияИменКонтейнеров", ЭтотОбъект, Контекст));
	
КонецПроцедуры

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

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

&НаКлиенте
Функция ПодготовитьСтрокуДляИмениКонтейнера(Строка, ЗаменаПробела = Неопределено)
	
	ЗаменаСимволов = Новый Соответствие;
	ЗаменаСимволов.Вставить("\", " ");
	ЗаменаСимволов.Вставить("/", " ");
	ЗаменаСимволов.Вставить("*", " ");
	ЗаменаСимволов.Вставить("<", " ");
	ЗаменаСимволов.Вставить(">", " ");
	ЗаменаСимволов.Вставить("|", " ");
	ЗаменаСимволов.Вставить(":", "");
	ЗаменаСимволов.Вставить("""", "");
	ЗаменаСимволов.Вставить("?", "");
	ЗаменаСимволов.Вставить(Символы.ВК, "");
	ЗаменаСимволов.Вставить(Символы.ПС, " ");
	ЗаменаСимволов.Вставить(Символы.Таб, " ");
	ЗаменаСимволов.Вставить(Символы.НПП, " ");
	// Замена символов кавычек.
	ЗаменаСимволов.Вставить(Символ(171), "");
	ЗаменаСимволов.Вставить(Символ(187), "");
	ЗаменаСимволов.Вставить(Символ(8195), "");
	ЗаменаСимволов.Вставить(Символ(8194), "");
	ЗаменаСимволов.Вставить(Символ(8216), "");
	ЗаменаСимволов.Вставить(Символ(8218), "");
	ЗаменаСимволов.Вставить(Символ(8217), "");
	ЗаменаСимволов.Вставить(Символ(8220), "");
	ЗаменаСимволов.Вставить(Символ(8222), "");
	ЗаменаСимволов.Вставить(Символ(8221), "");
	
	СтрокаПодготовленная = "";
	
	СтрокаЛатиницей = СтроковыеФункцииКлиент.СтрокаЛатиницей(Строка);
	КоличествоСимволов = СтрДлина(СтрокаЛатиницей);
	
	Для НомерСимвола = 1 По КоличествоСимволов Цикл
		Символ = Сред(СтрокаЛатиницей, НомерСимвола, 1);
		Если ЗаменаСимволов[Символ] <> Неопределено Тогда
			Символ = ЗаменаСимволов[Символ];
		КонецЕсли;
		СтрокаПодготовленная = СтрокаПодготовленная + Символ;
	КонецЦикла;
	
	Если ЗаменаПробела <> Неопределено Тогда
		СтрокаПодготовленная = СтрЗаменить(ЗаменаПробела, " ", ЗаменаПробела);
	КонецЕсли;
	
	Возврат СокрЛП(СтрокаПодготовленная);
	
КонецФункции

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

#Область ОбъектКриптографии

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

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

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

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

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

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

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

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

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

			КонецЕсли;
		КонецЕсли;

		ПрограммаАвто = ПрограммыАвто.Получить(ПрограммаИдентификатор);
		Если ПрограммаАвто = Неопределено Тогда

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

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

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

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

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

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

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

&НаКлиенте
Процедура СоздатьОбъектКриптографииПослеПредупрежденияОбОшибке(Контекст) Экспорт
	
	ВыполнитьОбработкуОповещения(Контекст.ОбработкаПродолжения, Ложь);
	
КонецПроцедуры

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

#Область УстановкаСертификата

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

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

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

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

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

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

&НаКлиенте
Асинх Процедура УстановитьВЛичноеХранилищеПослеСозданияМенеджераКриптографии(МенеджерКриптографии, Контекст) Экспорт

	Если ТипЗнч(МенеджерКриптографии) <> Тип("МенеджерКриптографии") Тогда
		ПослеУстановкиСертификата(Истина, Контекст);
		Возврат;
	КонецЕсли;
	
	Ждать УстановитьСертификатВХранилище(МенеджерКриптографии, Ложь);
	Ждать УстановитьСертификатВХранилище(МенеджерКриптографии, Истина);

	ПослеУстановкиСертификата(Истина, Контекст);

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

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

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


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

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

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

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

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

// Параметры:
//   Каталог  - Строка
//   Контекст - Структура
//
&НаКлиенте
Процедура УстановитьСертификатПослеПолученияКаталогаВременныхФайловКомпоненты(Каталог, Контекст) Экспорт
	
	Контекст.Вставить("ВременныйКаталог", Каталог + НовыйСжатыйУникальныйИдентификатор());
	
	Контекст.ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(
		Контекст.ВременныйКаталог);
	
	Контекст.Вставить("ИмяФайлаСертификата",          "my.cer");
	Контекст.Вставить("ИмяФайлаКорневогоСертификата", "root.cer");
	
	Контекст.Вставить("ПолучаемыеФайлы", Новый Массив);
	Контекст.ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(
		Контекст.ИмяФайлаСертификата, АдресСертификата));
	
	Контекст.ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(
		Контекст.ИмяФайлаКорневогоСертификата, АдресКорневогоСертификата));
	
	Вызовы = Новый Массив;
	ДобавитьВызов(Вызовы, "НачатьПолучениеФайлов", Контекст.ПолучаемыеФайлы, Контекст.ВременныйКаталог, Ложь);
	ДобавитьВызов(Вызовы, "НачатьУдалениеФайлов",  Контекст.ВременныйКаталог, Неопределено);
	
	НачатьЗапросРазрешенияПользователя(Новый ОписаниеОповещения(
		"УстановитьСертификатПослеПолученияРазрешений", ЭтотОбъект, Контекст), Вызовы);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура УстановитьСертификатПослеУточненияОшибкиВызоваИмпортироватьСертификат(ТекстОшибки, Контекст) Экспорт
	
	ОшибкаУстановкиСертификата = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Не удалось установить корневой сертификат в хранилище ОС по причине:
		|%1'"),
		ТекстОшибки);
	
	Контекст.Вставить("РезультатПослеВызоваИмпортироватьСертификат", Неопределено);
	УстановитьСертификатПослеВызоваИмпортироватьСертификатПослеПолученияСписокОшибок(Неопределено, Контекст);
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура ПослеУстановкиСертификата(Установлен, Контекст) Экспорт
	
	ПослеУстановкиСертификатаНаСервере(Установлен);
	Если Установлен Тогда
		ПослеЗаписи();
	ИначеЕсли ЗначениеЗаполнено(ОшибкаУстановкиСертификата) Тогда
		ОписаниеОшибки = НовыйОписаниеОшибки();
		ОписаниеОшибки.Описание = НСтр("ru = 'Не удалось установить сертификат.'");
		ОписаниеОшибки.Текст = ОшибкаУстановкиСертификата;
		ОткрытьФормуОшибки(ОписаниеОшибки);
	КонецЕсли;
	
КонецПроцедуры

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

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

#Область ПредставлениеДанных

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

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

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

&НаСервереБезКонтекста
Функция ИмяРегионаРФПоРекомендациямДляСКПЭП(КодРегиона, ТекстОшибки)
	
	// Методические рекомендации по составу квалифицированного сертификата ключа
	// проверки электронной подписи (Версия 1.9).
	//
	// 3.2 Цели и требования
	//     Данный документ разработан в целях реализации и во исполнение:
	//     федерального закона от 6 апреля 2011 г. № 63-ФЗ "Об электронной подписи";
	//     приказа ФСБ от 27 декабря 2011 г. N 795 "ОБ УТВЕРЖДЕНИИ ТРЕБОВАНИЙ К ФОРМЕ
	//     КВАЛИФИЦИРОВАННОГО СЕРТИФИКАТА КЛЮЧА ПРОВЕРКИ ЭЛЕКТРОННОЙ ПОДПИСИ".
	//
	// Приложение 2. Формат названия субъекта федерации.
	//     2. Код и название субъекта федерации должно соответствовать КЛАДР.
	
	// Справочник "Субъекты Российской федерации" (ССРФ) в формате КЛАДР опубликован тут:
	// "https://www.gnivc.ru/technical_support/classifiers_reference/ssrf/".
	// Последнее обновление в конфигурации на дату актуальности: 04.04.2019.
	
	Если ПустаяСтрока(КодРегиона) Тогда
		ТекстОшибки = ТекстОшибки + НСтр("ru = 'Не указан регион РФ.'");
		Возврат "";
	КонецЕсли;
	
	ИменаВсехРегионовРФ = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ПолучитьМакет(
		"ИменаРегионовРФ");
	
	Строка = ИменаВсехРегионовРФ.ПолучитьСтроку(Число(КодРегиона));
	Если Не СтрНачинаетсяС(Строка, КодРегиона + " ") Тогда
		ТекстОшибки = ТекстОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Регион РФ с кодом ""%1"" не существует.'"), КодРегиона);
		Возврат "";
	КонецЕсли;
	
	Строка = СокрЛП(Сред(Строка, 4));
	Если Не ЗначениеЗаполнено(Строка) Тогда
		ТекстОшибки = ТекстОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Для региона РФ с кодом ""%1"" имя, рекомендованное для СКПЭП, еще не назначено.'"), КодРегиона);
		Возврат "";
	КонецЕсли;
	
	ТекстОшибки = "";
	Возврат Строка;
	
КонецФункции

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

&НаКлиентеНаСервереБезКонтекста
Функция ТолькоЦифры(Строка)
	
	ДлинаСтроки = СтрДлина(Строка);
	
	ОбработаннаяСтрока = "";
	Для НомерСимвола = 1 По ДлинаСтроки Цикл
		
		Символ = Сред(Строка, НомерСимвола, 1);
		Если Символ >= "0" И Символ <= "9" Тогда
			ОбработаннаяСтрока = ОбработаннаяСтрока + Символ;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат ОбработаннаяСтрока;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция НаселенныйПунктПолностью(АдресСтруктура)
	
	// Округ ОкругСокращение, Район РайонСокращение, Город ГородСокращение,
	// ВнутригородскойРайон ВнутригородскойРайонСокращение, НаселенныйПункт НаселенныйПунктСокращение.
	
	СписокПолей = "";
	Если АдресСтруктура.Свойство("Регион")
		И АдресСтруктура.Свойство("КодРегиона")
		И (АдресСтруктура.КодРегиона = "77"
		Или АдресСтруктура.КодРегиона = "78"
		Или АдресСтруктура.КодРегиона = "92"
		Или АдресСтруктура.КодРегиона = "99") Тогда
		
		СписокПолей = "Регион, КодРегиона, ";
	КонецЕсли;
	
	Возврат ПредставлениеЧастиАдреса(АдресСтруктура, СписокПолей +
		"Округ,
		|Район,
		|Город,
		|ВнутригородскойРайон,
		|НаселенныйПункт,
		|Территория");
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеДвоичныхДанных(Знач Строка, БайтВСтроке = 20)
	
	ОстатокСтроки = НРег(СтрЗаменить(Строка, " ", ""));
	Представление = "";
	БайтВТекущейСтроке = 0;
	
	Пока ЗначениеЗаполнено(ОстатокСтроки) Цикл
		Представление = Представление + Лев(ОстатокСтроки, 2) + " ";
		ОстатокСтроки = Сред(ОстатокСтроки, 3);
		БайтВТекущейСтроке = БайтВТекущейСтроке + 1;
		Если БайтВТекущейСтроке = БайтВСтроке Тогда
			Представление = СокрЛП(Представление) + Символы.ПС;
			БайтВТекущейСтроке = 0;
		КонецЕсли;
	КонецЦикла;
	
	Возврат СокрЛП(Представление);
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеРеквизитаНомерПаспортаРФ(НомерПаспортаРФ)
	
	Возврат Лев(НомерПаспортаРФ, 2) + " " + Сред(НомерПаспортаРФ, 3, 2) + " " + Прав(НомерПаспортаРФ, 6);
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеРеквизитаДокументКодПодразделения(КодПодразделения)
	
	Если Не ЗначениеЗаполнено(КодПодразделения) Тогда
		Возврат "";
	КонецЕсли;
	
	Возврат Лев(КодПодразделения, 3) + "-" + Сред(КодПодразделения, 4);
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеРеквизитаДокументДатаВыдачи(ДокументДатаВыдачи)
	
	Возврат Формат(ДокументДатаВыдачи, "ДФ=dd.MM.yyyy"); // АПК:335 Не локализуется (формат веб-сервиса).
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеВидаДокумента(ВидДокумента)
	
	Возврат ?(ВидДокумента = "21",
		НСтр("ru = 'паспорт гражданина Российской Федерации'"),
		НСтр("ru = 'иной документ, предусмотренный законодательством Российской Федерации'"));
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеРеквизитаСтраховойНомерПФР(СтраховойНомерПФР)
	
	Возврат Сред(СтраховойНомерПФР, 1, 3) + "-" + Сред(СтраховойНомерПФР,  4, 3)
	+ "-" + Сред(СтраховойНомерПФР, 7, 3) + " " + Сред(СтраховойНомерПФР, 10, 2);
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеРеквизитаДатаРождения(ДатаРождения)
	
	Возврат Формат(ДатаРождения, "ДФ=dd.MM.yyyy"); // АПК:335 Не локализуется (формат веб-сервиса).
	
КонецФункции

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

#Область ОблачныйСервисПодписи

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

&НаКлиенте
Процедура СоздатьЗапросВОблачныйСервисПослеОтправкиЗапроса(ОтветСервиса, Контекст) Экспорт
	
	Доступность = Истина;
	ОписаниеОшибки = "";
	Если Не ОтветСервиса.Выполнено Тогда
		Если ОтветСервиса.Свойство("КодОшибки")
		   И ОтветСервиса.КодОшибки = "ПользовательОтменилДействие" Тогда
			ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Ложь);
			Возврат;
		КонецЕсли;
		ОписаниеОшибки = ОтветСервиса.ОписаниеОшибки;
		Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
			ОписаниеОшибки = НСтр("ru = 'Сервис сообщил, что действие не выполнено.'");
		КонецЕсли;
	ИначеЕсли Не ЗначениеЗаполнено(ОтветСервиса.ИмяПровайдера) Тогда
		ОписаниеОшибки = НСтр("ru = 'Сервис вернул пустое имя криптопровайдера.'");
	ИначеЕсли Не ЗначениеЗаполнено(ОтветСервиса.ТипПровайдера) Тогда
		ОписаниеОшибки = НСтр("ru = 'Сервис вернул пустой тип криптопровайдера.'");
	КонецЕсли;
	
	Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
		
		ИдентификаторЗаявленияВОблачныйСервис = Неопределено;
		ПоказатьОшибкуВзаимодействияСОблачнымСервисом(
			НСтр("ru = 'Создание ключа электронной подписи и запроса на сертификат'"), ОписаниеОшибки);
		
		ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Ложь);
		Возврат;
		
	КонецЕсли;
	
	Модифицированность         = Истина;
	АдресЗапросаНаСертификат   = АдресЗапросаНаСертификат(ОтветСервиса.ЗапросСертификата, УникальныйИдентификатор);
	ОткрытаяЧастьКлючаЭП       = ПредставлениеДвоичныхДанных(Строка(ОтветСервиса.ОткрытыйКлюч));
	ИдентификаторКлючаСубъекта = ПредставлениеДвоичныхДанных(ИдентификаторКлючаСубъектаHexСтрокой(ОткрытаяЧастьКлючаЭП));
	ДокументыПоляСертификата   = Контекст.ЗапросНаСертификат;
	ДатаЗаявления              = Формат(ОбщегоНазначенияКлиент.ДатаСеанса(), "ДФ=dd.MM.yyyy"); // АПК:335 Не локализуется (формат веб-сервиса).
	
	ПрограммаИмя = ОтветСервиса.ИмяПровайдера;
	ПрограммаТип = ОтветСервиса.ТипПровайдера;
	
	ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Истина);
	
КонецПроцедуры

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

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

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

&НаСервереБезКонтекста
Функция АдресЗапросаНаСертификат(ЗапросСертификата, УникальныйИдентификатор)
	
	ФайлЗапросаНаСертификат = ПолучитьИмяВременногоФайла(".p10");
	
	ТекстЗапросаНаСертификат = "-----BEGIN NEW CERTIFICATE REQUEST-----" + Символы.ПС
		+ СтрЗаменить(Base64Строка(ЗапросСертификата), Символы.ВК, "") + Символы.ПС
		+ "-----END NEW CERTIFICATE REQUEST-----" + Символы.ПС;
	
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.УстановитьТекст(ТекстЗапросаНаСертификат);
	ТекстовыйДокумент.Записать(ФайлЗапросаНаСертификат);
	
	ДанныеЗапросаНаСертификат = Новый ДвоичныеДанные(ФайлЗапросаНаСертификат);
	УдалитьФайлы(ФайлЗапросаНаСертификат);
	
	Возврат ПоместитьВоВременноеХранилище(ДанныеЗапросаНаСертификат, УникальныйИдентификатор);
	
КонецФункции

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

#Область Тарифы

&НаКлиенте
Процедура ОтобразитьИнформациюОТарифах()
	
	Элементы.ПредставлениеТарифа.СписокВыбора.Очистить();
	ТолькоПросмотрЭлементов = ТолькоПросмотрЗаявления Или ЗаявлениеОтправлено(ЭтотОбъект);
	
	Если ТолькоПросмотрЭлементов Тогда
		
		Если ПустаяСтрока(ДанныеЗаявления.КодТарифа) Тогда
			Элементы.ГруппаТарифы.Видимость = Ложь;
		Иначе
			ВыбранныйТариф = Тарифы.Добавить();
			ВыбранныйТариф.Код = ДанныеЗаявления.КодТарифа;
			ВыбранныйТариф.Представление = ДанныеЗаявления.ПредставлениеТарифа;
			ВыбранныйТариф.Описание = ДанныеЗаявления.ОписаниеТарифа;
			
			Элементы.ПредставлениеТарифа.Вид = ВидПоляФормы.ПолеНадписи;
			Элементы.ПредставлениеТарифа.Ширина = 20;
			Элементы.ПредставлениеТарифа.РастягиватьПоГоризонтали = Ложь;
		КонецЕсли;
		
	Иначе
		
		ПолучитьИнформациюОТарифахНаСервере();
		
		Если Тарифы.Количество() = 1 Тогда
			Элементы.ПредставлениеТарифа.Вид = ВидПоляФормы.ПолеНадписи;
			Элементы.ПредставлениеТарифа.Ширина = 20;
			Элементы.ПредставлениеТарифа.РастягиватьПоГоризонтали = Ложь;
		Иначе
			Элементы.ПредставлениеТарифа.Вид = ВидПоляФормы.ПолеВвода;
			Для Каждого Тариф Из Тарифы Цикл
				Элементы.ПредставлениеТарифа.СписокВыбора.Добавить(Тариф.Представление);
			КонецЦикла;
		КонецЕсли;
		
		Если ПустаяСтрока(ДанныеЗаявления.КодТарифа) Тогда
			ДанныеЗаявления.КодТарифа = Тарифы[0].Код;
			ДанныеЗаявления.ПредставлениеТарифа = Тарифы[0].Представление;
			ДанныеЗаявления.ОписаниеТарифа = Тарифы[0].Описание;
		КонецЕсли;
		
		Элементы.ВключатьЛицензиюКриптоПроВСертификат.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Включить лицензию КриптоПро CSP (%1)'"),
			?(СтоимостьЛицензииКриптоПро > 0, Строка(СтоимостьЛицензииКриптоПро) + " ₽", "платно"));
		
	КонецЕсли;
	
	Элементы.ПредставлениеТарифаРасширеннаяПодсказка.Заголовок = ПодробноеОписаниеТарифа();
	
КонецПроцедуры

&НаСервере
Процедура ПолучитьИнформациюОТарифахНаСервере()
	
	Тарифы.Очистить();
	
	Попытка
		
		ВебСервис = ВебСервисУЦ();
		Фабрика = ВебСервис.Определение.ФабрикаXDTO;
		URIПространстваИмен = ВебСервис.ТочкаПодключения.Интерфейс.URIПространстваИмен;
		
		СвойстваФункции = Фабрика.Пакеты.Получить(URIПространстваИмен).КорневыеСвойства.Получить("GetTarifInfo1C");
		Если СвойстваФункции = Неопределено Тогда
			
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'В веб-сервисе ""%1"" не определена обязательная функция ""%2"".'"),
				ВебСервис.ТочкаПодключения.Местоположение + "?wsdl",
				"GetTarifInfo1C");
			
		КонецЕсли;
		
		ТипПустогоПараметра = СвойстваФункции.Тип;
		ЗначениеПустогоПараметра = Фабрика.Создать(ТипПустогоПараметра);
		
		Ответ = ВебСервис.GetTarifInfo1C(ЗначениеПустогоПараметра);
		
		Для Каждого ИнформацияОТарифе Из Ответ.TarifInfo1CData.TarifInfo1CResult.Tariffs.Tariff Цикл
			Если ИнформацияОТарифе.IsCryptoPro = Истина Тогда
				СтоимостьЛицензииКриптоПро = ИнформацияОТарифе.Price;
			Иначе
				НовыйТариф = Тарифы.Добавить();
				НовыйТариф.Код = ИнформацияОТарифе.Code;
				НовыйТариф.Представление = ИнформацияОТарифе.Name + ?(ИнформацияОТарифе.Price > 0, " (" + ИнформацияОТарифе.Price + " ₽)", "");
				НовыйТариф.Описание = ИнформацияОТарифе.Description;
				НовыйТариф.ТипПровайдера = ИнформацияОТарифе.ProviderType;
			КонецЕсли;
		КонецЦикла;
		
	Исключение
		
		Тарифы.Очистить();
		НовыйТариф = Тарифы.Добавить();
		СвойстваБазовогоТарифа = СвойстваБазовогоТарифа();
		ЗаполнитьЗначенияСвойств(НовыйТариф, СвойстваБазовогоТарифа);
		
	КонецПопытки;
	
КонецПроцедуры

&НаКлиенте
Функция ПодробноеОписаниеТарифа()
	
	Возврат СтроковыеФункцииКлиент.ФорматированнаяСтрока(ДанныеЗаявления.ОписаниеТарифа);
	
КонецФункции

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

&НаКлиентеНаСервереБезКонтекста
Функция СвойстваБазовогоТарифа()
	
	Результат = Новый Структура;
	
	Результат.Вставить("Код", "base");
	Результат.Вставить("Представление", НСтр("ru = '1С:Подпись.Базовый'"));
	Результат.Вставить("Описание", НСтр("ru = 'Подходит для ЭДО с контрагентами, сдачи отчетности, работы с Гос. Порталами.'"));
	Результат.Вставить("ТипПровайдера", "all");
	
	Возврат Результат;
	
КонецФункции

&НаКлиенте
Процедура ЗаполнитьПрограммуПослеИзмененияТарифа()
	
	ЗаполнитьПрограмму();
	
КонецПроцедуры

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

#Область ТехническаяИнформация

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

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

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


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

#Область Прочее

&НаКлиенте
Функция СсылкаНаДоверенность()
	
	Возврат "http://ca.1c.ru/doc/doverennost_p3.rtf";
	
КонецФункции

&НаКлиенте
Процедура ПроверитьФайл(ПомещаемыйФайл, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт
	
	РазмерФайлаВБайтах = ПомещаемыйФайл.Размер();
	
	Если РазмерФайлаВБайтах > 2*1024*1024 Тогда 
		
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Файл ""%1"" (%2 Б) превышает максимально допустимый размер файла для загрузки - 2 МБ.
			|Выберите другой файл или сохраните этот в другом формате (со сжатием).'"),
			ПомещаемыйФайл.Имя, РазмерФайлаВБайтах);
			
		ПоказатьПредупреждение(, ТекстОшибки);
		ОтказОтПомещенияФайла = Истина;
		Возврат;
	КонецЕсли;
	
	ПоддерживаемыеРасширения = "pdf,png,jpg,jpeg,zip";
	Если СтрНайти(ПоддерживаемыеРасширения, 
		НРег(ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ПомещаемыйФайл.Имя))) = 0 Тогда
			
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Формат файла ""%1"" не поддерживается для загрузки.
			|Выберите другой файл или сохраните этот в другом формате (%2).'"),
			ПомещаемыйФайл.Имя, ПоддерживаемыеРасширения);
			
		ПоказатьПредупреждение(, ТекстОшибки);
		ОтказОтПомещенияФайла = Истина;
		Возврат;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаСервереБезКонтекста
Функция ОписаниеТиповОрганизации()
	
	Возврат Метаданные.ОпределяемыеТипы.Организация.Тип;
	
КонецФункции

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

&НаКлиентеНаСервереБезКонтекста
Функция СвойстваУЦ(ВариантУдостоверяющегоЦентра)
	
	СвойстваУЦ = Новый Структура("КраткоеНаименованиеУЦ, ПолноеНаименованиеУЦ,
		|ИНН_УЦ, ЮридическиеКодыУЦ, АдресПорядкаУЦ,
		|ЮридическийАдресУЦ, ФактическийАдресУЦ, ЭлектроннаяПочтаУЦ");
	
	Если ВариантУдостоверяющегоЦентра = "KA" Тогда
		СвойстваУЦ.КраткоеНаименованиеУЦ = НСтр("ru = 'АО «КАЛУГА АСТРАЛ»'");
		СвойстваУЦ.ПолноеНаименованиеУЦ  = НСтр("ru = 'АО «КАЛУГА АСТРАЛ»'");
		СвойстваУЦ.ИНН_УЦ                = НСтр("ru = '4029017981'");
		СвойстваУЦ.ЮридическиеКодыУЦ     = НСтр("ru = 'ОКВЭД:62.0, ОКПО:48357148, ОКОГУ: 4210014, ОКОПФ: 12267, ОКФС: 16'");
		СвойстваУЦ.АдресПорядкаУЦ        = НСтр("ru = 'https://astral.ru/ReglamentCA.pdf'");
		СвойстваУЦ.ЮридическийАдресУЦ    = НСтр("ru = '248023, г. Калуга, пер. Теренинский, д. 6'");
		СвойстваУЦ.ФактическийАдресУЦ    = НСтр("ru = '248023, г. Калуга, пер. Теренинский, д. 6'");
		СвойстваУЦ.ЭлектроннаяПочтаУЦ    = НСтр("ru = 'ca@1c.ru'");
		
	ИначеЕсли ВариантУдостоверяющегоЦентра = "RT" Тогда
		СвойстваУЦ.КраткоеНаименованиеУЦ = НСтр("ru = 'АО ""ЕЭТП""'");
		СвойстваУЦ.ПолноеНаименованиеУЦ  = НСтр("ru = 'АО ""ЕЭТП""'");
		СвойстваУЦ.ИНН_УЦ                = НСтр("ru = '7707704692'");
		СвойстваУЦ.ЮридическиеКодыУЦ     = НСтр("ru = 'ОКВЭД:62.09, ОКПО:61740739, ОКОГУ: 4210014, ОКОПФ: 12247, ОКФС: 42'");
		СвойстваУЦ.АдресПорядкаУЦ        = НСтр("ru = 'https://www.roseltorg.ru/ecp/info/documents'");
		СвойстваУЦ.ЮридическийАдресУЦ    = НСтр("ru = '115114, Москва, ул. Кожевническая, д. 14, стр. 5'");
		СвойстваУЦ.ФактическийАдресУЦ    = НСтр("ru = '115114, Москва, ул. Кожевническая, д. 14, стр. 5'");
		СвойстваУЦ.ЭлектроннаяПочтаУЦ    = НСтр("ru = 'uc@roseltorg.ru'");
		
	ИначеЕсли ВариантУдостоверяющегоЦентра = "TK" Тогда
		СвойстваУЦ.КраткоеНаименованиеУЦ = НСтр("ru = 'ООО ""ТАКСКОМ""'");
		СвойстваУЦ.ПолноеНаименованиеУЦ  = НСтр("ru = 'ООО ""ТАКСКОМ""'");
		СвойстваУЦ.ИНН_УЦ                = НСтр("ru = '7704211201'");
		СвойстваУЦ.ЮридическиеКодыУЦ     = НСтр("ru = 'ОКВЭД:62.01, ОКПО:52630874, ОКОГУ: 4210014, ОКОПФ: 12300, ОКФС: 16'");
		СвойстваУЦ.АдресПорядкаУЦ        = НСтр("ru = 'https://taxcom.ru/upload/documents/doc_uc/poryadok_realizac_funkcyi_AUC.pdf'");
		СвойстваУЦ.ЮридическийАдресУЦ    = НСтр("ru = '119034, г. Москва, Барыковский пер., д. 4, стр. 2'");
		СвойстваУЦ.ФактическийАдресУЦ    = НСтр("ru = '119034, г. Москва, Барыковский пер., д. 4, стр. 2'");
		СвойстваУЦ.ЭлектроннаяПочтаУЦ    = НСтр("ru = 'taxcom@taxcom.ru'");
	Иначе
		СвойстваУЦ.КраткоеНаименованиеУЦ = НСтр("ru = 'ООО «НПЦ ""1С""»'");
		СвойстваУЦ.ПолноеНаименованиеУЦ  = НСтр("ru = 'ООО «Научно-производственный центр ""1С""»'");
		СвойстваУЦ.ИНН_УЦ                = НСтр("ru = '7729510210'");
		СвойстваУЦ.ЮридическиеКодыУЦ     = НСтр("ru = 'ОКВЭД:62.01, ОКПО:73827463, ОКОГУ: 4210014, ОКОПФ: 12300, ОКФС: 16'");
		СвойстваУЦ.АдресПорядкаУЦ        = НСтр("ru = 'http://ca.1c.ru/reglament.pdf'");
		СвойстваУЦ.ЮридическийАдресУЦ    = НСтр("ru = '119285, г. Москва, ул. Мосфильмовская, д.42, стр.1'");
		СвойстваУЦ.ФактическийАдресУЦ    = НСтр("ru = '127434, г. Москва, Дмитровское шоссе, д. 9'");
		СвойстваУЦ.ЭлектроннаяПочтаУЦ    = НСтр("ru = 'ca@1c.ru'");
	КонецЕсли;
	
	Возврат СвойстваУЦ;
	
КонецФункции

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

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

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

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

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

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

&НаСервере
Процедура ЗаполнитьЗаголовкиРеквизитов()
	
	Реквизиты = ПолучитьРеквизиты();
	Для Каждого Реквизит Из Реквизиты Цикл
		ЗаголовкиРеквизитов.Добавить(Реквизит.Имя, Реквизит.Заголовок);
	КонецЦикла;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ИдентификаторКлючаСубъектаHexСтрокой(ОткрытаяЧастьКлючаHexСтрокой)
	
	ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.SHA1);
	ХешированиеДанных.Добавить(ПолучитьДвоичныеДанныеИзHexСтроки(ОткрытаяЧастьКлючаHexСтрокой));
	
	Возврат ПолучитьHexСтрокуИзДвоичныхДанных(ХешированиеДанных.ХешСумма);
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция НайтиБезУчетаРегистраИРазделителяПути(Строка, ПодстрокаПоиска)
	
	Возврат СтрНайти(НРег(СтрЗаменить(Строка, "/", "\")), НРег(СтрЗаменить(ПодстрокаПоиска, "/", "\")));
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция УстановитьГиперссылку(Строка, Подстрока, Гиперссылка)
	
	Позиция = СтрНайти(Строка, Подстрока);
	Если Позиция = 0 Тогда
		Возврат Новый ФорматированнаяСтрока(Строка);
	КонецЕсли;
	
	СтрокаСоСсылкой = Новый ФорматированнаяСтрока(
		Подстрока,,,, Гиперссылка);
	
	Возврат Новый ФорматированнаяСтрока(Лев(Строка, Позиция-1),
		СтрокаСоСсылкой, Сред(Строка, Позиция + СтрДлина(Подстрока)));
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция НовыйСжатыйУникальныйИдентификатор()
	
	Возврат НРег(СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", ""));
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура ДобавитьВызов(Вызовы, Метод, П1, П2, П3 = Неопределено, П4 = Неопределено, П5 = Неопределено)
	
	Вызов = Новый Массив;
	Вызов.Добавить(Метод);
	Вызов.Добавить(П1);
	Вызов.Добавить(П2);
	Вызов.Добавить(П3);
	Вызов.Добавить(П4);
	Вызов.Добавить(П5);
	
	Вызовы.Добавить(Вызов);
	
КонецПроцедуры

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

&НаКлиенте
Процедура АктивизироватьОкно()
	
	Если Окно <> Неопределено Тогда
		Окно.Активизировать();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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