Перем мЧтениеТекста;
Перем мФайлРезультата;
Перем мМоментНачала;
Перем мЧистыйЗаголовокФормы;
Перем мОстатокПорции;
Перем мПолеТекстаПоиска;
Перем мИндексГруппыПодсветки;
Перем мСтарыйКоммит;
Перем мРазрешитьПрыжокВНачалоБлока;
Перем мЛиПерваяЗагрузка;
Перем мАктивироватьНомерСтроки;

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

Процедура ПриОткрытии()
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	мЧистыйЗаголовокФормы = Заголовок;
	мПолеТекстаПоиска = ирКлиент.ОболочкаПоляТекстаЛкс(ЭлементыФормы.ИзмененияФайла);
	ПриПовторномОткрытии();
КонецПроцедуры

Процедура ПриПовторномОткрытии(СтандартнаяОбработка = Истина)
	Если Ложь
		Или ПустаяСтрока(ПапкаГита) 
		Или ЗначениеЗаполнено(ПараметрИмяМодуля)
		Или ЗначениеЗаполнено(ПараметрЧтоИскать)
		Или ЗначениеЗаполнено(ПараметрКоммит)
		Или ЗначениеЗаполнено(ПараметрНомерСтроки)
	Тогда
		ЭтаФорма.ПапкаГита = ирКлиент.ГитРепозиторий();
	КонецЕсли;
	ОбновитьЗаголовокФормы();
	ЭтаФорма.МаскаИмениФайла = "*.bsl | *.os";
	МаскаИмениФайлаПриИзменении();
	Если ПараметрНомерСтроки > 0 Тогда
		ЭтаФорма.ЧтоИскать = Неопределено;
		ЭтаФорма.ФильтрПодсистем = Неопределено;
		ЭтаФорма.КромеВетки = Неопределено;
		ЭтаФорма.Ветка = Неопределено;
	КонецЕсли;
	Если ЗначениеЗаполнено(ПараметрЧтоИскать) Тогда
		ирКлиент.ИнтерактивноЗаписатьВПолеВводаЛкс(ЭлементыФормы.ЧтоИскать, ПараметрЧтоИскать);
	КонецЕсли;
	Если ЗначениеЗаполнено(ПараметрИмяМодуля) Тогда
		ИмяФайлаГита = ирКлиент.ИмяФайлаМодуляВПапкеГитаЛкс(ПараметрИмяМодуля, ПапкаГита);
		Если Найти(ПараметрИмяМодуля, ".") = 0 Тогда
			ИмяФайлаГита = ИмяФайлаГита + ирОбщий.РазделительПутиКФайлуЛкс() + "*";
		КонецЕсли;
		ИмяФайлаГита = СтрЗаменить(ИмяФайлаГита, "src\", "*"); // чтобы учесть нестабильное наличие сверху папки src
		ПутьВГите = ПутьВГитеИзИмениФайла(ИмяФайлаГита);
		ирКлиент.ИнтерактивноЗаписатьВПолеВводаЛкс(ЭлементыФормы.МаскаИмениФайла, ПутьВГите);
	КонецЕсли; 
	ОчиститьРезультаты();
	Если Ложь
		Или ЗначениеЗаполнено(ПараметрКоммит) 
		Или ЗначениеЗаполнено(ПараметрЧтоИскать) 
	Тогда
		ДействияФормыЗагрузить();
	КонецЕсли;
КонецПроцедуры

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

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

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

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

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

Процедура ФайлыКоммитаПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	Если ЛиРасширениеФайлаКода1С(ДанныеСтроки.ТипФайла) Тогда
		Картинка = иркэш.КартинкаПоИмениЛкс("ирАлгоритм");
	ИначеЕсли ирОбщий.СтрокиРавныЛкс(ДанныеСтроки.ТипФайла, "TXT") Тогда
		Картинка = иркэш.КартинкаПоИмениЛкс("ирПолеТекстовогоДокумента");
	ИначеЕсли ирОбщий.СтрокиРавныЛкс(ДанныеСтроки.ТипФайла, "XML") Тогда
		Картинка = иркэш.КартинкаПоИмениЛкс("ирXML");
	ИначеЕсли ирОбщий.СтрокиРавныЛкс(ДанныеСтроки.ТипФайла, "MDO") Тогда // EDT
		Картинка = иркэш.КартинкаПоИмениЛкс("ирМетаданные");
	ИначеЕсли ирОбщий.СтрокиРавныЛкс(ДанныеСтроки.ТипФайла, "FORM") Тогда // EDT
		Картинка = иркэш.КартинкаПоИмениЛкс("ирФорма");
	Иначе
		Картинка = Новый Картинка;
	КонецЕсли;
	ОформлениеСтроки.Ячейки.ТипФайла.УстановитьКартинку(Картинка);
	Если ДанныеСтроки.Статус = "Удален" Тогда
		ОформлениеСтроки.Ячейки.Статус.ЦветФона = ирОбщий.ЦветФонаОшибкиЛкс();
	ИначеЕсли ДанныеСтроки.Статус = "Добавлен" Тогда
		ОформлениеСтроки.Ячейки.Статус.ЦветФона = ирОбщий.ЦветФонаДобавленоЛкс();
	КонецЕсли;
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
КонецПроцедуры
         
Процедура ПапкаГитаОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ЗапуститьПриложение(Элемент.Значение);
КонецПроцедуры

Функция ОформитьТекстИзмененийХтмл(Знач Текст, Знач ПолеТекстаМодуля = Неопределено, Знач ЛиСыройТекст = Ложь) Экспорт
	Если Не ЛиСыройТекст Тогда
		Текст = ирОбщий.КодироватьТекстВXMLЛкс(Текст);
	КонецЕсли;
	Строки = ирОбщий.СтрРазделитьЛкс(Текст, Символы.ПС);
	ХтмлТекст = Новый Массив;
	НомерСтроки = 0;
	НомерСтрокиИзменений = 0;
	ТекстыМодулей = Неопределено;
	_РежимОтладки = Ложь;
	Если _РежимОтладки Тогда // Можно менять на Истина в точке останова, например условием ирОбщий.Пр(_РежимОтладки, 1, 1)
		// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
		Для Каждого Строка Из Строки Цикл
			НомерСтроки = НомерСтроки + 1;
			НомерСтрокиИзменений = НомерСтрокиИзменений + 1; 
			Если Лев(Строка, 1) = "+" Тогда
				ХтмлТекст.Добавить("<span class='added'>" + Строка + "</span>");
			ИначеЕсли Лев(Строка, 1) = "-" Тогда
				ХтмлТекст.Добавить("<span class='removed'>" + Строка + "</span>");
			ИначеЕсли ПолеТекстаМодуля <> Неопределено И Найти(Строка, "@@") = 1 Тогда
				ТекстНомераСтроки = ирОбщий.ПервыйФрагментЛкс(ирОбщий.ТекстМеждуМаркерамиЛкс(Строка, "+", " "), ",");
				НомерСтроки = Число(ТекстНомераСтроки);
				ИмяМетода = ирОбщий.ТекстМеждуМаркерамиЛкс(Строка, "&gt; ", " ", Ложь);
				Если ПустаяСтрока(ИмяМетода) И НомерСтроки > 0 Тогда
					ИмяМетода = мПлатформа.НайтиМетодПоНомеруСтроки(ПолеТекстаМодуля, НомерСтроки,, ТекстыМодулей);
					Строка = Сред(Строка, 4); /// Мультиметка250819_000720
				Иначе
					Строка = ирОбщий.ТекстМеждуМаркерамиЛкс(Строка, "-",,, Истина);
				КонецЕсли;
				Если Не ЛиСыройТекст Тогда
					ДобавитьБлокОтличий(ИмяМетода, Строка, НомерСтрокиИзменений);
				КонецЕсли;
				ИмяМетода = СтрЗаменить(ИмяМетода, "<", "[");
				ИмяМетода = СтрЗаменить(ИмяМетода, ">", "]");
				ХтмлТекст.Добавить("<span class='method'>@@&gt; " + ИмяМетода + "</span><span class='header'> " + Строка + "</span>");
			ИначеЕсли Ложь
				Или Найти(Строка, "diff --git") = 1 
				Или Найти(Строка, "index ") = 1 
			Тогда
				ХтмлТекст.Добавить("<span class='header'>" + Строка + "</span>");
			Иначе
				ХтмлТекст.Добавить(Строка);
			КонецЕсли;
		КонецЦикла;
	Иначе
		// Однострочный код использован для ускорения при разрешенной отладке. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика"
		Для Каждого Строка Из Строки Цикл  			НомерСтроки = НомерСтроки + 1;  			НомерСтрокиИзменений = НомерСтрокиИзменений + 1;  			Если Лев(Строка, 1) = "+" Тогда  				ХтмлТекст.Добавить("<span class='added'>" + Строка + "</span>");  			ИначеЕсли Лев(Строка, 1) = "-" Тогда  				ХтмлТекст.Добавить("<span class='removed'>" + Строка + "</span>");  			ИначеЕсли ПолеТекстаМодуля <> Неопределено И Найти(Строка, "@@") = 1 Тогда  				ТекстНомераСтроки = ирОбщий.ПервыйФрагментЛкс(ирОбщий.ТекстМеждуМаркерамиЛкс(Строка, "+", " "), ",");  				НомерСтроки = Число(ТекстНомераСтроки);  				ИмяМетода = ирОбщий.ТекстМеждуМаркерамиЛкс(Строка, "&gt; ", " ", Ложь);  				Если ПустаяСтрока(ИмяМетода) И НомерСтроки > 0 Тогда  					ИмяМетода = мПлатформа.НайтиМетодПоНомеруСтроки(ПолеТекстаМодуля, НомерСтроки,, ТекстыМодулей);  					Строка = Сред(Строка, 4);  				Иначе  					Строка = ирОбщий.ТекстМеждуМаркерамиЛкс(Строка, "-",,, Истина);  				КонецЕсли;  				Если Не ЛиСыройТекст Тогда  					ДобавитьБлокОтличий(ИмяМетода, Строка, НомерСтрокиИзменений);  				КонецЕсли;  				ИмяМетода = СтрЗаменить(ИмяМетода, "<", "[");  				ИмяМетода = СтрЗаменить(ИмяМетода, ">", "]");  				ХтмлТекст.Добавить("<span class='method'>@@&gt; " + ИмяМетода + "</span><span class='header'> " + Строка + "</span>");  			ИначеЕсли Ложь  				Или Найти(Строка, "diff --git") = 1  				Или Найти(Строка, "index ") = 1  			Тогда  				ХтмлТекст.Добавить("<span class='header'>" + Строка + "</span>");  			Иначе  				ХтмлТекст.Добавить(Строка);  			КонецЕсли;  		КонецЦикла;  
	КонецЕсли;
	Возврат ирОбщий.СтрСоединитьЛкс(ХтмлТекст, Символы.ПС);
КонецФункции

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

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

Процедура ЗагрузитьИзмененияФайла() Экспорт
	Если ЭлементыФормы.ФайлыКоммита.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ЭлементыФормы.КПРезультатыПоиска.Доступность = Истина;
	ЭтаФорма.ТекстИзмененийФайла = ЭлементыФормы.ФайлыКоммита.ТекущаяСтрока.ТекстИзменений;
	Если ПустаяСтрока(ТекстИзмененийФайла) Тогда
		// Почему то так не всегда работает. Видимо связано с русскими буквами. 
		// Например в коммитах слияния для src/InformationRegisters/ОчередьСобытий/Forms/Форма*/Module.bsl работает, но для src/InformationRegisters/ОчередьСобытий/Forms/ФормаСписка/Module.bsl - нет.
		ЭтаФорма.ТекстИзмененийФайла = ирОбщий.ВыполнитьКомандуОСЛкс(НачалоКомандыГита() + "show -m " + ПараметрыВыводаИзмененийДляКоманды() + " " + ПараметрыКоммитаДляКоманды()
			+ " -- " + ЭлементыФормы.ФайлыКоммита.ТекущаяСтрока.Файл,,,,, КодировкаТекста.UTF8);
	КонецЕсли;
	ОбновитьПоискВТекстеФайла();
КонецПроцедуры

Функция ПараметрыВыводаИзмененийДляКоманды() Экспорт
	//Результат = "--pretty=format: --unified=" + ЧислоСтрокКонтекста + " ";
	Результат = " --unified=" + ЧислоСтрокКонтекста + " ";
	Возврат Результат;
КонецФункции

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

Процедура ЗагрузитьФайлыКоммита() Экспорт
	ТекущаяСтрокаФайла = ЭлементыФормы.ФайлыКоммита.ТекущаяСтрока;
	СтарыйФайл = Неопределено;
	Если ТекущаяСтрокаФайла <> Неопределено Тогда
		СтарыйФайл = ТекущаяСтрокаФайла.Файл;
	КонецЕсли;
	Если ПустаяСтрока(ЭлементыФормы.Коммиты.ТекущаяСтрока.Коммит) Тогда
		КомандаСравнения = "diff HEAD ";
	Иначе
		КомандаСравнения = "show -m ";
	КонецЕсли;
	ТекстИзмененийКоммита = ирОбщий.ВыполнитьКомандуОСЛкс(НачалоКомандыГита() + КомандаСравнения + ПараметрыВыводаИзмененийДляКоманды() + ЭлементыФормы.Коммиты.ТекущаяСтрока.Коммит + ПараметрГитаМаскаФайла(),,,,, КодировкаТекста.UTF8);
	ФайлыКоммита.Очистить();
	ОчиститьПанельФайла();
	ЭлементыФормы.КПРезультатыПоиска.Доступность = Ложь;
	//мПолеТекстаПоиска.УстановитьТекст(""); // https://www.hostedredmine.com/issues/1007176
	СтрокаФайла = Неопределено;
	СтрокиИзмененийФайла = Новый Массив;
	НомерРодителя = 1;
	МаркерРодителя = "commit " + ЭлементыФормы.Коммиты.ТекущаяСтрока.Коммит + " \(from ";
			//НачалоСтроки = Лев(СтрокаИзменений, СтрДлина(МаркерРодителя));
			//Если НачалоСтроки = МаркерРодителя Тогда
			//	НомерРодителя = Родители.Найти(ирОбщий.ТекстМеждуМаркерамиЛкс(СтрокаИзменений, МаркерРодителя, ")"), "Коммит").Номер;
			//	ТекущийФайл = Неопределено;
			//КонецЕсли;
	МаркерПредВерсии = "--- "; /// Строго равны по длине
	МаркерТекВерсии = "+++ "; /// Строго равны по длине
	МаркерОтсутствияВерсии = "/dev/null";
	ВхожденияФайлов = ирОбщий.НайтиРегВыражениеЛкс(ТекстИзмененийКоммита, "diff --git a/(?:[^\n]+) b/(?:[^\n]+)\n(?:(?:similarity|rename|new file|deleted file|index)[^\n]+\n)*--- ([^\n]+)\n\+\+\+ ([^\n]+)\n", "Файл1,Файл2");
	Если ВхожденияФайлов.Количество() Тогда
		ВхожденияФайлов.Добавить().ПозицияВхождения = СтрДлина(ТекстИзмененийКоммита);
	КонецЕсли;
	Если ФильтрПодсистем.Количество() > 0 Тогда
		ОбъектыВыбранныхПодсистем = ирОбщий.ОбъектыПодсистемЛкс(ФильтрПодсистем);
	КонецЕсли;
	ЧтоИскатьШаблон = "\n(-|\+)[^\n]*" + ирОбщий.ТекстДляРегВыраженияЛкс(ЧтоИскать);
	Для Индекс = 0 По ВхожденияФайлов.Количество() - 2 Цикл
		ВхожденияЭлемент = ВхожденияФайлов[Индекс];
		ВхождениеСледующее = ВхожденияФайлов[Индекс + 1];
		Если МаркерОтсутствияВерсии = ВхожденияЭлемент.Файл1 Тогда
			ТекущийФайл = ВхожденияЭлемент.Файл2;
		Иначе
			ТекущийФайл = ВхожденияЭлемент.Файл1;
		КонецЕсли;
		ТекущийФайл = Сред(ТекущийФайл, 3);
		Модуль = ирКлиент.ИмяМодуляИзИмениФайлаГитаЛкс(ТекущийФайл);
		Если ЗначениеЗаполнено(Модуль) Тогда
			ПолноеИмяМД = ирОбщий.ПервыйФрагментЛкс(Модуль, ".Форма.Модуль");
			ПолноеИмяМД = ирОбщий.ПервыйФрагментЛкс(ПолноеИмяМД, ".Модуль");
			Если ФильтрПодсистем.Количество() > 0 Тогда
				ОбъектМД = ирКэш.ОбъектМДПоПолномуИмениЛкс(ирОбщий.ПервыеФрагментыЛкс(ПолноеИмяМД));
				Если ОбъектМД <> Неопределено Тогда
					Если ОбъектыВыбранныхПодсистем[ОбъектМД] = Неопределено тогда
						ТекущийФайл = Неопределено;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		Если ТекущийФайл <> Неопределено Тогда
			НачальныйНомер = ВхожденияЭлемент.ПозицияВхождения + ВхожденияЭлемент.ДлинаВхождения + 1;
			ТекстБлока = Сред(ТекстИзмененийКоммита, НачальныйНомер, ВхождениеСледующее.ПозицияВхождения - НачальныйНомер);
			Если ЗначениеЗаполнено(ЧтоИскать) Тогда
				ВхожденияИскомыхСтрок = ирОбщий.НайтиРегВыражениеЛкс(ТекстБлока, ЧтоИскатьШаблон,, Ложь);
			КонецЕсли;
			Если Ложь
				Или Не ЗначениеЗаполнено(ЧтоИскать)
				Или ВхожденияИскомыхСтрок.Количество()
			Тогда
				СтрокаФайла = ФайлыКоммита.Добавить();
				СтрокаФайла.Файл = ТекущийФайл;
				СтрокаФайла.Модуль = Модуль;
				СтрокаФайла.ПолноеИмяМД = ПолноеИмяМД;
				СтрокаФайла.ТипФайла = ВРег(ирОбщий.ПоследнийФрагментЛкс(ТекущийФайл));
				Если Найти(СтрокаФайла.ТипФайла, "/") Тогда
					СтрокаФайла.ТипФайла = "";
				КонецЕсли;
				Если ВхожденияЭлемент.Файл1 = МаркерОтсутствияВерсии Тогда
					СтатусФайла = "Добавлен";
				ИначеЕсли ВхожденияЭлемент.Файл2 = МаркерОтсутствияВерсии Тогда
					СтатусФайла = "Удален";
				Иначе
					СтатусФайла = "";
				КонецЕсли;
				СтрокаФайла.Статус = СтатусФайла;
				СтрокаФайла.НомерРодителя = НомерРодителя;
				СтрокаФайла.ТекстИзменений = ТекстБлока;
				Если ЗначениеЗаполнено(ЧтоИскать) Тогда
					Для Каждого ВхожденияИскомыхЭлемент Из ВхожденияИскомыхСтрок Цикл
						Если ВхожденияИскомыхЭлемент.Группа0 = "-" Тогда
							СтрокаФайла.УдаленоСтрок = СтрокаФайла.УдаленоСтрок + 1;
						Иначе
							СтрокаФайла.ДобавленоСтрок = СтрокаФайла.ДобавленоСтрок + 1;
						КонецЕсли;
					КонецЦикла; 
				Иначе
					СтрокаФайла.УдаленоСтрок = СтрокаФайла.УдаленоСтрок + СтрЧислоВхождений(ТекстБлока, Символы.ПС + "-");
					СтрокаФайла.ДобавленоСтрок = СтрокаФайла.ДобавленоСтрок + СтрЧислоВхождений(ТекстБлока, Символы.ПС + "+");
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	ЭлементыФормы.Коммиты.ТекущаяСтрока.Файлов = ФайлыКоммита.Количество();
	Если ФайлыКоммита.Количество() Тогда
		ФайлыКоммита.Сортировать("Файл");
		Если СтарыйФайл <> Неопределено Тогда
			НоваяТекущаяСтрока = ФайлыКоммита.Найти(СтарыйФайл, "Файл");
			Если НоваяТекущаяСтрока <> Неопределено Тогда
				ЭлементыФормы.ФайлыКоммита.ТекущаяСтрока = НоваяТекущаяСтрока;
			КонецЕсли;
		КонецЕсли;
		Если ЭлементыФормы.ФайлыКоммита.ТекущаяСтрока = Неопределено Тогда
			ЭлементыФормы.ФайлыКоммита.ТекущаяСтрока = ФайлыКоммита[0];
		КонецЕсли;
	КонецЕсли;

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

Процедура ЗаполнитьАтрибутыРодителей() Экспорт
	Если ЭлементыФормы.Коммиты.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;  
	КомандаВыводаКоммита = КомандаВыводаАтрибутовКоммита();
	Если ПустаяСтрока(ЭлементыФормы.Коммиты.ТекущаяСтрока.Коммит) Тогда
		Родители.Очистить();
		ТекстРодителей = ирОбщий.ВыполнитьКомандуОСЛкс(КомандаВыводаКоммита + "HEAD",,,,, КодировкаТекста.UTF8);
	Иначе
		ТекстРодителей = ирОбщий.ВыполнитьКомандуОСЛкс(
				НачалоКомандыГита() + " show --no-patch --pretty=format:""%P"" " + ЭлементыФормы.Коммиты.ТекущаяСтрока.Коммит + " | for /f ""tokens=*"" %i in ('more') do @for %j in (%i) do @"
				+ КомандаВыводаКоммита + "%j",,,,, КодировкаТекста.UTF8);
	КонецЕсли;
	ЗагрузитьСписокКоммитов(Родители, ТекстРодителей, "Родитель");
	Если Родители.Количество() Тогда
		ВычитаемаяДата = ирОбщий.ЛучшиеЭлементыКоллекцииЛкс(Родители, "Дата", Ложь).Дата;
		ЭлементыФормы.Коммиты.ТекущаяСтрока.ДнейОтРодителя = ирОбщий.РазностьДатЛкс(ВычитаемаяДата, ЭлементыФормы.Коммиты.ТекущаяСтрока.Дата, "День");
	КонецЕсли;
	Если Не ПустаяСтрока(ЭлементыФормы.Коммиты.ТекущаяСтрока.Коммит) Тогда
		СтрокаТаблицы = Родители.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ЭлементыФормы.Коммиты.ТекущаяСтрока);
		СтрокаТаблицы.Роль = "Текущий";
		СтрокаТаблицы = Родители.Добавить();
		СтрокаТаблицы.Роль = "Потомки";
	КонецЕсли;
КонецПроцедуры

Функция КомандаВыводаАтрибутовКоммита() Экспорт
	КомандаВыводаКоммита = НачалоКомандыГита() + " log" + ПараметрыВыводаДанныхКоммита() + " -1 ";
	Возврат КомандаВыводаКоммита;
КонецФункции

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

Процедура ЧтоИскатьПриИзменении(Элемент)
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
	Элемент.ЦветТекстаПоля = ирОбщий.ЦветТекстаИзмененныхДанныхЛкс();
КонецПроцедуры

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

Процедура ОбновитьЗаголовокФормы() Экспорт  
	ЭтаФорма.Заголовок = мЧистыйЗаголовокФормы + ": " + ПапкаГита;
	//ирКлиент.ФормаОбъекта_ОбновитьЗаголовокЛкс(ЭтаФорма, ПапкаГита);
КонецПроцедуры

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

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

Процедура ДействияФормыЗагрузить(Кнопка = Ложь)
	Если мФайлРезультата = Неопределено Тогда
		ТекущаяСтрока = ЭлементыФормы.Коммиты.ТекущаяСтрока;
		Если ЗначениеЗаполнено(ПараметрКоммит) Тогда
			мСтарыйКоммит = ПараметрКоммит;
			ПараметрКоммит = "";
		ИначеЕсли ТекущаяСтрока <> Неопределено Тогда
			мСтарыйКоммит = ТекущаяСтрока.Коммит;
		Иначе
			мСтарыйКоммит = Неопределено;
		КонецЕсли;
		Если мЛиПерваяЗагрузка Тогда
			Результат = ирОбщий.ВыполнитьКомандуОСЛкс("git config --global core.quotepath false",,,,, КодировкаТекста.UTF8); /// Отключаем экранирование высоких символов в именах файлов
			мЛиПерваяЗагрузка = Ложь;
		КонецЕсли;
		КомандаСистемы = НачалоКомандыГита() + " log" + ПараметрыВыводаДанныхКоммита(, Истина);
		Если ЗначениеЗаполнено(ЧтоИскать) Тогда
			КомандаСистемы = КомандаСистемы + " -m -G " + ВТекстовыйЛитералГит(РегВыражениеПоиска());
		КонецЕсли;
		ОтборПоВеткам = "";
		Если ЗначениеЗаполнено(КромеВетки) Тогда
			ОтборПоВеткам = ОтборПоВеткам + КромеВетки + "..";
		КонецЕсли;
		Если ЗначениеЗаполнено(Ветка) Тогда
			ОтборПоВеткам = ОтборПоВеткам + Ветка;
		Иначе
			ОтборПоВеткам = ОтборПоВеткам + " --all";
		КонецЕсли;
		КомандаСистемы = КомандаСистемы + " " + ОтборПоВеткам;
		КомандаСистемы = КомандаСистемы + ПараметрГитаМаскаФайла();
		мФайлРезультата = Новый Файл(ПолучитьИмяВременногоФайла("txt"));
		ирОбщий.ЗапуститьСкрытоеПриложениеИДождатьсяЗавершенияЛкс(КомандаСистемы, мФайлРезультата.Путь, мФайлРезультата.Имя, Ложь,,, Истина);
		ОчиститьРезультаты();
		ЭлементыФормы.ДействияФормы.Кнопки.Загрузить.Картинка = ирКэш.КартинкаПоИмениЛкс("ирОстановить");
		ЗагрузитьПорциюКоммитов();   
	Иначе
		мФайлРезультата = Неопределено;
	КонецЕсли;
КонецПроцедуры

Функция ВТекстовыйЛитералГит(Знач Текст) Экспорт
	Текст = СтрЗаменить(Текст, "\\", "\\\\"); // Первый!
	Текст = СтрЗаменить(Текст, """", "\""");
	Текст = СтрЗаменить(Текст, "&", "^&");
	Текст = СтрЗаменить(Текст, "|", "^|");
	//Текст = СтрЗаменить(Текст, """", "`""");
	//Текст = СтрЗаменить(Текст, """", """""");
	//Текст = СтрЗаменить(Текст, "'", "''");
	Возврат """" + Текст + """";
КонецФункции

Функция РегВыражениеПоиска() Экспорт
	Результат = ирОбщий.ТекстДляРегВыраженияЛкс(ЧтоИскать);
	Возврат Результат;
КонецФункции

Процедура ОчиститьРезультаты() Экспорт
	мМоментНачала = ТекущаяДата();
	Родители.Очистить();
	ФайлыКоммита.Очистить();
	ОчиститьПанельФайла();
	мОстатокПорции = "";
	мЧтениеТекста = Неопределено;
	Коммиты.Очистить();
	ЭлементыФормы.Коммиты.Колонки.Задача.Видимость = ЗначениеЗаполнено(ШаблонКомментария);
	ЭлементыФормы.Родители.Колонки.Задача.Видимость = ЗначениеЗаполнено(ШаблонКомментария);
	Если ПроверитьПапкуГита() Тогда
		РабочийКоммит = Коммиты.Добавить();
		РабочийКоммит.Комментарий = "<Рабочий каталог>";
		РабочийКоммит.Родители = "HEAD";
		ЭлементыФормы.Коммиты.ТекущаяСтрока = Коммиты[0];
	КонецЕсли;
КонецПроцедуры

Процедура ОчиститьПанельФайла() Экспорт
	СтруктураОтличий.Очистить();
	ТекстИзмененийФайла = "";
	мПолеТекстаПоиска.УстановитьТелоHTML("");
КонецПроцедуры

Функция ПараметрГитаМаскаФайла() Экспорт
	ВариантыМаски = ирОбщий.СтрРазделитьЛкс(МаскаИмениФайла, "|", Истина, Ложь);
	Если ВариантыМаски.Количество() = 0 Тогда
		МаскаДляКоманды = """:!*.bin""";
	Иначе
		МаскаДляКоманды = ирОбщий.СтрСоединитьЛкс(ВариантыМаски, " ",,, """%1""");
	КонецЕсли;
	ПараметрГитаМаскаФайла = " --full-history -- " + МаскаДляКоманды;
	Возврат ПараметрГитаМаскаФайла;
КонецФункции

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

Функция ЗагрузитьСписокКоммитов(Знач ТаблицаКоммитов, Знач ТекстДляАнализа, Знач Роль = "") Экспорт
	Если ирОбщий.СтрНачинаетсяСЛкс(ТекстДляАнализа, "fatal") Тогда
		ирОбщий.СообщитьЛкс(ТекстДляАнализа);
		Возврат Неопределено;
	КонецЕсли;
	// Формат вывода см. ПараметрыВыводаДанныхКоммита
	АктивироватьСтарыйКоммит = Истина
		И мСтарыйКоммит <> Неопределено
		И (Ложь
			Или ЭлементыФормы.Коммиты.ТекущаяСтрока = Неопределено
			Или ЭлементыФормы.Коммиты.ТекущаяСтрока = Коммиты[0]);
	ИменаГрупп = "Коммит, Дата, Автор, Комментарий, Родители, Метки, Статистика";
	ЧислоГрупп = СтрЧислоВхождений(ИменаГрупп, ",") + 1;
	Разделитель = РазделительАтрибутовКоммитов();
	Вхождения = ирОбщий.НайтиРегВыражениеЛкс(ТекстДляАнализа, "\s*" + ирОбщий.СтрокаПовторомЛкс(Разделитель + "([\s\S]*?)(?=" + Разделитель + "|$)", ЧислоГрупп), ИменаГрупп);
	Для Каждого ВхожденияЭлемент Из Вхождения Цикл
		СтрокаТаблицы = ТаблицаКоммитов.Найти(ВхожденияЭлемент.Коммит, "Коммит");
		Если СтрокаТаблицы = Неопределено Тогда
			СтрокаТаблицы = ТаблицаКоммитов.Добавить();
		КонецЕсли;
		ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ВхожденияЭлемент, СтрЗаменить(ИменаГрупп, ", Статистика", ""));
		Если ЗначениеЗаполнено(ШаблонКомментария) Тогда
			ВхожденияЗадачи = ирОбщий.НайтиРегВыражениеЛкс(СтрокаТаблицы.Комментарий, ШаблонКомментария,, Ложь);
			Если ВхожденияЗадачи.Количество() Тогда
				Если ВхожденияЗадачи[0].Группы.Количество() Тогда
					СтрокаТаблицы.Задача = ВхожденияЗадачи[0].Группа0;
				Иначе
					СтрокаТаблицы.Задача = ВхожденияЗадачи[0].ТекстВхождения;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		СтрокаТаблицы.Слияние = Найти(СтрокаТаблицы.Родители, " ");
		Если ЗначениеЗаполнено(ВхожденияЭлемент.Статистика) Тогда
			СтрокаТаблицы.Файлов = Число(ирОбщий.ПервыйФрагментЛкс(СокрЛ(ВхожденияЭлемент.Статистика), " "));
		КонецЕсли;
		Если ЗначениеЗаполнено(Роль) Тогда
			СтрокаТаблицы.Роль = Роль;
		КонецЕсли;
		Если Ложь
			// Так затормозим загрузке коммитов
			//Или (Истина
			//	И Не АктивироватьСтарыйКоммит
			//	И ЭлементыФормы.Коммиты.ТекущаяСтрока = Неопределено)
			Или (Истина
				И АктивироватьСтарыйКоммит 
				И СтрокаТаблицы.Коммит = мСтарыйКоммит 
				И ТаблицаКоммитов = Коммиты)
		Тогда
			ЭлементыФормы.Коммиты.ТекущаяСтрока = СтрокаТаблицы;
		КонецЕсли;
	КонецЦикла;
	Если ТаблицаКоммитов = Родители Тогда
		ПодключитьОбработчикОжидания("ЗагрузитьВеткиРодителей", 0.1, Истина );
	КонецЕсли;
	Возврат Вхождения;
КонецФункции

Функция ЗагрузитьВеткиРодителей() Экспорт
	Для Каждого СтрокаТаблицы Из Родители Цикл
		Если ПустаяСтрока(СтрокаТаблицы.Коммит) Тогда
			Продолжить;
		КонецЕсли;
		ВеткиТекст = ирОбщий.ВыполнитьКомандуОСЛкс(НачалоКомандыГита() + " branch -r --contains " + СтрокаТаблицы.Коммит + " --format=""%(refname:short)""",,,,, КодировкаТекста.UTF8);
		Попытка
			Пустышка = СтрокаТаблицы.Коммит;
		Исключение
			// Антибаг платформы 8.3.27 Во время ожидания вызова внешней компоненты срабатывает обработчик ожидания и перезаполняет таблицу родителей
			Возврат Ложь;
		КонецПопытки;
		СтрокаТаблицы.Ветки = ВеткиТекст;
		СтрокаТаблицы.Ветки = ирОбщий.СтрЗаменитьЛкс(СтрокаТаблицы.Ветки, Символы.ПС, ", ",, Ложь);
	КонецЦикла;
	ЗагрузитьВеткиСвязанногоКоммита();
КонецФункции

Процедура ОбновитьПоискВТекстеФайла(Знач ПереносСлов = Ложь)
	СтруктураОтличий.Очистить();
	Если ЛиРасширениеФайлаКода1С(ЭлементыФормы.ФайлыКоммита.ТекущаяСтрока.ТипФайла) Тогда
		ПолеТекстаМодуля = ирОбщий.НовыйАнализаторКодаЛкс(0);
		ПолеТекстаМодуля.УстановитьТекстБезМетаданных(ТекстВерсииФайла());
		НомерСтрокиИзменений = 0;
		ПредПозиция = 0;
		Для Каждого РегЭлемент Из мПлатформа.НайтиЗаголовкиИКонцыМетодов(ТекстИзмененийФайла, Ложь) Цикл
			ПропущенныйТекст = Сред(ТекстИзмененийФайла, ПредПозиция, РегЭлемент.FirstIndex - ПредПозиция);
			НомерСтрокиИзменений = НомерСтрокиИзменений + ирОбщий.СтрЧислоСтрокЛкс(ПропущенныйТекст);
			ДобавитьБлокОтличий(РегЭлемент.SubMatches(0), СокрЛП(РегЭлемент.Value), НомерСтрокиИзменений);
			ПредПозиция = РегЭлемент.FirstIndex;
		КонецЦикла;
	Иначе
		ПолеТекстаМодуля = Неопределено;
	КонецЕсли;
	мАктивироватьНомерСтроки = Неопределено;
	Если ЗначениеЗаполнено(ПараметрНомерСтроки) Тогда
		Вхождения = ирОбщий.НайтиРегВыражениеЛкс(ТекстИзмененийФайла, "@@ \-\d+,\d+ \+(\d+),\d+ @@");
		ПредВхождение = Неопределено;
		ПредНомерСтроки = 0;
		Для Каждого ВхожденияЭлемент Из Вхождения Цикл
			НомерСтрокиЦикл = Число(ВхожденияЭлемент.Группа0);
			Если НомерСтрокиЦикл > ПараметрНомерСтроки Тогда
				Прервать;
			КонецЕсли;
			ПредВхождение = ВхожденияЭлемент;
			ПредНомерСтроки = НомерСтрокиЦикл;
		КонецЦикла;
		Если ПредВхождение <> Неопределено Тогда
			СмещениеСтрокиВБлоке = ПараметрНомерСтроки - ПредНомерСтроки + 1;
			мАктивироватьНомерСтроки = ирОбщий.СтрЧислоСтрокЛкс(Лев(ТекстИзмененийФайла, ПредВхождение.ПозицияВхождения + 1));
			Текстовый = Новый ТекстовыйДокумент;
			Текстовый.УстановитьТекст(Сред(ТекстИзмененийФайла, ПредВхождение.ПозицияВхождения + СтрДлина(ПредВхождение.ТекстВхождения) + 2));
			Для НомерСтроки = 1 По Текстовый.КоличествоСтрок() Цикл
				мАктивироватьНомерСтроки = мАктивироватьНомерСтроки + 1;
				Строка = Текстовый.ПолучитьСтроку(НомерСтроки);
				Если Лев(Строка, 1) <> "-" Тогда
					СмещениеСтрокиВБлоке = СмещениеСтрокиВБлоке - 1;
					Если СмещениеСтрокиВБлоке = 0 Тогда
						Прервать;
					КонецЕсли;
				КонецЕсли; 
			КонецЦикла;
		КонецЕсли;
		ЭтаФорма.ПараметрНомерСтроки = "";
	КонецЕсли;
	ТекстХтмл = ТекстИзмененийФайла; 
	ЛиСыройТекст = Ложь;
	Если ЗначениеЗаполнено(ЧтоИскать) Тогда
		ТекстХтмл = ОформитьТекстИзмененийХтмл(ТекстХтмл, ПолеТекстаМодуля);
		ЛиСыройТекст = Истина;
		мПолеТекстаПоиска.УстановитьТелоHTML(ТекстХтмл, ПереносСлов,,, Истина);
		ТекстИзмененийФайла = мПолеТекстаПоиска.ПолучитьТекст(Ложь);
		ВыражениеПоискаСлов = "(?:\n|^)(?:\+|\-)[^\n]*(" + РегВыражениеПоиска() + ")[^\n]*(?=\n|$)";
		мИндексГруппыПодсветки = 0;
		РезультатыПоиска = мПолеТекстаПоиска.НайтиРегВыражение(ТекстИзмененийФайла, ВыражениеПоискаСлов);
		ирОбщий.ЗаполнитьКолонкуПорядкаТаблицыЛкс(РезультатыПоиска, "Номер");
		РезультатыПоиска.ЗагрузитьКолонку(РезультатыПоиска.ВыгрузитьКолонку("ДлинаГруппы"), "Длина");
		ТекстХтмл = мПолеТекстаПоиска.РазметитьТекстРезультатамиПоиска(ТекстИзмененийФайла, РезультатыПоиска, мИндексГруппыПодсветки);
	Иначе
		ТекстХтмл = ТекстИзмененийФайла;
		РезультатыПоиска = Новый Массив;
	КонецЕсли;
	ЭлементыФормы.НадписьНайдено.Заголовок = НСтр("ru='Найдено: '") + РезультатыПоиска.Количество();
	ТекстХтмл = ОформитьТекстИзмененийХтмл(ТекстХтмл, ПолеТекстаМодуля, ЛиСыройТекст);
	Стили = 
	".added { background-color: #ddffdd; }
    |.removed { background-color: #ffdddd; }
	|.method { color: #000080; }
    |.header { color: #666666; font-weight: bold; }";
	мПолеТекстаПоиска.УстановитьТелоHTML(ТекстХтмл, ПереносСлов, Стили);
	//СтарыйТекущийЭлемент = ТекущийЭлемент;
	//ЭтаФорма.ТекущийЭлемент = мПолеТекстаПоиска.ЭлементФормы; /// Для лечения проблемы платформы установки фокуса ввода
	СледующееВхождениеНажатие();
	//ЭтаФорма.ТекущийЭлемент = СтарыйТекущийЭлемент; // Если раскомментировать, то все равно будет проблема платформы установки фокуса ввода
	СтруктураОтличий.Сортировать("Блок");
КонецПроцедуры

Процедура ПредыдущееВхождениеНажатие(Элемент = Неопределено)
	//мПолеТекстаПоиска.ПредыдущееВхождениеНажатие(мИндексГруппыПодсветки, Истина);
	мПолеТекстаПоиска.ПредыдущееВхождениеНажатие(мИндексГруппыПодсветки);
	АктивироватьБлокИзТекста();
КонецПроцедуры

Процедура СледующееВхождениеНажатие(Элемент = Неопределено)
	Если мАктивироватьНомерСтроки <> Неопределено Тогда
		мПолеТекстаПоиска.УстановитьГраницыВыделения(мАктивироватьНомерСтроки, 1, мАктивироватьНомерСтроки, 30, , ЭтаФорма);
		мАктивироватьНомерСтроки = Неопределено;
	Иначе
		//мПолеТекстаПоиска.СледующееВхождениеНажатие(мИндексГруппыПодсветки, Истина);
		мПолеТекстаПоиска.СледующееВхождениеНажатие(мИндексГруппыПодсветки);
	КонецЕсли;
	АктивироватьБлокИзТекста();
КонецПроцедуры

Процедура МаскаИмениФайлаПриИзменении(Элемент = Неопределено)
	Если Элемент <> Неопределено Тогда
		Элемент.ЦветТекстаПоля = ирОбщий.ЦветТекстаИзмененныхДанныхЛкс();
	КонецЕсли;
	Элемент = ЭлементыФормы.МаскаИмениФайла;
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
КонецПроцедуры

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

Процедура ИзмененияФайлаДокументСформирован(Элемент)
	СледующееВхождениеНажатие();
КонецПроцедуры

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

Процедура ВеткаПриИзменении(Элемент)
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма,,, ПапкаГита);
	Элемент.ЦветТекстаПоля = ирОбщий.ЦветТекстаИзмененныхДанныхЛкс();
КонецПроцедуры

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

Процедура ВеткаНачалоВыбора(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	СписокВеток = Новый СписокЗначений;
	СписокВеток.ТипЗначения = Новый ОписаниеТипов("Строка");
	Текст = ирОбщий.ВыполнитьКомандуОСЛкс(НачалоКомандыГита() + "branch -a",,,,, КодировкаТекста.UTF8);
	Текст = СтрЗаменить(Текст, "* ", "");
	СписокВеток.ЗагрузитьЗначения(ирОбщий.СтрРазделитьЛкс(Текст, Символы.ПС, Истина));
	СписокВеток.СортироватьПоЗначению();
	ЭлементСписка = СписокВеток.НайтиПоЗначению(Элемент.Значение);
	ВыбранныйЭлемент = ирКлиент.ВыбратьЭлементСпискаЗначенийЛкс(СписокВеток, ЭлементСписка,, "Выбор ветки");
	Если ВыбранныйЭлемент <> Неопределено Тогда
		ирКлиент.ИнтерактивноЗаписатьВПолеВводаЛкс(Элемент, ВыбранныйЭлемент.Значение);
	КонецЕсли;
КонецПроцедуры

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

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

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

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

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

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

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

Функция ЛиРасширениеФайлаКода1С(Знач ТипФайла) Экспорт
	Результат = Ложь
		Или ирОбщий.СтрокиРавныЛкс(ТипФайла, "BSL")
		Или ирОбщий.СтрокиРавныЛкс(ТипФайла, "OS");
	Возврат Результат;
КонецФункции

Функция ТекстВерсииФайла(Знач ЛиПредыдущаяВерсия = Ложь) Экспорт
	Команда = НачалоКомандыГита() + "show -m ";
	Если ЛиПредыдущаяВерсия Тогда
		// В коммите слияния почему то работает только для первого файла
		//Команда = Команда + ЭлементыФормы.Коммиты.ТекущаяСтрока.Коммит
		//	+ ?(Не ЭлементыФормы.Коммиты.ТекущаяСтрока.Слияние, "~", "^^" + ЭлементыФормы.Родители.ТекущаяСтрока.Номер);
		ЛогическоеВыражение = Ложь
			Или Родители.Количество() = 1
			Или Родители.Найти("Родитель", "Роль") = Неопределено;
		Команда = Команда + ?(ЛогическоеВыражение, Родители[0].Коммит, Родители.Найти(ЭлементыФормы.ФайлыКоммита.ТекущаяСтрока.НомерРодителя, "Номер").Коммит);
	Иначе
		Если ПустаяСтрока(ЭлементыФормы.Коммиты.ТекущаяСтрока.Коммит) Тогда
			Возврат ирОбщий.ПрочитатьТекстИзФайлаЛкс(ИмяРабочегоФайла());
		КонецЕсли;
		Команда = Команда + ЭлементыФормы.Коммиты.ТекущаяСтрока.Коммит;
	КонецЕсли;
	Команда = Команда + ":""" + ЭлементыФормы.ФайлыКоммита.ТекущаяСтрока.Файл + """";
	Текст = ирОбщий.ВыполнитьКомандуОСЛкс(Команда,,,,, КодировкаТекста.UTF8);
	Возврат Текст;
КонецФункции

Процедура КПРезультатыПоискаСсылка(Кнопка)
	Ссылка = СсылкаНаСтрокуАктуальнойВерсии();
	Если Ссылка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ирКлиент.ПоказатьСсылкуНаСтрокуМодуляЛкс(Ссылка);
КонецПроцедуры

Процедура ЧислоСтрокКонтекстаПриИзменении(Элемент)
	//ПодключитьОбработчикОжидания("ЗагрузитьИзмененияФайла", 0.1, Истина );
	ПодключитьОбработчикОжидания("ЗагрузитьФайлыКоммита", 0.1, Истина );
КонецПроцедуры

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

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

Функция ПараметрыКоммитаДляКоманды() Экспорт
	ПараметрыКоммитаДляКоманды = ЭлементыФормы.Коммиты.ТекущаяСтрока.Коммит
		+ ?(Родители.Количество() = 1, "", "^^" + ЭлементыФормы.Родители.ТекущаяСтрока.Номер);
	Возврат ПараметрыКоммитаДляКоманды;
КонецФункции

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

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

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

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

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

Процедура РодителиВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	СтрокаКоммита = Коммиты.Найти(ВыбраннаяСтрока.Коммит, "Коммит");
	Если ВыбраннаяСтрока.Роль = "Потомки" Тогда
		ПозицияСтроки = Родители.Индекс(ВыбраннаяСтрока);
		Родители.Удалить(ВыбраннаяСтрока);
		ТекстДетей = ирОбщий.ВыполнитьКомандуОСЛкс(
				НачалоКомандыГита() + " log --all --oneline --pretty=format:""%H %P"" | find "" " + ЭлементыФормы.Коммиты.ТекущаяСтрока.Коммит + """ | for /f ""tokens=1,*"" %j in ('more') do @"
				+ КомандаВыводаАтрибутовКоммита() + "%j",,,,, КодировкаТекста.UTF8);
		ЗагрузитьСписокКоммитов(Родители, ТекстДетей, "Потомок");
		ЭлементыФормы.Родители.ТекущаяСтрока = Родители[ПозицияСтроки];
	ИначеЕсли СтрокаКоммита = Неопределено Тогда
		ирОбщий.СообщитьЛкс(НСтр("ru='Коммит-родитель не найден в списке загруженных.'"));
	Иначе
		ЭлементыФормы.Коммиты.ТекущаяСтрока = СтрокаКоммита;
	КонецЕсли;
КонецПроцедуры

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

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

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

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

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

Процедура ВыгрузитьФайлВерсии(ИмяФайла) Экспорт
	ирОбщий.ЗапуститьСкрытоеПриложениеИДождатьсяЗавершенияЛкс(НачалоКомандыГита() + "show " + ЭлементыФормы.Коммиты.ТекущаяСтрока.Коммит + ":""" + ЭлементыФормы.ФайлыКоммита.ТекущаяСтрока.Файл + """"
		+ "> """ + ИмяФайла + """");
	ирОбщий.СообщитьЛкс(ИмяФайла);
КонецПроцедуры

Процедура КПРезультатыПоискаОткрытьВерсиюРабочая(Кнопка)
	ЗапуститьПриложение(ИмяРабочегоФайла());
КонецПроцедуры

Функция ИмяРабочегоФайла() Экспорт
	Возврат ПапкаГита + СтрЗаменить("/" + ЭлементыФормы.ФайлыКоммита.ТекущаяСтрока.Файл, "/", ирОбщий.РазделительПутиКФайлуЛкс());
КонецФункции

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

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

Процедура ДействияФормыОбновлениеИзEDT(Кнопка)
	ПолучитьФорму("ОбновлениеИзEDT").Открыть();
КонецПроцедуры

Процедура ДействияФормыИзмененныеМодули(Кнопка)
	ирКлиент.ОткрытьФормуЛкс("Обработка.ирКлсПолеТекстаПрограммы.Форма.ИзмененныеМодули");
КонецПроцедуры

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

Процедура ИзмененияФайлаonclick(Элемент, pEvtObj)
	АктивироватьБлокИзТекста();
КонецПроцедуры

Процедура АктивироватьБлокИзТекста() Экспорт
	Если СтруктураОтличий.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	ВыделениеТекста = мПолеТекстаПоиска.ПолучитьВыделениеВДокументеHTML();
	НомерСтрокиТекущий = ирОбщий.СтрЧислоСтрокЛкс(Лев(ТекстИзмененийФайла, ВыделениеТекста.Конец));
	КопияСтруктуры = СтруктураОтличий.Скопировать();
	КопияСтруктуры.Сортировать("НомерСтроки");
	СтрокаАктивногоБлока = КопияСтруктуры[КопияСтруктуры.Количество() - 1];
	ПредСтрока = Неопределено;
	Для Каждого Строка Из КопияСтруктуры Цикл
		Если Строка.НомерСтроки > НомерСтрокиТекущий Тогда
			СтрокаАктивногоБлока = ПредСтрока;
			Прервать;
		КонецЕсли;
		ПредСтрока = Строка;
	КонецЦикла;
	РасчетнаяСтрокаБлока = СтруктураОтличий.Найти(СтрокаАктивногоБлока.Блок, "Блок");
	мРазрешитьПрыжокВНачалоБлока = Ложь;
	ЭлементыФормы.СтруктураОтличий.ТекущаяСтрока = РасчетнаяСтрокаБлока;
КонецПроцедуры

Процедура ШаблонКомментарияПриИзменении(Элемент)
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
КонецПроцедуры

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

Процедура ШаблонКомментарияНачалоВыбора(Элемент, СтандартнаяОбработка)
	ТекущаяСтрока = ЭлементыФормы.Коммиты.ТекущаяСтрока;
	Если ТекущаяСтрока <> Неопределено Тогда
		Комментарий = ТекущаяСтрока.Комментарий;
	КонецЕсли;
	ирКлиент.ПолеВводаРегулярногоВыраженияНачалоВыбораЛкс(Элемент, Комментарий);
КонецПроцедуры

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

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирИсторияГита.Форма.Форма");
#Если Сервер И Не Сервер Тогда
	мПолеТекстаПоиска = Обработки.ирОболочкаПолеТекста.Создать();
#КонецЕсли 
ЧислоСтрокКонтекста = 2;
мЛиПерваяЗагрузка = Истина;
