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

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

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	УправлениеФормой();
	ПодключитьОбработчикОжидания("Подключаемый_ИзменитьРазмерыФормы", 0.2, Истина);
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура Режим_СменаПароляПриИзменении(Элемент)
	
	СменаРежима();
	
КонецПроцедуры

&НаКлиенте
Процедура Режим_СменаКлючаМобильногоПриложенияПриИзменении(Элемент)
	
	СменаРежима();
	
КонецПроцедуры

&НаКлиенте
Процедура Режим_ПовторнаяОтправкаКодаАктивацииПриИзменении(Элемент)
	
	СменаРежима();
	
КонецПроцедуры

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

&НаКлиенте
Процедура Режим_СменаКонтактовПриИзменении(Элемент)
	
	СменаРежима();
	
КонецПроцедуры

&НаКлиенте
Процедура ЭлектроннаяПочтаПриИзменении(Элемент)
	
	Элементы.ЭлектроннаяПочта.ОтметкаНезаполненного = НЕ ПроверитьЭлектроннуюПочту(ЭлектроннаяПочта);
		
КонецПроцедуры

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ИзменитьРазмерыФормы()
	
	Элементы.Раздел4.Видимость = НЕ Элементы.Раздел4.Видимость;
	Элементы.Раздел4.Видимость = НЕ Элементы.Раздел4.Видимость;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗакрытьФорму(РезультатВыбора = "")
	
	Закрыть(РезультатВыбора);
	
КонецПроцедуры

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

// Анализ номера мобильного телефона на российский стандарт
//
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьПредставлениеТелефона(Телефон) Экспорт
		
	Представление = "";
	ТекстДляОбработки = СокрЛП(Телефон);
	
	ТолькоЦифры = "";
	Для Индекс = 1 По СтрДлина(ТекстДляОбработки) Цикл
		ТекущийСимвол = Сред(ТекстДляОбработки, Индекс, 1);
		Если СтрНайти("0123456789", ТекущийСимвол) Тогда
			ТолькоЦифры = ТолькоЦифры + ТекущийСимвол;
		КонецЕсли;
	КонецЦикла;
	
	Если СтрДлина(ТолькоЦифры) = 11 
		И (Сред(ТолькоЦифры, 1, 1) = "7" ИЛИ Сред(ТолькоЦифры, 1, 1) = "8") Тогда
		ТолькоЦифры = Сред(ТолькоЦифры, 2);
	КонецЕсли;

	Если СтрДлина(ТолькоЦифры) = 10 Тогда
		Представление = СтрШаблон(
			"+7 %1 %2-%3-%4", 
			Сред(ТолькоЦифры, 1, 3), 
			Сред(ТолькоЦифры, 4, 3),
			Сред(ТолькоЦифры, 7, 2),
			Сред(ТолькоЦифры, 9));		
	КонецЕсли;
	
	Возврат Представление;	

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

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

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

&НаСервере
Функция УправлениеФормой()
	
	ИзменитьОформлениеРаздела1();
	ИзменитьОформлениеРаздела2();
	ИзменитьОформлениеРаздела3();
	ИзменитьОформлениеРаздела4();

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

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

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

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

&НаСервере
Функция ИзменитьОформлениеРаздела4()
	
	Элементы.ГруппаКонтактыВтораяСтрока.Доступность = 
		ЭтоНоваяУчетка() 
		ИЛИ Режим_СменаКонтактов;
		
	Элементы.Режим_СменаКонтактов.Видимость = НЕ ЭтоНоваяУчетка();
	
	Элементы.ДекорацияЛогина.Видимость = НЕ ЭтоНоваяУчетка();
	Элементы.ДекорацияОтступ6.Видимость = НЕ ЭтоНоваяУчетка();
	
	ИзменитьОформлениеПодсказокРаздела4();
	
КонецФункции

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

&НаСервере
Функция ЭтоНоваяУчетка()
	
	Возврат НЕ ЗначениеЗаполнено(УчетнаяЗапись);

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

&НаСервере
Функция КлючПоложенияОкна()
	
	Счетчик = "";
	Для НомерРаздела = 1 По 4 Цикл
		ИмяРаздела = "Раздел" + НомерРаздела;
		Счетчик = Счетчик + "_" + ?(Элементы[ИмяРаздела].Видимость, "1", "0");
	КонецЦикла;
	
	Возврат Счетчик;
	
КонецФункции

&НаКлиенте
Процедура ОбработкаКликаНаМобильномПриложении(Ссылка)
	
	Если Ссылка = "МобильноеПриложение" Тогда
		ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("https://www.cryptopro.ru/products/mydss");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПодсказкаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если НавигационнаяСсылкаФорматированнойСтроки = "Отсканируйте" Тогда
		
		ПоказатьКартинку(БиблиотекаКартинок.QRкодDSS);
		
	ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "СМС" Тогда
		
		ПоказатьКартинку(БиблиотекаКартинок.КодАктивизацииDSS);
		
	ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "ключ" Тогда
		
		ПоказатьКартинку(БиблиотекаКартинок.НовыйКлючDSS);
		
	ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "ОписаниеПароля" Тогда
		
		ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("https://help.astral.ru/v/147062857");
		
	ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "ОписаниеКлюча" Тогда
		
		ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("https://help.astral.ru/v/147062859");
		
	ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "ОписаниеТелефона" Тогда
		
		ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("https://help.astral.ru/v/147062853");
		
	ИначеЕсли НавигационнаяСсылкаФорматированнойСтроки = "ОписаниеПовтора" Тогда
		
		ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("https://help.astral.ru/v/147062855");
		
	КонецЕсли;
	
	
	ОбработкаКликаНаМобильномПриложении(НавигационнаяСсылкаФорматированнойСтроки);
	
КонецПроцедуры

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

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

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

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