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

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	// Чтобы форма успела открыться и в момент загрузки модуля на ней прописывалось состояние его загрузки.
	ПодключитьОбработчикОжидания("Подключаемый_ПриОткрытии", 0.3, Истина);

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

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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

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

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

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

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

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

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

&НаКлиенте
Процедура НетЛогинаНажатие(Элемент)
	ИнтернетПоддержкаПользователейКлиент.ОткрытьСтраницуРегистрацииНовогоПользователя();
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура НачатьОткрытьЗаявлениеНаПодключениеУпрощенное_ПослеПоискаКриптопровайдеров(Результат, ВходящийКонтекст) Экспорт

	ОписаниеОшибки = "";
	
	Если Результат = Неопределено Тогда
		
		ViPNetCSPУстановлен    = Ложь;
		CryptoProCSPУстановлен = Ложь;

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

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

&НаКлиенте
Процедура НачатьОткрытьЗаявлениеНаПодключениеУпрощенное_ПослеПоказаОшибки(ВходящийКонтекст) Экспорт
	
	// Закрываем без дальнейших действий
	Закрыть();
	
КонецПроцедуры

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

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

&НаКлиенте
Функция СертификатыНужногоТипа(Сертификаты)
	
	ПолеINN     = "INN";
	ПолеINNLE   = "INNLE";
	ПолеСНИЛС   = "SNILS";
	ПолеИмя     = "GN";
	ПолеФамилия = "SN";
	
	НайденныеСертификаты = Новый Массив;
	
	Для каждого НайденныйСертификат Из Сертификаты Цикл
		
		Субъект = НайденныйСертификат.ВладелецСтруктура;
		
		Если (НЕ Субъект.Свойство(ПолеINN) И НЕ Субъект.Свойство(ПолеINNLE))
			ИЛИ НЕ Субъект.Свойство(ПолеСНИЛС)
			ИЛИ НЕ Субъект.Свойство(ПолеИмя)
			ИЛИ НЕ Субъект.Свойство(ПолеФамилия) Тогда
			
			Продолжить;
			
		КонецЕсли;
		
		// Валидность
		Валиден = НайденныйСертификат.ДействителенС < ТекущаяДата() 
			И НайденныйСертификат.ДействителенПо > ТекущаяДата();
			
		НайденныйСертификат.Вставить("Валиден", Валиден);
		
		НайденныеСертификаты.Добавить(НайденныйСертификат);
		
	КонецЦикла;
	
	Возврат Новый ФиксированныйМассив(НайденныеСертификаты);
	
КонецФункции

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

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

&НаСервере
Функция ЕстьНезавершенноеЗаявление()

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

		Возврат ЗначениеЗаполнено(Заявление);
		
	КонецЕсли;

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

&НаСервере
Функция НезавершенноеЗаявление()

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

	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		Если ВыборкаДетальныеЗаписи.Статус = Перечисления.СтатусыЗаявленияАбонентаСпецоператораСвязи.Подготовлено Тогда
			НезавершенноеЗаявление = ВыборкаДетальныеЗаписи.Ссылка;
		КонецЕсли;
	КонецЦикла;
	
	Возврат НезавершенноеЗаявление;

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

&НаСервере
Функция НужноПредложитьСоздатьВторичноеВместоПервичного()

	Возврат ОбработкаЗаявленийАбонента.НужноПредложитьСоздатьВторичноеВместоПервичного(ЭтотОбъект);

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

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

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

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

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

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

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

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

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

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

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