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

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

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область СлужебныйПрограммныйИнтерфейс

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

#Область ПроверкаПодключенияККорреспонденту

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

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

Процедура ПриОжиданииПроверкиПодключения(ПараметрыОбработчика, ПродолжитьОжидание = Истина) Экспорт
	
	ПриОжиданииДлительнойОперации(ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

Процедура ПриЗавершенииПроверкиПодключения(ПараметрыОбработчика, СтатусЗавершения) Экспорт
	
	ПриЗавершенииДлительнойОперации(ПараметрыОбработчика, СтатусЗавершения);
	
КонецПроцедуры

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

#Область СохранениеНастроекСинхронизации

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

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

// Для внутреннего использования.
//
Процедура ПриОжиданииСохраненияНастроекСинхронизации(ПараметрыОбработчика, ПродолжитьОжидание) Экспорт
	
	ПриОжиданииДлительнойОперации(ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

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

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

#Область УдалениеНастройкиСинхронизацииДанных

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

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

// Для внутреннего использования.
//
Процедура ПриОжиданииУдаленияНастройкиСинхронизации(ПараметрыОбработчика, ПродолжитьОжидание) Экспорт
	
	ПриОжиданииДлительнойОперации(ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

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

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

#Область РегистрацияДанныхДляНачальнойВыгрузки

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

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

// Для внутреннего использования.
//
Процедура ПриОжиданииРегистрацииДанныхДляНачальнойВыгрузки(ПараметрыОбработчика, ПродолжитьОжидание) Экспорт
	
	ПриОжиданииДлительнойОперации(ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

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

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

#Область ЗагрузкаНастроекXDTO

// Для внутреннего использования.
//
Процедура ПриНачалеЗагрузкиНастроекXDTO(НастройкиЗагрузки, ПараметрыОбработчика, ПродолжитьОжидание = Истина) Экспорт
	
	КлючФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Загрузка настроек XDTO (%1)'"),
		НастройкиЗагрузки.УзелОбмена);

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

// Для внутреннего использования.
//
Процедура ПриОжиданииЗагрузкиНастроекXDTO(ПараметрыОбработчика, ПродолжитьОжидание) Экспорт
	
	ПриОжиданииДлительнойОперации(ПараметрыОбработчика, ПродолжитьОжидание);
	
КонецПроцедуры

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

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

#Область ПереходНаВебСервис

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

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

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

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

#Область ЗагрузкаПриоритетныхДанныхВПодчиненныйУзелРИБ

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

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

// Для внутреннего использования.
//
Процедура ПриЗавершенииЗагрузкиСообщенияОбменаДаннымиСОбновлением(ПараметрыОбработчика, СтатусЗавершения) Экспорт
	
	ПриЗавершенииДлительнойОперации(ПараметрыОбработчика, СтатусЗавершения);
	
КонецПроцедуры

Процедура ЗагрузитьПриоритетныеДанныеВПодчиненныйУзелРИБВФоне(ПараметрыЗагрузки, АдресХранилища) Экспорт
	
	Результат = ИнициализироватьРезультатДлительнойОперации();

	Попытка
		ЗагрузитьПриоритетныеДанныеВПодчиненныйУзелРИБ(ПараметрыЗагрузки);
	Исключение
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(),
			УровеньЖурналаРегистрации.Ошибка,,, ПредставлениеОшибки);

		Результат.Отказ = Истина;
		Результат.СообщениеОбОшибке = ПредставлениеОшибки;
	КонецПопытки;
	
	Если ПараметрыЗагрузки.ЕстьОшибки Тогда
		Результат.Отказ = Истина;
		Результат.СообщениеОбОшибке = НСтр("ru = 'При выполнении загрузки данных возникли ошибки (см. Журнал регистрации).'")
	КонецЕсли;
	
	ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
	
КонецПроцедуры

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

#Область ЗагрузкаСообщенияПередОбновлениемИнформационнойБазы

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

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

// Для внутреннего использования.
//
Процедура ПриЗавершенииЗагрузкиСообщенияПередОбновлениемИнформационнойБазы(ПараметрыОбработчика, СтатусЗавершения) Экспорт
	
	ПриЗавершенииДлительнойОперации(ПараметрыОбработчика, СтатусЗавершения);
	
КонецПроцедуры

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

		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(),
			УровеньЖурналаРегистрации.Ошибка,,, ПредставлениеОшибки);
		
		Результат.Отказ = Истина;
		Результат.СообщениеОбОшибке = ПредставлениеОшибки;
	КонецПопытки;
	
	Если ПараметрыПроцедуры.ЕстьОшибки Тогда
		Результат.Отказ = Истина;
		Результат.СообщениеОбОшибке = НСтр("ru = 'При выполнении загрузки данных возникли ошибки (см. Журнал регистрации).'");
	КонецЕсли;
	
	ПоместитьВоВременноеХранилище(Результат, АдресХранилища);

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

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

Функция ВерсияФорматаНастроекОбменаДанными() Экспорт
	
	Возврат "1.2";
	
КонецФункции

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

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

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

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

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

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

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

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

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

#Область РаботаСДлительнымиОперациями

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

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

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

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

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

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

	КонецЦикла;
	
	УдалитьУстаревшиеВариантыНастроекВМоделиСервиса(ТаблицаНастройки);
	
КонецПроцедуры

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

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

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

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

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

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

Процедура ИсправитьДублированиеНастроекСинхронизации(НастройкиПодключения, Результат, Отказ)

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

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

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

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

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

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

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

Функция КодУзла(НастройкиПодключения)
	
	Если НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена
		Или НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента Тогда
		
		Возврат НастройкиПодключения.ПрефиксИнформационнойБазыИсточника;
			
	Иначе
		
		Возврат НастройкиПодключения.ИдентификаторИнформационнойБазыИсточника;
		
	КонецЕсли;
	
КонецФункции

Функция КодУзлаКорреспондента(НастройкиПодключения)
	
	Если НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбмена
		Или НастройкиПодключения.ИспользоватьПрефиксыДляНастройкиОбменаКорреспондента Тогда
		
		Возврат НастройкиПодключения.ПрефиксИнформационнойБазыПриемника;
			
	Иначе
		
		Возврат НастройкиПодключения.ИдентификаторИнформационнойБазыПриемника;
		
	КонецЕсли;
	
КонецФункции

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

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

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

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

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

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

// Возвращаемое значение:
//  Структура:
//   * Отказ - Булево
//   * СообщениеОбОшибке - Строка
//
Функция ИнициализироватьРезультатДлительнойОперации()
	
	Результат = Новый Структура;
	Результат.Вставить("Отказ",             Ложь);
	Результат.Вставить("СообщениеОбОшибке", "");
	
	Возврат Результат;
	
КонецФункции

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

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

				КонецЕсли;
				
			КонецЕсли;
			
		КонецЕсли;
		
	Исключение
		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(),
			УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
	
КонецПроцедуры

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

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

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

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

#КонецЕсли

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