Помощник настройки синхронизации данных / Настройка общих параметров / Модуль формы

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

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

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

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

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

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

	ФайловаяСистемаКлиент.ВыбратьКаталог(Оповещение, ЗаголовокДиалога, ИмяКаталогаСохраненияНастроек);

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

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

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

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

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Далее(Команда)
	
	ИзменитьПорядковыйНомерПерехода(+1);
	
КонецПроцедуры

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

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

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

#Область ИнициализацияФормыПриСоздании

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

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

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

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

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

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

#Область ПоставляемаяЧастьПомощника

&НаКлиенте
Процедура ИзменитьПорядковыйНомерПерехода(Итератор)
	
	ОчиститьСообщения();
	
	УстановитьПорядковыйНомерПерехода(ПорядковыйНомерПерехода + Итератор);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьПорядковыйНомерПерехода(Знач Значение)
	
	ЭтоПереходДалее = (Значение > ПорядковыйНомерПерехода);
	
	ПорядковыйНомерПерехода = Значение;
	
	Если ПорядковыйНомерПерехода < 0 Тогда
		
		ПорядковыйНомерПерехода = 0;
		
	КонецЕсли;
	
	ПорядковыйНомерПереходаПриИзменении(ЭтоПереходДалее);
	
КонецПроцедуры

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

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

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

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

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

#Область ОбработчикиСобытийПереходов

// Получение параметров корреспондента

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

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

	Возврат Неопределено;
		
КонецФункции

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

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

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

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

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

&НаКлиенте 
Процедура НастроитьГруппаВосстановленияНастроек()
	
	Элементы.ГруппаВосстановлениеНастроекОбмена.Видимость = 
		Объект.ВосстановлениеНастроекОбмена = "ВосстановлениеСПредупреждением";
	
КонецПроцедуры

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

// Страница общих параметров

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

// Сохранение настроек подключения

&НаКлиенте
Функция Подключаемый_СохранениеНастроекПодключения_ПриОткрытии(Отказ, ПропуститьСтраницу, Знач ЭтоПереходДалее) Экспорт

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

	Возврат Неопределено;
		
КонецФункции

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

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

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

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

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

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

		ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, АдресНастроекПодключенияXML));
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(АдресНастроекПодключенияJSON) Тогда
		
		ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(
			ИмяКаталогаСохраненияНастроек,
			ИмяФайлаНастроекДляПриемника + ".json");
		
		ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, АдресНастроекПодключенияJSON));
		
	КонецЕсли;
	
	Если ПолучаемыеФайлы.Количество() > 0 Тогда
		
		Оповещение = Новый ОписаниеОповещения("СохранитьФайлыНастроекПодключенияЗавершение", ЭтотОбъект);
		
		ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайлов();
		ПараметрыСохранения.Интерактивно = Ложь;
			
		ФайловаяСистемаКлиент.СохранитьФайлы(Оповещение, ПолучаемыеФайлы, ПараметрыСохранения);
		
	Иначе
		
		ИзменитьПорядковыйНомерПерехода(+1);
		
	КонецЕсли;
	
КонецПроцедуры

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

	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ИзменитьПорядковыйНомерПерехода(+1);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ЗаполнитьТаблицуПереходов()
	
	ТаблицаПереходов.Очистить();
	
	Переход = ТаблицаПереходов.Добавить();
	Переход.ПорядковыйНомерПерехода = 1;
	Переход.ИмяОсновнойСтраницы     = "СтраницаПолучениеПараметровКорреспондента";
	Переход.ИмяСтраницыНавигации    = "СтраницаНавигацииОжидание";
	Переход.ИмяОбработчикаПриОткрытии = "Подключаемый_ПолучениеПараметровКорреспондента_ПриОткрытии";
	
	Переход = ТаблицаПереходов.Добавить();
	Переход.ПорядковыйНомерПерехода = 2;
	Переход.ИмяОсновнойСтраницы     = "СтраницаОбщиеНастройкиСинхронизации";
	Переход.ИмяСтраницыНавигации    = "СтраницаНавигацииДалее";
	Переход.ИмяОбработчикаПриПереходеДалее = "Подключаемый_СтраницаОбщиеНастройкиСинхронизации_ПриПереходеДалее";
	
	Переход = ТаблицаПереходов.Добавить();
	Переход.ПорядковыйНомерПерехода = 3;
	Переход.ИмяОсновнойСтраницы     = "СтраницаСохранениеНастроекПодключения";
	Переход.ИмяСтраницыНавигации    = "СтраницаНавигацииОжидание";
	Переход.ИмяОбработчикаПриОткрытии = "Подключаемый_СохранениеНастроекПодключения_ПриОткрытии";
	
	Переход = ТаблицаПереходов.Добавить();
	Переход.ПорядковыйНомерПерехода = 4;
	Переход.ИмяОсновнойСтраницы     = "СтраницаОкончание";
	Переход.ИмяСтраницыНавигации    = "СтраницаНавигацииГотово";
	
	Переход = ТаблицаПереходов.Добавить();
	Переход.ПорядковыйНомерПерехода = 5;
	Переход.ИмяОсновнойСтраницы     = "СтраницаОшибка";
	Переход.ИмяСтраницыНавигации    = "СтраницаНавигацииОжидание";
	Переход.ИмяОбработчикаПриОткрытии = "Подключаемый_СтраницаОшибка_ПриОткрытии";
	
КонецПроцедуры

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



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