Перем мФоновыйЗапросХттп;
Перем мДатаАктивностиПользователя;

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

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

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

Функция ОтправитьОбъектыМД(Знач Представление, Знач ОбъектыМД, Знач КонтекстНапарника, Знач ЭлементыОбновления, Знач МаксОбъектовЗаВызов = 10) Экспорт
	ЭтаФорма.ТипОтправляемыхОбъектов = Представление;
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ОбъектыМД.Количество(), Представление,,,,, мПлатформа.НоваяТаблицаИндикаторов());
	Для Каждого ОбъектМД Из ОбъектыМД Цикл
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		мПлатформа.ПроверитьФлагОтменыВычислений();
		ИмяФайла = ОбъектМД.ПолноеИмя();
		Если КонтекстНапарника.ОтправленныеОбъекты[ИмяФайла] = 1 Тогда
			Продолжить;
		КонецЕсли;
		КонтекстНапарника.ОтправленныеОбъекты[ИмяФайла] = 1;
		ЭлементОбновления = НовыйЭлементОбновленияНапарника();
		ЭлементОбновления.path = ИмяМодуляНапарника(ИмяФайла) + "/" + ОбъектМД.Имя + ".mdo";
		ЭлементОбновления.field = "meta";
		ЭлементОбновления.hash = ХешОбъектаМДНапарника(ОбъектМД);
		ЭлементОбновления.Удалить("value");
		ЭлементыОбновления.Добавить(ЭлементОбновления);
		Если ЭлементыОбновления.Количество() >= МаксОбъектовЗаВызов Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Возврат Индикатор;
КонецФункции

Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт
	ирКлиент.Форма_ВнешнееСобытиеЛкс(ЭтаФорма, Источник, Событие, Данные);
КонецПроцедуры

Процедура КлсКомандаНажатие(Кнопка)
	ирКлиент.УниверсальнаяКомандаФормыЛкс(ЭтаФорма, Кнопка);
КонецПроцедуры

Процедура ПриЗакрытии()
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
	ОтключитьОбработчикОжидания("СинхронизоватьВФорме");
КонецПроцедуры

Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок) Экспорт
	ирКлиент.ТабличноеПолеПриПолученииДанныхЛкс(ЭтаФорма, Элемент, ОформленияСтрок);
КонецПроцедуры

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Экспорт
	ирКлиент.Форма_ОбработкаОповещенияЛкс(ЭтаФорма, ИмяСобытия, Параметр, Источник);
КонецПроцедуры

// Предопределеный метод механизма фоновых операций
Процедура ПроверкаЗавершенияФоновыхЗаданий() Экспорт
	ирКлиент.ПроверитьЗавершениеФоновыхЗаданийФормыЛкс(ЭтаФорма);
КонецПроцедуры

Процедура СлужебноеПолеХТМЛonclick(Элемент, pEvtObj) Экспорт
	ТелоОтвета = мФоновыйЗапросХттп.ПрочитатьЧастьОтвета();
	ЧислоОтправленныхВПорции = 0;
	ОбработатьОтветНапарника(ТелоОтвета,,,,, мФоновыйЗапросХттп, ЧислоОтправленныхВПорции);
	ЭтаФорма.ЧислоОтправленных = ЧислоОтправленных + ЧислоОтправленныхВПорции;
	ЭлементыФормы.НадписьОтправлено.Заголовок = ирОбщий.СтрШаблонЛкс("Отправлено изменнных объектов: %2. Идет обработка %1", ТипОтправляемыхОбъектов, ЧислоОтправленных);
КонецПроцедуры

Процедура СлужебноеПолеХТМЛДокументСформирован(Элемент)
	СинхронизоватьВФорме();
КонецПроцедуры

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирКлсПолеТекстаПрограммы.Форма.ОтправкаМетаданныхНапарнику");
Если мПлатформа = Неопределено Тогда
	ИнициироватьНеинтерактивно();
КонецЕсли;
