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

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ОбновитьДанныеМонитораИнтерактивно();
	
КонецПроцедуры

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

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

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

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

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

			ДополнительныеПараметры = Новый Структура;
			ДополнительныеПараметры.Вставить("Корреспондент", ТекущиеДанные.УзелИнформационнойБазы);
			ДополнительныеПараметры.Вставить("ИдентификаторТранспорта", ТекущиеДанные.ИдентификаторТранспорта);

			Оповещение = Новый ОписаниеОповещения("СохранитьНастройкиТранспорта", ЭтотОбъект, ДополнительныеПараметры);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПредыдущаяФормаПредупреждений(Команда)
	
	ВыполнитьКомандуСПредварительнойПроверкой(Команда.Имя);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура УстановитьОбновление(Команда)
	
	ОбменДаннымиКлиент.УстановитьОбновлениеКонфигурации();
	
КонецПроцедуры

#Область КомандыНеТребующиеПроверкиАктуальности

&НаКлиенте
Процедура ОбновитьМонитор(Команда)
	
	ОбновитьДанныеМонитораИнтерактивно();
	
КонецПроцедуры

&НаКлиенте
Процедура СоздатьНастройкуСинхронизации(Команда)
	
	ОбменДаннымиКлиент.ОткрытьФормуНастройкиНовойСинхронизацииДанных(ФормаНовойСинхронизацииДанных, ПараметрыФормыНовойСинхронизацииДанных);
	
КонецПроцедуры

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

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

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

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

#Область ВыполнениеКоманд

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура НачальнаяВыгрузкаДанныхЗавершение(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
	
	ПодключитьОбработчикОжидания("ОбновитьДанныеМонитораИнтерактивно", 0.1, Истина);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ВыполнитьПозиционированиеКурсора(ИндексСтроки)
	
	Если ИндексСтроки <> Неопределено Тогда
		
		// Выполняем проверки позиционирования курсора после получения новых данных.
		Если СписокПриложений.Количество() <> 0 Тогда
			
			Если ИндексСтроки > СписокПриложений.Количество() - 1 Тогда
				
				ИндексСтроки = СписокПриложений.Количество() - 1;
				
			КонецЕсли;
			
			// позиционируем курсор
			Элементы.СписокПриложений.ТекущаяСтрока = СписокПриложений[ИндексСтроки].ПолучитьИдентификатор();
			
		КонецЕсли;
		
	КонецЕсли;
	
	// Если спозиционировать строку не удалось, то устанавливаем текущей первую строку.
	Если Элементы.СписокПриложений.ТекущаяСтрока = Неопределено
		И СписокПриложений.Количество() <> 0 Тогда
		
		Элементы.СписокПриложений.ТекущаяСтрока = СписокПриложений[0].ПолучитьИдентификатор();
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервереБезКонтекста
Функция КартинкаРезультатаВыполнения(РезультатВыполнения)
	
	Если РезультатВыполнения = 2 Тогда
		Возврат 3; // выполнено с предупреждениями
	ИначеЕсли РезультатВыполнения = 1 Тогда
		Возврат 2; // ошибка
	ИначеЕсли РезультатВыполнения = 0 Тогда
		Возврат 0; // успешно
	КонецЕсли;
	
	// без статуса
	Возврат 0;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ПослеЗакрытияФормыУправленияЦикличностиОбменов()
	
	ОбнаруженоЗацикливание = ОбменДаннымиКонтрольЗацикливания.ЕстьЗацикливание();
	УстановитьОтображениеЭлементовФормы();
	
КонецПроцедуры

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

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