#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область СлужебныйПрограммныйИнтерфейс
Процедура ВыгрузитьНастройкиПодключенияДляПодчиненногоУзлаРИБ(НастройкиПодключения) Экспорт
УстановитьПривилегированныйРежим(Истина);
Текст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.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]);
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьПодключениеККорреспонденту(Параметры, АдресРезультата) Экспорт
РезультатПроверки = Новый Структура;
РезультатПроверки.Вставить("ПодключениеУстановлено", Ложь);
РезультатПроверки.Вставить("ПодключениеРазрешено", Ложь);
РезультатПроверки.Вставить("ВерсииИнтерфейса", Неопределено);
РезультатПроверки.Вставить("СообщениеОбОшибке", "");
РезультатПроверки.Вставить("ПараметрыКорреспондентаПолучены", Ложь);
РезультатПроверки.Вставить("ПараметрыКорреспондента", Неопределено);
РезультатПроверки.Вставить("ЭтотУзелЕстьВКорреспонденте", Ложь);
РезультатПроверки.Вставить("УзелКорреспондентаЕстьВЭтойБазе", Ложь);
РезультатПроверки.Вставить("УзелДляУдаления", Неопределено);
РезультатПроверки.Вставить("ИмяПланаОбменаКорреспондента","");
Транспорт = ТранспортСообщенийОбмена.Инициализация(Параметры.НастройкиПодключения);
Если Транспорт.ПодключениеУстановлено() Тогда
РезультатПроверки.ПодключениеУстановлено = Истина;
РезультатПроверки.ПодключениеРазрешено = Истина;
Иначе
СообщениеОбОшибке = Транспорт.СообщениеОбОшибке;
КонецЕсли;
ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
КонецПроцедуры
Функция СохранитьНастройкиПодключения(НастройкиПодключения) Экспорт
УстановитьПривилегированныйРежим(Истина);
Результат = Новый Структура;
Результат.Вставить("НастройкиПодключенияСохранены", Ложь);
Результат.Вставить("ЕстьДанныеДляСопоставления", Ложь);
Результат.Вставить("УзелОбмена", Неопределено);
Результат.Вставить("СообщениеОбОшибке", "");
Результат.Вставить("СтрокаНастроекПодключенияXML", "");
Результат.Вставить("СтрокаНастроекПодключенияJSON", "");
Отказ = Ложь;
ИсправитьДублированиеНастроекСинхронизации(НастройкиПодключения, Результат, Отказ);
Если Отказ Тогда
Возврат Результат;
КонецЕсли;
Попытка
ВыполнитьДействияПоНастройкеОбменаДанными(НастройкиПодключения);
Исключение
Отказ = Истина;
Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
Возврат Результат;
КонецПопытки;
ИдентификаторТранспорта = НастройкиПодключения.ИдентификаторТранспорта;
ПараметрыТранспорта = ТранспортСообщенийОбмена.ПараметрыТранспорта(ИдентификаторТранспорта);
Если ПараметрыТранспорта.ПрямоеПодключение Тогда
Параметры = ТранспортСообщенийОбмена.ПараметрыИнициализации();
Параметры.Корреспондент = НастройкиПодключения.УзелИнформационнойБазы;
ЗаполнитьЗначенияСвойств(Параметры, НастройкиПодключения);
Транспорт = ТранспортСообщенийОбмена.Инициализация(Параметры);
Если Не Транспорт.СохранитьНастройкиВКорреспонденте(НастройкиПодключения) Тогда
Отказ = Истина;
Результат.СообщениеОбОшибке = Транспорт.СообщениеОбОшибке;
КонецЕсли;
ИначеЕсли НЕ ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(НастройкиПодключения.ИмяПланаОбмена) Тогда
Результат.СтрокаНастроекПодключенияXML = ТранспортСообщенийОбмена.НастройкиПодключенияВXML(НастройкиПодключения);
Результат.СтрокаНастроекПодключенияJSON = ТранспортСообщенийОбмена.НастройкиПодключенияВJSON(НастройкиПодключения);
КонецЕсли;
Если Не ПараметрыТранспорта.ПрямоеПодключение Тогда
Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(НастройкиПодключения.ИмяПланаОбмена) Тогда
Если НастройкиПодключения.ВариантРаботыМастера = "ПродолжитьНастройкуОбменаДанными" Тогда
ПараметрыОбмена = ОбменДаннымиСервер.ПараметрыОбмена();
ПараметрыОбмена.ВыполнятьЗагрузку = Истина;
ПараметрыОбмена.ВыполнятьВыгрузку = Ложь;
ПараметрыОбмена.ИдентификаторТранспорта = НастройкиПодключения.ИдентификаторТранспорта;
ОтказПолучение = Ложь;
ДополнительныеПараметры = Новый Структура;
Попытка
ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(
НастройкиПодключения.УзелИнформационнойБазы, ПараметрыОбмена, ОтказПолучение, ДополнительныеПараметры);
Исключение
Отказ = Истина;
Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
КонецПопытки;
Если ДополнительныеПараметры.Свойство("ПолученыДанныеДляСопоставления") Тогда
Результат.ЕстьДанныеДляСопоставления = ДополнительныеПараметры.ПолученыДанныеДляСопоставления;
КонецЕсли;
Иначе
ПараметрыОбмена = ОбменДаннымиСервер.ПараметрыОбмена();
ПараметрыОбмена.ВыполнятьЗагрузку = Ложь;
ПараметрыОбмена.ВыполнятьВыгрузку = Истина;
ПараметрыОбмена.ИдентификаторТранспорта = НастройкиПодключения.ИдентификаторТранспорта;
Попытка
ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(
НастройкиПодключения.УзелИнформационнойБазы, ПараметрыОбмена, Отказ);
Исключение
Отказ = Истина;
Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
КонецПопытки;
КонецЕсли;
ИначеЕсли Не ОбменДаннымиПовтИсп.ЭтоПланОбменаРаспределеннойИнформационнойБазы(НастройкиПодключения.ИмяПланаОбмена)
И Не ОбменДаннымиПовтИсп.ЭтоУзелСтандартногоОбменаДанными(НастройкиПодключения.ИмяПланаОбмена) Тогда
Параметры = ТранспортСообщенийОбмена.ПараметрыИнициализации(ИдентификаторТранспорта);
Параметры.Корреспондент = НастройкиПодключения.УзелИнформационнойБазы;
ЗаполнитьЗначенияСвойств(Параметры, НастройкиПодключения);
Транспорт = ТранспортСообщенийОбмена.Инициализация(Параметры);
Результат.ЕстьДанныеДляСопоставления = Транспорт.ПолучитьДанные();
КонецЕсли;
КонецЕсли;
Если Не Отказ Тогда
Результат.НастройкиПодключенияСохранены = Истина;
Результат.УзелОбмена = НастройкиПодключения.УзелИнформационнойБазы;
Иначе
ОбменДаннымиСервер.УдалитьНастройкуСинхронизации(НастройкиПодключения.УзелИнформационнойБазы);
Результат.НастройкиПодключенияСохранены = Ложь;
Результат.УзелОбмена = Неопределено;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ИсправитьДублированиеНастроекСинхронизации(НастройкиПодключения, Результат, Отказ)
Если НастройкиПодключения.ИсправитьДублированиеНастроекСинхронизации Тогда
МенеджерПланаОбмена = ПланыОбмена[НастройкиПодключения.ИмяПланаОбмена];
Если НастройкиПодключения.ЭтотУзелЕстьВКорреспонденте Тогда
НачатьТранзакцию();
Попытка
ЭтотУзел = МенеджерПланаОбмена.ЭтотУзел();
БлокировкаДанных = Новый БлокировкаДанных;
ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("ПланОбмена." + НастройкиПодключения.ИмяПланаОбмена);
ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", ЭтотУзел);
БлокировкаДанных.Заблокировать();
НовыйКод = Строка(Новый УникальныйИдентификатор);
УзелОбменаОбъект = ЭтотУзел.ПолучитьОбъект();
УзелОбменаОбъект.Код = НовыйКод;
УзелОбменаОбъект.ОбменДанными.Загрузка = Истина;
УзелОбменаОбъект.Записать();
НастройкиПодключения.КодУзла = НовыйКод;
НастройкиПодключения.КодПредопределенногоУзла = НовыйКод;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Отказ = Истина;
Информация = ИнформацияОбОшибке();
Результат.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация);
ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));
КонецПопытки;
КонецЕсли;
УзелСсылка = МенеджерПланаОбмена.НайтиПоКоду(НастройкиПодключения.ИдентификаторИнформационнойБазыПриемника);
УзелСуществуетВЭтойБазе = НЕ УзелСсылка.Пустая();
Если УзелСуществуетВЭтойБазе И НастройкиПодключения.УзелКорреспондентаЕстьВЭтойБазе Тогда
Попытка
ОбменДаннымиСервер.УдалитьНастройкуСинхронизации(УзелСсылка);
Исключение
Отказ = Истина;
Информация = ИнформацияОбОшибке();
Результат.СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация);
ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииУдалениеОбменаДанными(),
УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ЗагрузитьНастройкиXDTOКорреспондента(Параметры, АдресРезультата) Экспорт
НастройкиЗагрузки = Неопределено;
Параметры.Свойство("НастройкиЗагрузки", НастройкиЗагрузки);
Результат = Новый Структура;
Результат.Вставить("НастройкиЗагружены", Истина);
Результат.Вставить("ПолученыДанныеДляСопоставления", Ложь);
Результат.Вставить("СообщениеОбОшибке", "");
ПараметрыОбмена = ОбменДаннымиСервер.ПараметрыОбмена();
ПараметрыОбмена.ВыполнятьЗагрузку = Истина;
ПараметрыОбмена.ВыполнятьВыгрузку = Ложь;
ПараметрыОбмена.ИдентификаторТранспорта = ТранспортСообщенийОбмена.ТранспортПоУмолчанию(НастройкиЗагрузки.УзелОбмена);
ДополнительныеПараметры = Новый Структура;
Отказ = Ложь;
Попытка
ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(
НастройкиЗагрузки.УзелОбмена, ПараметрыОбмена, Отказ, ДополнительныеПараметры);
Исключение
Отказ = Истина;
Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
КонецПопытки;
Если Отказ Тогда
Результат.НастройкиЗагружены = Ложь;
Если ПустаяСтрока(Результат.СообщениеОбОшибке) Тогда
Результат.СообщениеОбОшибке = НСтр("ru = 'Не удалось получить параметры корреспондента.'");
КонецЕсли;
Иначе
НастройкиКорреспондента = ОбменДаннымиXDTOСервер.ПоддерживаемыеОбъектыФорматаКорреспондента(
НастройкиЗагрузки.УзелОбмена, "ОтправкаПолучение");
Результат.НастройкиЗагружены = (НастройкиКорреспондента.Количество() > 0);
Если Результат.НастройкиЗагружены Тогда
Если ДополнительныеПараметры.Свойство("ПолученыДанныеДляСопоставления") Тогда
Результат.ПолученыДанныеДляСопоставления = ДополнительныеПараметры.ПолученыДанныеДляСопоставления;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
КонецПроцедуры
Процедура СохранитьНастройкиСинхронизации(Параметры, АдресРезультата) Экспорт
НастройкиСинхронизации = Неопределено;
Параметры.Свойство("НастройкиСинхронизации", НастройкиСинхронизации);
Результат = Новый Структура;
Результат.Вставить("НастройкиСохранены", Истина);
Результат.Вставить("СообщениеОбОшибке", "");
ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(НастройкиСинхронизации.УзелОбмена);
Если ОбменДаннымиСервер.ЕстьАлгоритмМенеджераПланаОбмена("ПриСохраненииНастроекСинхронизацииДанных", ИмяПланаОбмена) Тогда
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(ОбщегоНазначения.ИмяТаблицыПоСсылке(НастройкиСинхронизации.УзелОбмена));
ЭлементБлокировки.УстановитьЗначение("Ссылка", НастройкиСинхронизации.УзелОбмена);
Блокировка.Заблокировать();
УзелОбъект = НастройкиСинхронизации.УзелОбмена.ПолучитьОбъект();
ПланыОбмена[ИмяПланаОбмена].ПриСохраненииНастроекСинхронизацииДанных(УзелОбъект,
НастройкиСинхронизации.ДанныеЗаполнения);
УзелОбъект.Записать();
Если Не ОбменДаннымиСервер.НастройкаСинхронизацииЗавершена(НастройкиСинхронизации.УзелОбмена) Тогда
ОбменДаннымиСервер.ЗавершитьНастройкуСинхронизацииДанных(НастройкиСинхронизации.УзелОбмена);
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Результат.НастройкиСохранены = Ложь;
Результат.СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
УровеньЖурналаРегистрации.Ошибка, , , Результат.СообщениеОбОшибке);
КонецПопытки;
Иначе
Если Не ОбменДаннымиСервер.НастройкаСинхронизацииЗавершена(НастройкиСинхронизации.УзелОбмена) Тогда
ОбменДаннымиСервер.ЗавершитьНастройкуСинхронизацииДанных(НастройкиСинхронизации.УзелОбмена);
КонецЕсли;
КонецЕсли;
ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
КонецПроцедуры
Процедура УдалитьНастройкуСинхронизации(Параметры, АдресРезультата) Экспорт
НастройкиУдаления = Неопределено;
Параметры.Свойство("НастройкиУдаления", НастройкиУдаления);
Результат = Новый Структура;
Результат.Вставить("НастройкаУдалена", Истина);
Результат.Вставить("НастройкаУдаленаВКорреспонденте", НастройкиУдаления.УдалитьНастройкуВКорреспонденте);
Результат.Вставить("СообщениеОбОшибке", "");
Результат.Вставить("СообщениеОбОшибкеВКорреспонденте", "");
Если НастройкиУдаления.УдалитьНастройкуВКорреспонденте Тогда
УдалитьНастройкуСинхронизацииВКорреспонденте(НастройкиУдаления, Результат);
Если Не Результат.НастройкаУдаленаВКорреспонденте Тогда
Результат.НастройкаУдалена = Ложь;
Результат.СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'При удалении настройки синхронизации в программе ""%1"" возникла ошибка: %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 Тогда
ИспользоватьСинхронизациюДанных = Константы.ИспользоватьСинхронизациюДанных.СоздатьМенеджерЗначения();
ИспользоватьСинхронизациюДанных.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов");
ИспользоватьСинхронизациюДанных.ОбменДанными.Загрузка = Истина;
ИспользоватьСинхронизациюДанных.Значение = Истина;
ИспользоватьСинхронизациюДанных.Записать();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецЕсли