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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	УстановитьУсловноеОформление();
	
	ИнициализацияРеквизитовФормы();
	
	ИнициализацияЭлементовФормы();
	
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура ТаблицаПродолжениеНастройкиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

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

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

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

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

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

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

	Оповещение = Новый ОписаниеОповещения("ЗавершениеВыбораФайлаНастроек", ЭтотОбъект);
		
	ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
	ПараметрыЗагрузки.Диалог.Фильтр = НСтр("ru = 'Файл настроек'") + "|*.json;*.xml";
	ПараметрыЗагрузки.Диалог.Заголовок = НСтр("ru = 'Выберите файл настроек'");
	
	ФайловаяСистемаКлиент.ЗагрузитьФайл(Оповещение, ПараметрыЗагрузки);
	
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура ЗавершениеВыбораФайлаНастроек(Результат, ДополнительныеНастройки) Экспорт

	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СообщениеОбОшибке = "";
	
	Попытка

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

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

	УдалитьФайлы(ИмяВременногоФайла);
	
	Файл = Новый Файл(ИмяФайлаНастроек);
	
	Если НРег(Файл.Расширение) = ".xml" Тогда
		НастройкиПодключения = ПрочитатьИПроверитьНастройкиПодключенияИзXML(Текст, СообщениеОбОшибке);
	ИначеЕсли НРег(Файл.Расширение) = ".json" Тогда
		НастройкиПодключения = ПрочитатьИПроверитьНастройкиПодключенияИзJSON(Текст, СообщениеОбОшибке);
	Иначе
		ТекстОшибки = НСтр("ru = 'Неверное расширение файла настроек.'",
			ОбщегоНазначения.КодОсновногоЯзыка());
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;
	
	Возврат НастройкиПодключения;
	
КонецФункции

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

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

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