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

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

// Форма параметризуется двумя способами:
//
// Вариант 1
//     Параметры: 
//         УзелИнформационнойБазы             - ПланОбменаСсылка - узел плана обмена, для которого выполняется помощник.
//         РасширенныйРежимДополненияВыгрузки - Булево           - флаг включения механизма настройки дополнения
//                                                                 выгрузки по сценарию узла.
//
// Вариант 2:
//     Параметры: 
//         КодУзлаИнформационнойБазы          - Строка           - код узла плана обмена, для которого открывается помощник.
//         ИмяПланаОбмена                     - Строка           - имя плана обмена, которое используется
//                                                                 для поиска узла плана обмена с кодом, заданными в
//                                                                 параметре КодУзлаИнформационнойБазы.
//         РасширенныйРежимДополненияВыгрузки - Булево           - флаг включения механизма настройки дополнения
//                                                                 выгрузки по сценарию узла.
//

#Область ОписаниеПеременных

&НаКлиенте
Перем ПропускатьКонтрольОтказаТекущейСтраницы;

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

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

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

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

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

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

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

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

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Страница СтраницаИнформацииСтатистики

&НаКлиенте
Процедура ЗакончитьСопоставлениеДанныхПриИзменении(Элемент)
	
	ПриИзмененииФлагаЗакончитьСопоставлениеДанных();
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьСообщениеПослеСопоставленияПриИзменении(Элемент)
	
	ПриИзмененииФлагаЗагрузитьСообщениеПослеСопоставления();
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Страница СтраницаВопросОСоставеВыгрузки

&НаКлиенте
Процедура ДополнениеВыгрузкиВариантВыгрузкиПриИзменении(Элемент)
	ДополнениеВыгрузкиВариантВыгрузкиУстановитьВидимость();
КонецПроцедуры

&НаКлиенте
Процедура ДополнениеВыгрузкиПериодОтбораСценарияУзлаПриИзменении(Элемент)
	ДополнениеВыгрузкиИзменениеПериодаСценарияУзла();
КонецПроцедуры

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоИнформацииСтатистики

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПродолжитьСинхронизацию(Команда)
	
	ПорядковыйНомерПерехода = ПорядковыйНомерПерехода - 1;
	УстановитьПорядковыйНомерПерехода(ПорядковыйНомерПерехода + 1);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьСинхронизацию(Команда)

	ЗавершитьСинхронизациюНаСервере(); 
	
	ЗакрытьФормуБезусловно = Истина;
	Закрыть();

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

&НаСервере
Процедура ЗавершитьСинхронизациюНаСервере()

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

////////////////////////////////////////////////////////////////////////////////
// Страница СтраницаИнформацииСтатистики

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Страница СтраницаОкончанияСопоставления

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

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

////////////////////////////////////////////////////////////////////////////////
// Страница СтраницаВопросОСоставеВыгрузки

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

&НаКлиенте
Процедура ДополнениеВыгрузкиДетальныйОтбор(Команда)
	ОбменДаннымиКлиент.ОткрытьФормуДополненияВыгрузкиДетальныйОтбор(ДополнениеВыгрузки, ЭтотОбъект);
КонецПроцедуры

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

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

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// ПОСТАВЛЯЕМАЯ ЧАСТЬ
////////////////////////////////////////////////////////////////////////////////

#Область ПоставляемаяЧасть

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

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

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

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

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

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// ПЕРЕОПРЕДЕЛЯЕМАЯ ЧАСТЬ
////////////////////////////////////////////////////////////////////////////////

#Область ПереопределяемаяЧасть

////////////////////////////////////////////////////////////////////////////////
// РАЗДЕЛ ПРОЦЕДУРЫ И ФУНКЦИИ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Функция ПолучитьИндексыСтрокТаблицыИнформацииСтатистики(КлючиСтрок)
	
	ИндексыСтрок = Новый Массив;
	
	Для Каждого Ключ Из КлючиСтрок Цикл
		
		СтрокиТаблицы = Объект.ИнформацияСтатистики.НайтиСтроки(Новый Структура("Ключ", Ключ));
		
		ИндексСтроки = Объект.ИнформацияСтатистики.Индекс(СтрокиТаблицы[0]);
		
		ИндексыСтрок.Добавить(ИндексСтроки);
		
	КонецЦикла;
	
	Возврат ИндексыСтрок;
	
КонецФункции

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

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

#Область РаботаСДополнениемВыгрузки

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

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

&НаКлиенте
Процедура ДополнениеВыгрузкиВариантВыгрузкиУстановитьВидимость()
	Элементы.ГруппаОтборВсеДокументы.Доступность  = ДополнениеВыгрузки.ВариантВыгрузки=1;
	Элементы.ГруппаОтборДетальный.Доступность     = ДополнениеВыгрузки.ВариантВыгрузки=2;
	Элементы.ГруппаОтборНастраиваемый.Доступность = ДополнениеВыгрузки.ВариантВыгрузки=3;
КонецПроцедуры

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

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

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

&НаСервере
Процедура УстановитьОписаниеОтборовДополненияВыгрузки()
	УстановитьОписаниеДополненияОбщегоОтбора();
	УстановитьОписаниеДополненияДетально();
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Обработчики ожидания

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

////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции мастера.

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// РАЗДЕЛ ОБРАБОТКИ ФОНОВЫХ ЗАДАНИЙ

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

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

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

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

	Результат = ДлительныеОперации.ВыполнитьВФоне(
		ПараметрыЗадания.ВыполняемыйМетод,
		ПараметрыЗадания.ПараметрыМетода,
		ПараметрыВыполнения);
	
	Возврат Результат;
	
КонецФункции

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

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

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

////////////////////////////////////////////////////////////////////////////////
// РАЗДЕЛ ОБРАБОТЧИКОВ СОБЫТИЙ ПЕРЕХОДОВ

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

////////////////////////////////////////////////////////////////////////////////
// Страницы проверки запущенной синхронизации.

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

		Иначе
			
			Шаблон = НСтр("ru = 'Для узла ""%1"" уже выполняется синхронизация.
                           |
                           |Нажмите Далее, что-бы прервать текущую синхронизации
                           |и запустить ее снова'");
			ТекстСообщения = СтрШаблон(Шаблон, Строка(Объект.УзелИнформационнойБазы));

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Страницы обработки получения данных (транспорт сообщения обмена).

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Страницы анализа данных (автоматическое сопоставление данных).

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Страницы обработки сопоставления данных (интерактивное сопоставление данных).

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Страницы обработки загрузки данных

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Страницы дополнительной выгрузки (регистрация к выгрузке дополнительных данных).

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

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

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

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Страницы обработки выгрузки данных

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

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

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

	ИначеЕсли ОбменЧерезВнутреннююПубликацию Тогда
		
		ПриНачалеВыгрузкиДанныхЧерезВнутреннююПубликациюНаСервере();
		
		ОбменДаннымиКлиент.ИнициализироватьПараметрыОбработчикаОжидания(
			ПараметрыОбработчикаОжиданияВыгрузкиДанных);

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

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

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

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

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

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

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

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

&НаСервереБезКонтекста
Процедура ПриОжиданииВыгрузкиДанныхЧерезВнутреннююПубликациюНаСервере(ПараметрыОбмена, ПродолжитьОжидание)

	МодульОбменДаннымиВнутренняяПубликация = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВнутренняяПубликация");
	МодульОбменДаннымиВнутренняяПубликация.ПриОжиданииВыгрузкиДанных(ПараметрыОбмена, ПродолжитьОжидание);
	
КонецПроцедуры

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

////////////////////////////////////////////////////////////////////////////////
// Страницы итоговой информации

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

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

////////////////////////////////////////////////////////////////////////////////
// РАЗДЕЛ ИНИЦИАЛИЗАЦИИ ПЕРЕХОДОВ

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

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

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

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