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

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

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

&НаКлиенте
Перем РежимПроверки;

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

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

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

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

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

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

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	
	Если ВариантДействия = 0 Тогда
		ПроверяемыеРеквизиты.Добавить("Логин");
		ПроверяемыеРеквизиты.Добавить("СерверОблачнойПодписи");
		Если ПроверкаСодержимогоЛогина(Логин) Тогда
			ОбщегоНазначения.СообщитьПользователю(
				НСтр("ru = 'Логин содержит недопустимые символы.
				|Разрешенные символы A-Z, 0-9, ""_"", ""@"", ""."".'"),
				, "Логин", , Отказ);
		КонецЕсли;
	Иначе
		ПроверяемыеРеквизиты.Добавить("УчетнаяЗапись");
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ВариантДействияПриИзменении(Элемент)
	
	УстановитьДоступностьЭлементов();
	
КонецПроцедуры

&НаКлиенте
Процедура ВариантДействияСоздатьПриИзменении(Элемент)
	
	УстановитьДоступностьЭлементов();
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОК(Команда)
	
	ПодборУчетнойЗаписи();
	
КонецПроцедуры

&НаКлиенте
Процедура Восстановить(Команда)
	
	ВосстановитьУчетнуюЗапись();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПоказатьСообщениеПользователюЗавершение(ДополнительныеПараметры) Экспорт
	
	ТекущийЭлемент = Элементы.Логин;
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаСервере
Процедура ЗаполнитьСписокУчетныхЗаписей()
	
	МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS");
	ВесьСписок = МодульСервисКриптографииDSS.ПолучитьВсеУчетныеЗаписи();
					
	СписокВыбора = Элементы.УчетнаяЗапись.СписокВыбора;
	СписокВыбора.Очистить();
	
	Для Счетчик = 1 По Мин(ВесьСписок.Количество(), 10) Цикл
		СтрокаТаблицы = ВесьСписок[Счетчик - 1];
		СписокВыбора.Добавить(СтрокаТаблицы.Ссылка, СтрокаТаблицы.Логин);
	КонецЦикла;	
	
КонецПроцедуры

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

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

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

&НаСервереБезКонтекста
Функция ПроверкаСодержимогоЛогина(Знач ТекущийЛогин)
	
	Результат = Ложь;
	ТекущийЛогин = ВРег(ТекущийЛогин);
	
	РазрешенныеСимволы = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_@-.";
	ВсегоСимволов = СтрДлина(ТекущийЛогин);
	
	Для Счетчик = 1 По ВсегоСимволов Цикл
		Если СтрНайти(РазрешенныеСимволы, Сред(ТекущийЛогин, Счетчик, 1)) = 0 Тогда
			Результат = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
	
конецФункции

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

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

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