#Область ОписаниеПеременных
&НаКлиенте
Перем Криптография, РаботаСДвоичнымиДанными, ПрограммыАвто;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не ЗначениеЗаполнено(Параметры.СертификатСсылка) Тогда
КлючНаТокене = Параметры.НаТокене;
ВыполнитьПроверкуПравДоступа("Добавление", Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования);
КонецЕсли;
УстановитьДоступностьВариантовЗаявления();
Если Не ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.ЗаявленияНаВыпускСертификата) Тогда
ТолькоПросмотрЗаявления = Истина;
КонецЕсли;
Если ЭлектроннаяПодпись.УправлениеОповещениямиОСертификатах()
И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда
МодульНапоминанияПользователя = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователя");
ДоступныНапоминанияПользователя = МодульНапоминанияПользователя.ИспользуютсяНапоминанияПользователя();
КонецЕсли;
Элементы.НаименованиеСокращенное.Видимость = Ложь;
Элементы.ВладелецСертификатаСтрокой.Видимость = Ложь;
Элементы.ОчиститьПаспорт.Видимость = Ложь;
Элементы.ОчиститьСНИЛС.Видимость = Ложь;
Элементы.ОчиститьДоверенность.Видимость = Ложь;
ЭтоПодчиненныйУзелРИБ = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ();
ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь();
Если ОбщегоНазначения.РазделениеВключено() Тогда
ИнтернетПоддержкаПользователейПодключена = Истина;
ИначеЕсли ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей") Тогда
МодульИнтернетПоддержкаПользователей = ОбщегоНазначения.ОбщийМодуль("ИнтернетПоддержкаПользователей");
ИнтернетПоддержкаПользователейПодключена = МодульИнтернетПоддержкаПользователей.ЗаполненыДанныеАутентификацииПользователяИнтернетПоддержки();
КонецЕсли;
ЗаполнитьЗаголовкиРеквизитов();
Если ЗначениеЗаполнено(Параметры.СертификатСсылка) Тогда
Попытка
ЗагрузитьЗаявление();
Если ЗначениеЗаполнено(ДанныеЗаявления.СертификатОснование) Тогда
ПродлениеСертификатаСтороннегоУЦ = СертификатВыпущенСтороннимУЦ(ДанныеЗаявления.СертификатОснование);
СертификатОснованиеДействуетДо = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
ДанныеЗаявления.СертификатОснование, "ДействителенДо");
КонецЕсли;
ПриИзмененииОрганизацииНаСервере(Истина);
Исключение
РазблокироватьДанныеДляРедактирования(Параметры.СертификатСсылка, УникальныйИдентификатор);
ВызватьИсключение;
КонецПопытки;
ИначеЕсли ЗначениеЗаполнено(Параметры.СертификатОснование) Тогда
ПродлениеСертификатаСтороннегоУЦ = СертификатВыпущенСтороннимУЦ(Параметры.СертификатОснование);
СкопироватьЗаявление(Параметры.СертификатОснование);
ПриИзмененииОрганизацииНаСервере(Истина);
Иначе
ДокументыПартнерЭтоИП = Ложь;
Объект.Добавил = Пользователи.ТекущийПользователь();
Объект.Пользователь = Объект.Добавил;
Если ЗаявлениеДляФизическихЛицДоступно
И ЗначениеЗаполнено(Параметры.ФизическоеЛицо) Тогда
ЭтоФизическоеЛицо = Истина;
Сотрудник = Параметры.ФизическоеЛицо;
СозданиеПоПараметруФизическоеЛицо = Истина;
ИначеЕсли ЗаявлениеДляОрганизацийДоступно
И ЗначениеЗаполнено(Параметры.Организация) Тогда
Организация = Параметры.Организация;
СозданиеПоПараметруОрганизация = Истина;
КонецЕсли;
ПриИзмененииОрганизацииНаСервере(Ложь);
КонецЕсли;
Если Не ЗначениеЗаполнено(ДанныеЗаявления.СостояниеЗаявления) Тогда
ДанныеЗаявления.СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.НеПодготовлено;
КонецЕсли;
УстановитьВидимостьИДоступность();
УстановитьОтображениеРеквизитовЗависимыхОтВидаПродления();
Если Не ТолькоПросмотрЗаявления
И ЗначениеЗаполнено(Параметры.СертификатСсылка)
И ДанныеЗаявления.СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.Подготовлено
И Не ЗначениеЗаполнено(ВладелецИНН)
И Не ЭтоФизическоеЛицо И Не ЭтоИндивидуальныйПредприниматель Тогда
ПриПотереГотовности(ЭтотОбъект, Истина);
Иначе
Модифицированность = Ложь;
КонецЕсли;
Элементы.ГруппаПодсказкаКриптопровайдеры.Видимость = Ложь;
ПодсказкаОбслуживающейОрганизации = СтроковыеФункции.ФорматированнаяСтрока(
НСтр("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
И Реквизит = Неопределено Тогда
ОписаниеТипов = Новый ОписаниеТипов(РеквизитТип.ВыгрузитьЗначения());
Реквизит = ОписаниеТипов.ПривестиЗначение(Неопределено);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииОрганизацииНаСервере(Загрузка = Ложь)
ЗаполнитьРеквизитыОрганизации(Загрузка);
ПриИзмененииРуководителяНаСервере(Загрузка);
ПриИзмененииПартнераНаСервере(Загрузка);
ПриИзмененииВладельцаСертификатаНаСервере(Загрузка);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьРеквизитыОрганизации(Загрузка = Ложь)
Если ОрганизацияТип = Неопределено Или ЭтоФизическоеЛицо Тогда
Если ЭлектроннаяПодпись.ОбщиеНастройки().ОрганизацияИспользуется Тогда
ОписаниеТиповОрганизации = ОписаниеТиповОрганизации();
ЗаполнитьТипыЗначения(ОрганизацияТип, Элементы.Организация, ОписаниеТиповОрганизации);
Иначе
ЗаполнитьТипыЗначения(ОрганизацияТип, Элементы.Организация, Неопределено);
КонецЕсли;
КонецЕсли;
Реквизиты = РеквизитыОрганизации();
Реквизиты.Вставить("ТипОрганизации", ?(ОрганизацияТип = Неопределено,
Неопределено, Новый ОписаниеТипов(ОрганизацияТип.ВыгрузитьЗначения())));
Реквизиты.Вставить("Организация", ТекущееЗначениеРеквизита(Организация, ОрганизацияТип, "Организация"));
Реквизиты.ЭтоИндивидуальныйПредприниматель = ЭтоИндивидуальныйПредприниматель;
Если ЭтоФизическоеЛицо Тогда
Реквизиты.Организация = Неопределено;
Иначе
Реквизиты.Вставить("ФактическийАдрес", "");
ЭлектроннаяПодписьПереопределяемый.ПриЗаполненииРеквизитовОрганизацииВЗаявленииНаСертификат(Реквизиты);
ЗаявлениеНаСертификатПереопределяемый.ПриЗаполненииРеквизитовОрганизацииВЗаявленииНаСертификат(Реквизиты);
КонецЕсли;
ЗаполнитьТипыЗначения(ОрганизацияТип, Элементы.Организация, Реквизиты.ТипОрганизации);
Если ОрганизацияТип = Неопределено Тогда
Элементы.Организация.ПодсказкаВвода = НСтр("ru = 'Заполните поля организации'");
Элементы.НаименованиеСокращенное.КнопкаВыбора = Ложь;
Иначе
Элементы.Организация.ПодсказкаВвода = НСтр("ru = 'Выберите организацию или заполните поля вручную'");
КонецЕсли;
Организация = ?(Загрузка, Организация, ТекущееЗначениеРеквизита(Реквизиты.Организация, ОрганизацияТип));
УточнитьПустоеЗначение(Организация, ОрганизацияТип, Загрузка);
Если Загрузка Тогда
УстановитьОтображениеРеквизитовЗависимыхОтОрганизации();
Иначе
ПриПотереГотовности(ЭтотОбъект);
Если ЭтоФизическоеЛицо Тогда
ОчиститьРеквизитыОрганизации(Ложь);
УстановитьОтображениеРеквизитовЗависимыхОтОрганизации();
Иначе
УстановитьРеквизитыОрганизации(Реквизиты);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииВладельцаСертификатаНаСервере(Загрузка = Ложь)
Реквизиты = РеквизитыВладельцаСертификата();
Реквизиты.Вставить("Директор");
Реквизиты.Вставить("ГлавныйБухгалтер");
Реквизиты.Вставить("Пользователь");
Реквизиты.Вставить("ЭтоФизическоеЛицо", ЭтоФизическоеЛицо);
Реквизиты.Вставить("Организация", ТекущееЗначениеРеквизита(Организация, ОрганизацияТип));
Реквизиты.Вставить("Сотрудник", ТекущееЗначениеРеквизита(Сотрудник, СотрудникТип, "ФизическоеЛицо"));
Реквизиты.Вставить("ТипВладельца");
ПереименоватьКлючи(Реквизиты, "ВладелецИНН,ВладелецАдресРегистрации,ВладелецТелефон", "ИНН,АдресРегистрации,Телефон");
ЭлектроннаяПодписьПереопределяемый.ПриЗаполненииРеквизитовВладельцаВЗаявленииНаСертификат(Реквизиты);
ЗаявлениеНаСертификатПереопределяемый.ПриЗаполненииРеквизитовВладельцаВЗаявленииНаСертификат(Реквизиты);
ПереименоватьКлючи(Реквизиты, "ИНН,АдресРегистрации,Телефон", "ВладелецИНН,ВладелецАдресРегистрации,ВладелецТелефон");
Реквизиты.ВладелецАдресРегистрации = "";
ЗаполнитьТипыЗначения(СотрудникТип, Элементы.Сотрудник, Реквизиты.ТипВладельца);
Элементы.Сотрудник.СписокВыбора.Очистить();
Если СотрудникТип = Неопределено Тогда
Элементы.Сотрудник.ПодсказкаВвода = НСтр("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:'")));
Возврат Не ОбработкаМодуль.ПроверитьЗаполнениеРеквизитов(ЭтотОбъект,
ПроверяемыеРеквизиты, ЭтоИндивидуальныйПредприниматель, ЭтоФизическоеЛицо);
КонецФункции
&НаСервереБезКонтекста
Функция РеквизитыОрганизации()
Реквизиты = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.РеквизитыОрганизации(Неопределено);
Возврат Новый Структура(СтрСоединить(Реквизиты.ВыгрузитьЗначения(), ","));
КонецФункции
&НаСервереБезКонтекста
Функция РеквизитыОрганизацииСписок(Форма)
Реквизиты = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.РеквизитыОрганизации(Форма);
Возврат Реквизиты;
КонецФункции
&НаСервереБезКонтекста
Функция РеквизитыВладельцаСертификата()
Реквизиты = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.РеквизитыВладельцаСертификата(Неопределено);
Возврат Новый Структура(СтрСоединить(Реквизиты.ВыгрузитьЗначения(), ","));
КонецФункции
&НаСервереБезКонтекста
Функция РеквизитыВладельцаСертификатаСписок(Форма)
Реквизиты = Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.РеквизитыВладельцаСертификата(Форма);
Возврат Реквизиты;
КонецФункции
#КонецОбласти
#Область ИзменениеДополнительныхРеквизитов
&НаКлиенте
Процедура ОбработчикОжиданияРеквизитыРуководителяПриИзменении()
Попытка
ПриИзмененииРуководителяНаСервере();
ЭтоОбработкаОповещения = Ложь;
Исключение
ЭтоОбработкаОповещения = Ложь;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикОжиданияРеквизитыПартнераПриИзменении()
Попытка
ПриИзмененииПартнераНаСервере();
ЭтоОбработкаОповещения = Ложь;
Исключение
ЭтоОбработкаОповещения = Ложь;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииРуководителяНаСервере(Загрузка = Ложь)
Если Не Загрузка Тогда
ПриПотереГотовности(ЭтотОбъект);
КонецЕсли;
Если ЭтоИндивидуальныйПредприниматель Или ЭтоФизическоеЛицо Тогда
ОчиститьРеквизитыПодписанта();
Возврат;
КонецЕсли;
Реквизиты = Новый Структура;
Реквизиты.Вставить("Должность");
Реквизиты.Вставить("Основание");
Реквизиты.Вставить("Организация", ТекущееЗначениеРеквизита(Организация, ОрганизацияТип));
Реквизиты.Вставить("Представление");
Реквизиты.Вставить("ТипРуководителя");
Реквизиты.Вставить("Руководитель",
ТекущееЗначениеРеквизита(ДокументыРуководительСсылка, ДокументыРуководительТип));
ЭлектроннаяПодписьПереопределяемый.ПриЗаполненииРеквизитовРуководителяВЗаявленииНаСертификат(Реквизиты);
ЗаявлениеНаСертификатПереопределяемый.ПриЗаполненииРеквизитовРуководителяВЗаявленииНаСертификат(Реквизиты);
ЗаполнитьТипыЗначения(ДокументыРуководительТип, Элементы.ДокументыРуководитель, Реквизиты.ТипРуководителя);
Если Загрузка Тогда
Элементы.ДокументыРуководитель.КнопкаОткрытия = ЗначениеЗаполнено(ДокументыРуководительСсылка);
Возврат;
КонецЕсли;
ОчиститьРеквизитыПодписанта();
ДокументыРуководительСсылка = ТекущееЗначениеРеквизита(Реквизиты.Руководитель, ДокументыРуководительТип);
ДокументыРуководитель = СокрЛП(?(Реквизиты.Представление <> Неопределено, Реквизиты.Представление, Реквизиты.Руководитель));
Элементы.ДокументыРуководитель.КнопкаОткрытия = ЗначениеЗаполнено(ДокументыРуководительСсылка);
ДокументыРуководительДолжность = Реквизиты.Должность;
ДокументыРуководительОснование = Реквизиты.Основание;
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииПартнераНаСервере(Загрузка = Ложь)
Реквизиты = Новый Структура();
Реквизиты.Вставить("ИНН");
Реквизиты.Вставить("КПП");
Реквизиты.Вставить("Партнер", ТекущееЗначениеРеквизита(ДокументыПартнерСсылка, ДокументыПартнерТип));
Реквизиты.Вставить("ТипПартнера");
Реквизиты.Вставить("ЭтоФизическоеЛицо", ЭтоФизическоеЛицо);
Реквизиты.Вставить("Организация", ТекущееЗначениеРеквизита(Организация, ОрганизацияТип));
Реквизиты.Вставить("Представление");
Реквизиты.Вставить("ЭтоИндивидуальныйПредприниматель", ДокументыПартнерЭтоИП);
ЭлектроннаяПодписьПереопределяемый.ПриЗаполненииРеквизитовПартнераВЗаявленииНаСертификат(Реквизиты);
ЗаявлениеНаСертификатПереопределяемый.ПриЗаполненииРеквизитовПартнераВЗаявленииНаСертификат(Реквизиты);
ЗаполнитьТипыЗначения(ДокументыПартнерТип, Элементы.ДокументыПартнер, Реквизиты.ТипПартнера);
Если Не Загрузка Тогда
ПриПотереГотовности(ЭтотОбъект);
ОчиститьРеквизитыПартнера();
ДокументыПартнер = СокрЛП(?(Реквизиты.Представление <> Неопределено, Реквизиты.Представление, Реквизиты.Партнер));
ДокументыПартнерСсылка = ТекущееЗначениеРеквизита(Реквизиты.Партнер, ДокументыПартнерТип);
ДокументыПартнерЭтоИП = Реквизиты.ЭтоИндивидуальныйПредприниматель;
РеквизитыФормы = РеквизитыОбслуживающейОрганизации();
РеквизитыФормы.ДокументыПартнерИНН = Реквизиты.ИНН;
РеквизитыФормы.ДокументыПартнерКПП = Реквизиты.КПП;
УстановитьРеквизит(РеквизитыФормы, "ДокументыПартнерИНН", Истина);
Если ДокументыПартнерЭтоИП Тогда
ДокументыПартнерКПП = Неопределено;
Иначе
УстановитьРеквизит(РеквизитыФормы, "ДокументыПартнерКПП", Истина);
КонецЕсли;
КонецЕсли;
Элементы.ДокументыПартнер.КнопкаОткрытия = ЗначениеЗаполнено(ДокументыПартнерСсылка);
Элементы.ДокументыПартнерКПП.Доступность = Не ДокументыПартнерЭтоИП;
КонецПроцедуры
&НаСервере
Процедура ДозаполнитьПоПредыдущемуЗаявлениюИлиСертификату(ДанныеСертификата)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаявленияНаВыпускСертификата.СодержаниеЗаявления КАК СодержаниеЗаявления
|ИЗ
| РегистрСведений.ЗаявленияНаВыпускСертификата КАК ЗаявленияНаВыпускСертификата
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК
| СертификатыКлючейЭлектроннойПодписиИШифрования
| ПО ЗаявленияНаВыпускСертификата.Сертификат = СертификатыКлючейЭлектроннойПодписиИШифрования.Ссылка
|ГДЕ
| (СертификатыКлючейЭлектроннойПодписиИШифрования.Фамилия = &Фамилия
| И СертификатыКлючейЭлектроннойПодписиИШифрования.Имя = &Имя
| И СертификатыКлючейЭлектроннойПодписиИШифрования.Отчество = &Отчество
| И СертификатыКлючейЭлектроннойПодписиИШифрования.Организация = &Организация
| ИЛИ &ОтборПоФизическомуЛицу)
| И СертификатыКлючейЭлектроннойПодписиИШифрования.Ссылка <> &ЭтаСсылка
| И НЕ СертификатыКлючейЭлектроннойПодписиИШифрования.ПометкаУдаления
|УПОРЯДОЧИТЬ ПО
| СертификатыКлючейЭлектроннойПодписиИШифрования.ДействителенДо УБЫВ";
Запрос.УстановитьПараметр("ЭтаСсылка", Объект.Ссылка);
Запрос.УстановитьПараметр("Имя", ДанныеСертификата.Имя);
Запрос.УстановитьПараметр("Фамилия", ДанныеСертификата.Фамилия);
Запрос.УстановитьПараметр("Отчество", ДанныеСертификата.Отчество);
Запрос.УстановитьПараметр("Организация", ДанныеСертификата.Организация);
Запрос.УстановитьПараметр("ФизическоеЛицо", ДанныеСертификата.Сотрудник);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПоФизическомуЛицу",
?(ЗначениеЗаполнено(ДанныеСертификата.Сотрудник), "СертификатыКлючейЭлектроннойПодписиИШифрования.ФизическоеЛицо = &ФизическоеЛицо", "ЛОЖЬ"));
СведенияОЗаявлении = Запрос.Выполнить().Выбрать();
РеквизитыЗаявления = Неопределено;
Пока СведенияОЗаявлении.Следующий() Цикл
РеквизитыЗаявления = СведенияОЗаявлении.СодержаниеЗаявления.Получить();
Если ТипЗнч(РеквизитыЗаявления) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
Прервать;
КонецЦикла;
Если РеквизитыЗаявления <> Неопределено Тогда
Если ЗаявлениеДляОрганизацийДоступно Тогда
СведенияОбОрганизации = РеквизитыОрганизации();
СведенияОбОрганизации.Вставить("Телефон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";
Если ВключатьЛицензиюКриптоПроВСертификат И ВыбранаПрограммаКриптоПро(ПрограммаИдентификатор, СписокПрограмм, Объект.Программа) Тогда
ШаблонСертификата = "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", Лев(ПолеОбщееИмя, 255));
ПолеФамилия = Фамилия;
Поля.Вставить("SN", Лев(ПолеФамилия, 255));
ПолеОтчество = СокрП(Имя + " " + Отчество);
Поля.Вставить("G", Лев(ПолеОтчество, 255));
Поля.Вставить("C", "RU");
Если ЗначениеЗаполнено(ВладелецАдресРегистрацииXML) И ЭтоФизическоеЛицо Или Не ЭтоФизическоеЛицо Тогда
Если ЭтоФизическоеЛицо Тогда
ТекстОшибки = НСтр("ru = 'Некорректный адрес регистрации физического лица:'") + Символы.ПС;
Иначе
ТекстОшибки = НСтр("ru = 'Некорректный адрес регистрации организации:'") + Символы.ПС;
КонецЕсли;
ПолеРегион = Адрес.КодРегиона + " " + ИмяРегионаРФПоРекомендациямДляСКПЭП(Адрес.КодРегиона, ТекстОшибки);
Если ЗначениеЗаполнено(ТекстОшибки) Тогда
Возврат "";
КонецЕсли;
Поля.Вставить("S", Лев(ПолеРегион, 255));
ПолеНаселенныйПункт = Лев(НаселенныйПунктПолностью(Адрес), 255);
Если ЗначениеЗаполнено(ПолеНаселенныйПункт) Тогда
Поля.Вставить("L", ПолеНаселенныйПункт);
КонецЕсли;
ПолеУлица = Лев(ПредставлениеЧастиАдреса(Адрес,
"Улица,
|ДополнительнаяТерритория,
|ЭлементДополнительнойТерритории" + ?(ЭтоФизическоеЛицо, "", ",
|Здание, Корпуса, Помещения")), 255);
Если ЗначениеЗаполнено(ПолеУлица) Тогда
Поля.Вставить("Street", ПолеУлица);
КонецЕсли;
КонецЕсли;
Если ЭтоИндивидуальныйПредприниматель Тогда
Поля.Вставить("OGRNIP", ОГРН);
ИначеЕсли Не ЭтоФизическоеЛицо Тогда
Поля.Вставить("O", Лев(НаименованиеСокращенное, 255));
Если ЗначениеЗаполнено(Подразделение) Тогда
Поля.Вставить("OU", Лев(Подразделение, 255));
КонецЕсли;
Поля.Вставить("T", Лев(Должность, 255));
Если ЗначениеЗаполнено(ОГРН) Тогда
Поля.Вставить("OGRN", ОГРН);
КонецЕсли;
КонецЕсли;
Поля.Вставить("SNILS", СтраховойНомерПФР);
Если ЭтоИндивидуальныйПредприниматель Тогда
Поля.Вставить("INN", ИНН);
Иначе
Если Не ЭтоФизическоеЛицо Тогда
Поля.Вставить("INNLE", Прав(ИНН, 10));
КонецЕсли;
Поля.Вставить("INN", ВладелецИНН);
КонецЕсли;
СпособИдентификации = ?(ДанныеЗаявления.ОформленоВЭлектронномВиде, 1, 0);
Поля.Вставить("IdentKind", СпособИдентификации);
Поля.Вставить("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");
РасширенныеАтрибуты.Вставить("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");
Попытка
Ждать УдалитьФайлыАсинх(Контекст.ИмяФайлаЗапроса);
Исключение
ИмяСобытия = НСтр("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 = 'Для отправки заявления подключите Интернет-поддержку пользователей.'"));
Возврат;
КонецЕсли;
Иначе
ВыполнитьОбработкуОповещения(Оповещение, Новый Структура);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПакетЗаявления(Знач ОписанияФайловПакета, Знач ТипТранзакции)
ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(
ПолучитьИмяВременногоФайла("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") Тогда
Возврат "СКЗИ Рутокен ЭЦП";
ИначеЕсли СтрНачинаетсяС(НРег(Модель), "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");
ЗаписьXML.ЗаписатьАтрибут("ДатаВремяФормирования", XMLСтрока(ТекущаяДатаСеанса()));
ЗаписьXML.ЗаписатьАтрибут("ВерсПрог", "1С");
Запись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.ЗаписатьНачалоЭлемента("УдЛичн");
Запись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, "БилетПользователя", Билет);
ЗаписьXML.ЗаписатьКонецЭлемента();
СтрокаXML = ЗаписьXML.Закрыть();
ОписаниеДанных = НовыйОписаниеДанных();
ОписаниеДанных.Данные = АдресФайлаЗаявления(СтрокаXML);
ОписаниеДанных.Представление.Представление = НСтр("ru = 'Файл заявления'");
ОписаниеДанных.ОписаниеДляПакета.ИмяФайла = НовыйСжатыйУникальныйИдентификатор() + ".bin";
ОписаниеДанных.ОписаниеДляПакета.ИдентификаторДокумента = НовыйСжатыйУникальныйИдентификатор();
ОписаниеДанных.ОписаниеДляПакета.ТипДокумента = "Заявление";
ОписаниеДанных.ОписаниеДляПакета.ТипСодержимого = "xml";
МассивОписаний = Новый Массив;
МассивОписаний.Добавить(ОписаниеДанных);
Возврат МассивОписаний;
КонецФункции
&НаСервере
Функция ЗаявлениеXMLДляЭлектронногоПродления(ОписаниеОшибки)
Билет = ТикетАутентификацииНаПорталеПоддержки(ОписаниеОшибки);
Если Билет = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ПризнакЮридическогоЛица = Не ЭтоИндивидуальныйПредприниматель И Не ЭтоФизическоеЛицо;
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("windows-1251");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Заявление");
ЗаписьXML.ЗаписатьАтрибут("ВерсФорм", "1.4");
ЗаписьXML.ЗаписатьАтрибут("ДатаВремяФормирования", XMLСтрока(ТекущаяДатаСеанса()));
ЗаписьXML.ЗаписатьАтрибут("ВерсПрог", "1С");
Запись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.ЗаписатьНачалоЭлемента("УдЛичн");
Запись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, "БилетПользователя", Билет);
ЗаписьXML.ЗаписатьКонецЭлемента();
СтрокаXML = ЗаписьXML.Закрыть();
Возврат АдресФайлаЗаявления(СтрокаXML);
КонецФункции
&НаСервере
Функция АдресФайлаЗаявления(СтрокаXML)
ПотокЗаявления = Новый ПотокВПамяти();
ЗаписьЗаявления = Новый ЗаписьДанных(ПотокЗаявления);
ЗаписьЗаявления.ЗаписатьСтроку(СтрокаXML, "windows-1251");
ЗаписьЗаявления.Закрыть();
ДвоичныеДанныеЗаявления = ПотокЗаявления.ЗакрытьИПолучитьДвоичныеДанные();
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанныеЗаявления, УникальныйИдентификатор);
КонецФункции
&НаСервере
Функция УдостоверяющийЦентр()
Если ВариантУдостоверяющегоЦентра = "KA" Тогда
Возврат "АО ""КАЛУГА АСТРАЛ""";
ИначеЕсли ВариантУдостоверяющегоЦентра = "RT" Тогда
Возврат "АО ""ЕЭТП""";
ИначеЕсли ВариантУдостоверяющегоЦентра = "TK" Тогда
Возврат "ООО ""ТАКСКОМ""";
КонецЕсли;
Возврат "ООО ""НПЦ ""1С""";
КонецФункции
&НаСервере
Процедура Запись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");
Запись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");
СоздатьКлючИЗапросНаСертификатЗавершение(Контекст);
КонецПроцедуры
&НаКлиенте
Процедура СоздатьКлючИЗапросНаСертификатПослеОшибкиВызоваСоздатьЗапросНаСертификат(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
СтандартнаяОбработка = Ложь;
ДобавитьСписокОшибокПослеОшибкиВызоваВнешнейКомпоненты(ИнформацияОбОшибке, Новый ОписаниеОповещения(
"СоздатьКлючИЗапросНаСертификатПослеУточненияОшибкиВызоваСоздатьЗапросНаСертификат", ЭтотОбъект, Контекст));
КонецПроцедуры
&НаКлиенте
Процедура СоздатьКлючИЗапросНаСертификатПослеУточненияОшибкиВызоваСоздатьЗапросНаСертификат(ТекстОшибки, Контекст) Экспорт
СоздатьКлючИЗапросНаСертификатЗавершение(Контекст, ТекстОшибки,
НСтр("ru = 'Не удалось выполнить операцию по причине:
|%1
|
|Возможно, операция отменена или завершилась неудачей в приложении электронной подписи.
|Повторите попытку.'"));
КонецПроцедуры
&НаКлиенте
Процедура СоздатьКлючИЗапросНаСертификатЗавершение(Контекст, ИнформацияОбОшибке = Неопределено, ЗаголовокОшибки = "%1")
Если ИнформацияОбОшибке <> Неопределено Тогда
Контекст.ЗапросСоздан = Ложь;
ПоказатьОшибкуСозданияЗапросаНаСертификат(ИнформацияОбОшибке);
ИначеЕсли Не Контекст.ЗапросСоздан Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Запрос на сертификат не создан.'"));
КонецЕсли;
Если Контекст.Свойство("Файл") Тогда
Контекст.Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения(
"СоздатьКлючИЗапросНаСертификатПослеПроверкиСуществованияФайлаДляУдаления", ЭтотОбъект, Контекст));
Иначе
СоздатьКлючИЗапросНаСертификатПослеУдаленияФайлов(Контекст);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьОшибкуСозданияЗапросаНаСертификат(ИнформацияОбОшибке, ЗаголовокОшибки = "%1")
Ошибка = Новый Структура;
Ошибка.Вставить("ПоказатьИнструкцию", Истина);
Ошибка.Вставить("ОписаниеОшибки",
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ЗаголовокОшибки, ПредставлениеОшибкиДляПользователя(ИнформацияОбОшибке)));
ЭлектроннаяПодписьСлужебныйКлиент.ПоказатьОшибкуОбращенияКПрограмме(
НСтр("ru = 'Создание запроса на сертификат'"), "", Ошибка,
Новый Структура, Новый Структура("ПоказатьИнструкцию", Истина));
КонецПроцедуры
&НаКлиенте
Процедура СоздатьКлючИЗапросНаСертификатПослеПроверкиСуществованияФайлаДляУдаления(Существует, Контекст) Экспорт
Если Существует Тогда
ОповещениеПослеУдаленияФайлов = Новый ОписаниеОповещения(
"СоздатьКлючИЗапросНаСертификатПослеУдаленияФайлов", ЭтотОбъект, Контекст,
"СоздатьКлючИЗапросНаСертификатПослеОшибкиУдаленияФайлов", ЭтотОбъект);
НачатьУдалениеФайлов(ОповещениеПослеУдаленияФайлов, Контекст.ИмяФайлаЗапроса);
Иначе
СоздатьКлючИЗапросНаСертификатПослеУдаленияФайлов(Контекст);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьКлючИЗапросНаСертификатПослеУдаленияФайлов(Контекст) Экспорт
ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.ЗапросСоздан);
КонецПроцедуры
&НаКлиенте
Процедура СоздатьКлючИЗапросНаСертификатПослеОшибкиУдаленияФайлов(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
СтандартнаяОбработка = Ложь;
СоздатьКлючИЗапросНаСертификатЗавершение(Контекст, ИнформацияОбОшибке,
НСтр("ru = 'Не удалось удалить файл запроса на сертификат на компьютере по причине:
|%1'"));
КонецПроцедуры
#КонецОбласти
#Область КонтейнерКлючей
&НаКлиенте
Процедура ПроверитьСуществованиеКонтейнераКлючей(Оповещение, ПутьПослеСоздания, ИмяДляСоздания)
Контекст = Новый Структура;
Контекст.Вставить("Оповещение", Оповещение);
Контекст.Вставить("ПутьПослеСоздания", ПутьПослеСоздания);
Контекст.Вставить("ИмяДляСоздания", ИмяДляСоздания);
Контекст.Вставить("Результат", Новый Структура("Существует, ТекстОшибки", Ложь, ""));
Если Не ЗначениеЗаполнено(Контекст.ПутьПослеСоздания) Тогда
ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.Результат);
Возврат;
КонецЕсли;
ПолучитьИменаКонтейнеровКлючей(Новый ОписаниеОповещения(
"ПроверитьСуществованиеКонтейнераКлючейПослеПолученияИменКонтейнеров", ЭтотОбъект, Контекст));
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьИменаКонтейнеровКлючей(Оповещение)
Контекст = Новый Структура;
Контекст.Вставить("Оповещение", Оповещение);
Контекст.Вставить("СписокИмен", Новый СписокЗначений);
Контекст.Вставить("ПервыйПроход", Истина);
Контекст.Вставить("Индекс", -1);
Контекст.Вставить("ТекущееИмя", "");
Контекст.Вставить("Результат", Новый Структура("ИменаКонтейнеровКлючей, ТекстОшибки", "", ""));
ПолучитьИменаКонтейнеровКлючейЦиклНачало(Контекст);
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьИменаКонтейнеровКлючейЦиклНачало(Контекст)
ОповещениеПолучитьСледующийКонтейнер = Новый ОписаниеОповещения(
"ПолучитьИменаКонтейнеровКлючейЦиклПослеВызоваПолучитьСледующийКонтейнерКлючей", ЭтотОбъект, Контекст,
"ПолучитьИменаКонтейнеровКлючейЦиклПослеОшибкиВызоваПолучитьСледующийКонтейнерКлючей", ЭтотОбъект);
Криптография.НачатьВызовПолучитьСледующийКонтейнерКлючей(ОповещениеПолучитьСледующийКонтейнер,
Контекст.ТекущееИмя, Контекст.ПервыйПроход);
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьИменаКонтейнеровКлючейЦиклПослеВызоваПолучитьСледующийКонтейнерКлючей(Результат, ПараметрыВызова, Контекст) Экспорт
Если Не ВозможноПродолжениеПослеОперацииКомпоненты() Тогда
Возврат;
КонецЕсли;
Контекст.Вставить("РезультатПослеВызоваПолучитьСледующийКонтейнерКлючей", Результат);
Контекст.Вставить("ПараметрыВызоваПослеВызоваПолучитьСледующийКонтейнерКлючей", ПараметрыВызова);
Криптография.НачатьПолучениеСписокОшибок(Новый ОписаниеОповещения(
"ПолучитьИменаКонтейнеровКлючейЦиклПослеВызоваПолучитьСледующийКонтейнерКлючейПослеПолученияСписокОшибок", ЭтотОбъект, Контекст));
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьИменаКонтейнеровКлючейЦиклПослеВызоваПолучитьСледующийКонтейнерКлючейПослеПолученияСписокОшибок(СписокОшибок, Контекст) Экспорт
Если Не ВозможноПродолжениеПослеОперацииКомпоненты() Тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(СписокОшибок) Тогда
ПолучитьИменаКонтейнеровКлючейЦиклПослеУточненияОшибкиВызоваПолучитьСледующийКонтейнерКлючей(СписокОшибок, Контекст);
Возврат;
КонецЕсли;
Результат = Контекст.РезультатПослеВызоваПолучитьСледующийКонтейнерКлючей;
ПараметрыВызова = Контекст.ПараметрыВызоваПослеВызоваПолучитьСледующийКонтейнерКлючей;
Если Результат <> Истина Тогда
Если Контекст.ПервыйПроход Тогда
Контекст.ПервыйПроход = Ложь;
Контекст.ТекущееИмя = "";
ПолучитьИменаКонтейнеровКлючейЦиклНачало(Контекст);
Иначе
Имена = "";
Для каждого ЭлементСписка Из Контекст.СписокИмен Цикл
УникальноеИмя = ЭлементСписка.Значение;
Если УникальноеИмя = ЭлементСписка.Представление
И СтрНайти(УникальноеИмя, "/") = 0
И СтрНайти(УникальноеИмя, "\") = 0
И СтрНайти(УникальноеИмя, ":") = 0 Тогда
УникальноеИмя = "\Infotecs\Containers\" + УникальноеИмя;
КонецЕсли;
Имена = Имена + Символы.ПС + УникальноеИмя;
Имена = Имена + Символы.ПС + ЭлементСписка.Представление;
Имена = Имена + Символы.ПС;
КонецЦикла;
Контекст.Результат.ИменаКонтейнеровКлючей = СокрЛП(Имена);
ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.Результат);
КонецЕсли;
Возврат;
КонецЕсли;
ТекущееИмя = ПараметрыВызова[0];
Контекст.ТекущееИмя = ТекущееИмя;
Если Контекст.ПервыйПроход Тогда
Контекст.СписокИмен.Добавить(ТекущееИмя);
Иначе
Контекст.Индекс = Контекст.Индекс + 1;
Контекст.СписокИмен[Контекст.Индекс].Представление = ТекущееИмя;
КонецЕсли;
ПолучитьИменаКонтейнеровКлючейЦиклНачало(Контекст);
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьИменаКонтейнеровКлючейЦиклПослеОшибкиВызоваПолучитьСледующийКонтейнерКлючей(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
СтандартнаяОбработка = Ложь;
ДобавитьСписокОшибокПослеОшибкиВызоваВнешнейКомпоненты(ИнформацияОбОшибке, Новый ОписаниеОповещения(
"ПолучитьИменаКонтейнеровКлючейЦиклПослеУточненияОшибкиВызоваПолучитьСледующийКонтейнерКлючей", ЭтотОбъект, Контекст));
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьИменаКонтейнеровКлючейЦиклПослеУточненияОшибкиВызоваПолучитьСледующийКонтейнерКлючей(ТекстОшибки, Контекст) Экспорт
Контекст.Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось получить имя следующего контейнера ключей по причине:
|%1'"),
ТекстОшибки);
ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.Результат);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСуществованиеКонтейнераКлючейПослеПолученияИменКонтейнеров(ОписаниеИмен, Контекст) Экспорт
Результат = Контекст.Результат;
Результат.ТекстОшибки = ОписаниеИмен.ТекстОшибки;
Если ЗначениеЗаполнено(Результат.ТекстОшибки) Тогда
ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
Возврат;
КонецЕсли;
ИменаКонтейнеровКлючей = ОписаниеИмен.ИменаКонтейнеровКлючей;
Если ВыбранаПрограммаКриптоПро(ПрограммаИдентификатор, СписокПрограмм, Объект.Программа) Тогда
Результат.Существует = НайтиБезУчетаРегистраИРазделителяПути(
ИменаКонтейнеровКлючей, Контекст.ИмяДляСоздания) > 0;
ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
Возврат;
КонецЕсли;
Позиция = СтрНайти(Контекст.ПутьПослеСоздания, ":.");
Если Позиция = 0 Тогда
Результат.Существует = НайтиБезУчетаРегистраИРазделителяПути(
ИменаКонтейнеровКлючей, Контекст.ИмяДляСоздания) > 0;
ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
Возврат;
КонецЕсли;
ИмяПослеСоздания = Лев(Контекст.ПутьПослеСоздания, Позиция - 1);
Если НайтиБезУчетаРегистраИРазделителяПути(ИменаКонтейнеровКлючей, ИмяПослеСоздания) > 0 Тогда
Результат.Существует = Истина;
ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
Возврат;
КонецЕсли;
Позиция = НайтиБезУчетаРегистраИРазделителяПути(ИмяПослеСоздания, "\Infotecs\Containers\");
Если Позиция = 0 Тогда
ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
Возврат;
КонецЕсли;
ИмяПослеСоздания = Сред(ИмяПослеСоздания, Позиция);
Результат.Существует = НайтиБезУчетаРегистраИРазделителяПути(
ИменаКонтейнеровКлючей, ИмяПослеСоздания) > 0;
ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьИмяНовогоКонтейнераКлюча(Оповещение)
Дата = ТекущаяДата();
ДатаСоздания = Формат(Дата, "ДФ=гггг-ММ-дд") + " " + Формат(Дата, "ДФ=ЧЧ") + "-" + Формат(Дата, "ДФ=мм");
Субъект = СубъектНовогоИмениКонтейнераКлюча();
Контекст = Новый Структура;
Контекст.Вставить("Оповещение", Оповещение);
Контекст.Вставить("НовоеИмя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 = 'Исполнено. Сертификат не установлен.'");
ДанныеЗаявления.СостояниеЗаявления = Перечисления.СостоянияЗаявленияНаВыпускСертификата.ИсполненоСертификатНеУстановлен;
Если ЗначениеЗаполнено(ОшибкаУстановкиСертификата) Тогда
ДанныеЗаявления.СостояниеОбработкиЗаявления = ДанныеЗаявления.СостояниеОбработкиЗаявления + Символы.ПС + ОшибкаУстановкиСертификата;
КонецЕсли;
КонецЕсли;
ЗаписатьЗаявление();
УстановитьВидимостьИДоступность();
КонецПроцедуры
#КонецОбласти
#Область ПредставлениеДанных
&НаКлиенте
Процедура ДобавитьСписокОшибокПослеОшибкиВызоваВнешнейКомпоненты(ИнформацияОбОшибке, Оповещение)
Контекст = Новый Структура;
Контекст.Вставить("ИнформацияОбОшибке", ИнформацияОбОшибке);
Контекст.Вставить("Оповещение", Оповещение);
Криптография.НачатьПолучениеСписокОшибок(Новый ОписаниеОповещения(
"ДобавитьСписокОшибокПослеОшибкиВызоваВнешнейКомпонентыПослеПолученияСписокОшибок", ЭтотОбъект, Контекст));
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьСписокОшибокПослеОшибкиВызоваВнешнейКомпонентыПослеПолученияСписокОшибок(СписокОшибок, Контекст) Экспорт
Криптография = Неопределено;
РаботаСДвоичнымиДанными = Неопределено;
Если Не ВозможноПродолжениеПослеОперацииКомпоненты() Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Контекст.ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда
ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(Контекст.ИнформацияОбОшибке);
Иначе
ТекстОшибки = Строка(Контекст.ИнформацияОбОшибке);
КонецЕсли;
Если ЗначениеЗаполнено(СписокОшибок) Тогда
ТекстОшибки = ТекстОшибки + Символы.ПС + СокрЛП(СписокОшибок);
КонецЕсли;
ВыполнитьОбработкуОповещения(Контекст.Оповещение, СокрЛП(ТекстОшибки));
КонецПроцедуры
&НаКлиенте
Функция ПредставлениеОшибкиДляПользователя(ИнформацияОбОшибке)
Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда
Возврат ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
Иначе
Возврат Строка(ИнформацияОбОшибке);
КонецЕсли;
КонецФункции
&НаСервереБезКонтекста
Функция ИмяРегионаРФПоРекомендациямДляСКПЭП(КодРегиона, ТекстОшибки)
Если ПустаяСтрока(КодРегиона) Тогда
ТекстОшибки = ТекстОшибки + НСтр("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");
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеВидаДокумента(ВидДокумента)
Возврат ?(ВидДокумента = "21",
НСтр("ru = 'паспорт гражданина Российской Федерации'"),
НСтр("ru = 'иной документ, предусмотренный законодательством Российской Федерации'"));
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеРеквизитаСтраховойНомерПФР(СтраховойНомерПФР)
Возврат Сред(СтраховойНомерПФР, 1, 3) + "-" + Сред(СтраховойНомерПФР, 4, 3)
+ "-" + Сред(СтраховойНомерПФР, 7, 3) + " " + Сред(СтраховойНомерПФР, 10, 2);
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеРеквизитаДатаРождения(ДатаРождения)
Возврат Формат(ДатаРождения, "ДФ=dd.MM.yyyy");
КонецФункции
#КонецОбласти
#Область ОблачныйСервисПодписи
&НаКлиенте
Процедура СоздатьЗапросВОблачныйСервис(ОбработкаЗавершения)
ИдентификаторЗаявленияВОблачныйСервис = Новый УникальныйИдентификатор;
Контекст = Новый Структура;
Контекст.Вставить("ОбработкаЗавершения", ОбработкаЗавершения);
Контекст.Вставить("ЗапросНаСертификат", Неопределено);
ТекстОшибки = "";
ТекстЗапросаНаСертификат = ОписаниеЗапросаНаКвалифицированныйСертификат(Контекст.ЗапросНаСертификат, ТекстОшибки);
Если ЗначениеЗаполнено(ТекстОшибки) Тогда
ПоказатьОшибкуСозданияЗапросаНаСертификат(ТекстОшибки);
ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Ложь);
Возврат;
КонецЕсли;
МодульМенеджерСервисаКриптографииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МенеджерСервисаКриптографииКлиент");
МодульМенеджерСервисаКриптографииКлиент.СоздатьКонтейнерИЗапросНаСертификат(
Новый ОписаниеОповещения("СоздатьЗапросВОблачныйСервисПослеОтправкиЗапроса", ЭтотОбъект, Контекст),
ИдентификаторЗаявленияВОблачныйСервис, ТекстЗапросаНаСертификат);
КонецПроцедуры
&НаКлиенте
Процедура СоздатьЗапросВОблачныйСервисПослеОтправкиЗапроса(ОтветСервиса, Контекст) Экспорт
Доступность = Истина;
ОписаниеОшибки = "";
Если Не ОтветСервиса.Выполнено Тогда
Если ОтветСервиса.Свойство("КодОшибки")
И ОтветСервиса.КодОшибки = "ПользовательОтменилДействие" Тогда
ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Ложь);
Возврат;
КонецЕсли;
ОписаниеОшибки = ОтветСервиса.ОписаниеОшибки;
Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
ОписаниеОшибки = НСтр("ru = 'Сервис сообщил, что действие не выполнено.'");
КонецЕсли;
ИначеЕсли Не ЗначениеЗаполнено(ОтветСервиса.ИмяПровайдера) Тогда
ОписаниеОшибки = НСтр("ru = 'Сервис вернул пустое имя криптопровайдера.'");
ИначеЕсли Не ЗначениеЗаполнено(ОтветСервиса.ТипПровайдера) Тогда
ОписаниеОшибки = НСтр("ru = 'Сервис вернул пустой тип криптопровайдера.'");
КонецЕсли;
Если Не ПустаяСтрока(ОписаниеОшибки) Тогда
ИдентификаторЗаявленияВОблачныйСервис = Неопределено;
ПоказатьОшибкуВзаимодействияСОблачнымСервисом(
НСтр("ru = 'Создание ключа электронной подписи и запроса на сертификат'"), ОписаниеОшибки);
ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Ложь);
Возврат;
КонецЕсли;
Модифицированность = Истина;
АдресЗапросаНаСертификат = АдресЗапросаНаСертификат(ОтветСервиса.ЗапросСертификата, УникальныйИдентификатор);
ОткрытаяЧастьКлючаЭП = ПредставлениеДвоичныхДанных(Строка(ОтветСервиса.ОткрытыйКлюч));
ИдентификаторКлючаСубъекта = ПредставлениеДвоичныхДанных(ИдентификаторКлючаСубъектаHexСтрокой(ОткрытаяЧастьКлючаЭП));
ДокументыПоляСертификата = Контекст.ЗапросНаСертификат;
ДатаЗаявления = Формат(ОбщегоНазначенияКлиент.ДатаСеанса(), "ДФ=dd.MM.yyyy");
ПрограммаИмя = ОтветСервиса.ИмяПровайдера;
ПрограммаТип = ОтветСервиса.ТипПровайдера;
ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Истина);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьСертификатОблачногоСервиса()
МодульМенеджерСервисаКриптографииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МенеджерСервисаКриптографииКлиент");
МодульМенеджерСервисаКриптографииКлиент.УстановитьСертификатВКонтейнерИХранилище(
Новый ОписаниеОповещения("УстановитьСертификатОблачногоСервисаПослеУстановки", ЭтотОбъект),
ИдентификаторЗаявленияВОблачныйСервис, ПолучитьИзВременногоХранилища(АдресСертификата));
КонецПроцедуры
&НаКлиенте
Процедура УстановитьСертификатОблачногоСервисаПослеУстановки(ОтветСервиса, ДополнительныеПараметры) Экспорт
Если Не ОтветСервиса.Выполнено Тогда
ЗаголовокОшибки = НСтр("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";
КонецФункции
#КонецОбласти
#КонецОбласти