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

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ЗаполнитьТаблицуЭтаповНастройки();
	ОбновитьОтображениеТекущегоСостоянияНастройки();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура НастроитьОбщиеПараметрыПродолжение()

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

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

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

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

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

&НаКлиенте
Процедура ВыполнитьНачальнуюВыгрузкуДанных(Команда)

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

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

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

&НаКлиенте
Процедура ПередВыполнениемНачальнойВыгрузки(Отказ)
	
КонецПроцедуры

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

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

&НаСервереБезКонтекста
Функция НачальныйОбразСоздан(УзелОбмена)
	
	Возврат РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.НачальныйОбразСоздан(УзелОбмена);
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервереБезКонтекста
Функция НастройкаСинхронизацииЗавершена(УзелОбмена, СсылкаСуществует = Ложь)
	
	СсылкаСуществует = ОбщегоНазначения.СсылкаСуществует(УзелОбмена);
	Возврат ОбменДаннымиСервер.НастройкаСинхронизацииЗавершена(УзелОбмена);
	
КонецФункции

&НаСервереБезКонтекста
Функция ВыполненаЗагрузкаДанныхДляСопоставления(УзелОбмена)
	
	Возврат Не ОбменДаннымиСервер.ПолученоСообщениеСДаннымиДляСопоставления(УзелОбмена);
	
КонецФункции

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

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

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

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

				// Помещение в безопасное хранилище
				РеквизитыДляБезопасногоХранилища = ТранспортСообщенийОбмена.ПараметрТранспорта(
				НастройкиПодключения.ИдентификаторТранспорта, "РеквизитыДляБезопасногоХранилища");

				НастройкиТранспорта = НастройкиПодключения.НастройкиТранспорта;

				УстановитьПривилегированныйРежим(Истина);

				Для Каждого Реквизит Из РеквизитыДляБезопасногоХранилища Цикл

					Значение = НастройкиТранспорта[Реквизит];

					Если ЗначениеЗаполнено(Значение) Тогда

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

					КонецЕсли;

				КонецЦикла;

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

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

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

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

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



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

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

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