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

Процедура Подготовить(Кнопка)
	ПроцессЕДТ = ирОбщий.ПолучитьПроцессОСЛкс(,,,,, РабочаяОбласть, "1cedt.exe");
	Если ТипЗнч(ПроцессЕДТ) <> Тип("COMОбъект") Тогда
		ирОбщий.СообщитьЛкс(НСтр("ru='Не обнаружен процесс EDT для выбранной рабочей области'"));
		Возврат;
	КонецЕсли;
	РазделительПути = ирОбщий.РазделительПутиКФайлуЛкс();
	СписокФайлов = Новый Массив;
	Путь = ПапкаГита + РазделительПути + Проект;
	ПутьККонфигурации = СтрЗаменить(Путь + "\src\Configuration\", "\", РазделительПути);
	Для Каждого Файл Из НайтиФайлы(Путь, "*", Истина) Цикл
		Если Истина
			И Файл.ПолучитьВремяИзменения() > НачальнаяДата 
			И Не Файл.ЭтоКаталог() 
			И Файл.Путь <> ПутьККонфигурации
		Тогда
			СписокФайлов.Добавить(Файл.ПолноеИмя);
		КонецЕсли;
	КонецЦикла;
	Если СписокФайлов.Количество() = 0 Тогда
		ирОбщий.СообщитьЛкс(НСтр("ru='Отсутствуют файлы изменные позднее заданной даты в каталоге " + Путь + "'"));
		Возврат;
	КонецЕсли; 
	ЛогиИзменений = Новый Массив;
	ПутьКПроектам = ПутьКПроектам();
	Для Каждого Файл Из НайтиФайлы(ПутьКПроектам + РазделительПути + Проект, "SynchronizationData.store", Истина) Цикл
		ФайлЛога = Новый Файл(Файл.ПолноеИмя + РазделительПути + "log");
		ЛогиИзменений.Добавить(ФайлЛога);
	КонецЦикла;
	Ответ = Вопрос(ирОбщий.СтрШаблонЛкс(НСтр("ru='Найдено %1 файлов изменных позднее заданной даты. Продолжить?'"), СписокФайлов.Количество()), РежимДиалогаВопрос.ОКОтмена);
	Если Ответ <> КодВозвратаДиалога.ОК Тогда
		Возврат;
	КонецЕсли;
	ВременныйСуффикс = "_tempIR";
	ДатаПоследнегоФайла = Неопределено;
	ЧислоУспехов = 0;
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(СписокФайлов.Количество(), "Переименование файлов",,, Ложь);
	Для Каждого ИмяФайла Из СписокФайлов Цикл
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		Попытка
			ПереместитьФайл(ИмяФайла, ИмяФайла + ВременныйСуффикс);
			ДатаПоследнегоФайла = ТекущаяДата();
			ЧислоУспехов = ЧислоУспехов + 1;
		Исключение
			ирОбщий.СообщитьЛкс(ОписаниеОшибки());
		КонецПопытки;
	КонецЦикла;
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
	Попытка
		МаксСекунд = 10;
		МоментНачала = ТекущаяДата(); 
		ирОбщий.СостояниеЛкс(НСтр("ru='Ждем регистрации изменений на стороне EDT'"));
		Пока ТекущаяДата() - МоментНачала < МаксСекунд Цикл
			ИзмененияВсехБазОбновлены = Истина;
			Для Каждого ФайлЛога Из ЛогиИзменений Цикл
				ЧтениеТекста = Новый ЧтениеТекста(ФайлЛога.ПолноеИмя, КодировкаТекста.UTF8,,, Ложь);
				ЧтениеТекста.ПрочитатьСтроку(); // Чтобы обновилась дата изменения
				Если ФайлЛога.ПолучитьВремяИзменения() < ДатаПоследнегоФайла Тогда
					ИзмененияВсехБазОбновлены = Ложь;
					Прервать;
				КонецЕсли;
			КонецЦикла;
			ирОбщий.ПаузаЛкс(1);
		КонецЦикла;
		ирОбщий.СостояниеЛкс("");
		Для Каждого ФайлЛога Из ЛогиИзменений Цикл
			Если ФайлЛога.ПолучитьВремяИзменения() < ДатаПоследнегоФайла Тогда
				ирОбщий.СообщитьЛкс(ирОбщий.СтрШаблонЛкс(НСтр("ru='Не удалось дождаться регистрации изменений в %1'"), ФайлЛога.ПолноеИмя));
			КонецЕсли;
		КонецЦикла;
	Исключение
		ирОбщий.СообщитьЛкс(ОписаниеОшибки());
	КонецПопытки;
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(СписокФайлов.Количество(), "Восстановление имен файлов",,, Ложь);
	Для Каждого ИмяФайла Из СписокФайлов Цикл
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		Попытка
			ПереместитьФайл(ИмяФайла + ВременныйСуффикс, ИмяФайла);
		Исключение
			ирОбщий.СообщитьЛкс(ОписаниеОшибки());
		КонецПопытки;
	КонецЦикла;
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
	ирОбщий.СообщитьЛкс("Обработано файлов: " + ЧислоУспехов);
КонецПроцедуры

Процедура ПриОткрытии()
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	ирКлиент.СоздатьМенеджерСохраненияНастроекФормыЛкс(ЭтаФорма);
	ПриИзмененииРабочейОбласти();
КонецПроцедуры

Процедура РазделениеДанныхПредставлениеОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ирКлиент.ОткрытьЗначениеЛкс(РазделениеДанных, Ложь);
КонецПроцедуры

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

Процедура ПриЗакрытии()
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
КонецПроцедуры

Процедура РабочаяОбластьНачалоВыбора(Элемент, СтандартнаяОбработка)
	ирКлиент.ПолеФайловогоКаталога_НачалоВыбораЛкс(Элемент, СтандартнаяОбработка);
КонецПроцедуры

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

Процедура РабочаяОбластьПриИзменении(Элемент)
	ПриИзмененииРабочейОбласти();
КонецПроцедуры

Процедура ПриИзмененииРабочейОбласти() Экспорт
	ЭтаФорма.СвязанаСТекущаяБазой = Ложь;
	ЭтаФорма.КаталогСинхронизации = "";
	СписокВыбора = ЭлементыФормы.НачальнаяДата.СписокВыбора;
	СписокВыбора.Очистить();
	СписокВыбора = ЭлементыФормы.Проект.СписокВыбора;
	СписокВыбора.Очистить();
	ЭтаФорма.НачальнаяДата = Неопределено;
	Если ПустаяСтрока(РабочаяОбласть) Тогда
		Возврат;
	КонецЕсли;
	ПутьКПроектам = ПутьКПроектам();
	РазделительПути = ирОбщий.РазделительПутиКФайлуЛкс();
	Для Каждого ФайлПроекта Из НайтиФайлы(ПутьКПроектам, "*") Цикл
		Если Лев(ФайлПроекта.Имя, 1) = "." Тогда
			Продолжить;
		КонецЕсли;
		Если ФайлПроекта.ЭтоКаталог() Тогда
			СписокВыбора.Добавить(ФайлПроекта.Имя);
		КонецЕсли;
	КонецЦикла;
	Если СписокВыбора.НайтиПоЗначению(Проект) = Неопределено Тогда
		ЭтаФорма.Проект = "";
	КонецЕсли;
	СписокВыбора = ЭлементыФормы.НачальнаяДата.СписокВыбора;
	СписокБаз = ирОбщий.СписокБазПользователяОСЛкс();
	НастройкиЭтойБазы = ирКэш.НастройкиБазыНаКлиентеЛкс();
	ПометкаЭтаБаза = " <Эта база>";
	ФайлыСинхронизации = НайтиФайлы(ПутьКПроектам, "ConfigDumpInfo.xml", Истина);
	Для Каждого Файл Из ФайлыСинхронизации Цикл
		ПроектЦикл = ПроектИзКаталогаСинхронизации(Файл);
		ДатаИзменения = Файл.ПолучитьВремяИзменения();
		ИДБазы = ирОбщий.ТекстМеждуМаркерамиЛкс(Файл.Путь, "infobase-synchronization" + РазделительПути, РазделительПути);
		СтрокаБазы = СписокБаз.Найти(ИДБазы, "ID");
		Если СтрокаБазы <> Неопределено Тогда
			ПредставлениеБазы = СтрокаБазы.СтрокаСоединения;
			Если НастройкиЭтойБазы.ID = ИДБазы Тогда
				ПредставлениеБазы = ПредставлениеБазы + ПометкаЭтаБаза;
				ЭтаФорма.НачальнаяДата = ДатаИзменения;
				ЭтаФорма.СвязанаСТекущаяБазой = Истина;
				ЭлементСпискаЗначений = ЭлементыФормы.Проект.СписокВыбора.НайтиПоЗначению(ПроектЦикл);
				ЭлементСпискаЗначений.Представление = ЭлементСпискаЗначений.Значение + ПометкаЭтаБаза;
				Если ПустаяСтрока(Проект) Тогда
					ЭтаФорма.Проект = ПроектЦикл;
				КонецЕсли;
			КонецЕсли;
		Иначе
			ПредставлениеБазы = ИДБазы;
		КонецЕсли;
		СписокВыбора.Добавить(ДатаИзменения, "" + ДатаИзменения + "\" + ПроектЦикл + "\" + ПредставлениеБазы);
	КонецЦикла;                 
	Если СписокВыбора.Количество() Тогда
		Если ПустаяСтрока(Проект) Тогда
			ЭтаФорма.Проект = СписокВыбора[0].Значение;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(НачальнаяДата) Тогда
			ЭтаФорма.НачальнаяДата = СписокВыбора[0].Значение;
		КонецЕсли;
	КонецЕсли; 
	ПроектПриИзменении();
КонецПроцедуры

Функция ПутьКПроектам() Экспорт
	ПутьКПроектам = РабочаяОбласть + СтрЗаменить("\.metadata\.plugins\org.eclipse.core.resources\.projects", "\", ирОбщий.РазделительПутиКФайлуЛкс());
	Возврат ПутьКПроектам;
КонецФункции

Функция ПроектИзКаталогаСинхронизации(КаталогСинхронизации) Экспорт
	Результат = ирОбщий.ТекстМеждуМаркерамиЛкс(КаталогСинхронизации.Путь, ".projects\", "\com");
	Возврат Результат;
КонецФункции

Процедура ОписаниеПроблемыНажатие(Элемент)
	ЗапуститьПриложение("https://github.com/1C-Company/1c-edt-issues/issues/1859");
КонецПроцедуры

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

Процедура ПроектПриИзменении(Элемент = Неопределено)
	ЭтаФорма.КаталогСинхронизации = ПутьКПроектам() + СтрЗаменить("\" + Проект + "\com._1c.g5.v8.dt.platform.services.core", "\", ирОбщий.РазделительПутиКФайлуЛкс());
КонецПроцедуры

Процедура ПапкаГитаОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ЗапуститьПриложение(Элемент.Значение);
КонецПроцедуры

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирИсторияГита.Форма.ОбновлениеИзEDT");
