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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)

	АутентификацияОперационнойСистемы();

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

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


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

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

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

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

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

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

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

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

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

	Иначе
		
		Если ЗначениеЗаполнено(Корреспондент) Тогда
			СохранитьНастройкиТранспорта();
		КонецЕсли;
		
		Закрыть(ДанныеАутентификации);
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

