Перем мОболочкаРедактора; 
Перем мПолеТекстаПрограммы1;
Перем мПолеТекстаПрограммы2; 
Перем мРазрешитьАвтоПрокруткуТекста;
Перем мСтароеВыделение;
Перем мЛиСтараяСторонаЛевая;

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

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

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

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

Процедура ПриЗакрытии()
	
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
	// Освобождаем память для случая, когда форма в кэше
	Текст1 = ""; 
	Текст2 = ""; 
	Если мПолеТекстаПрограммы1 <> Неопределено Тогда
		мПолеТекстаПрограммы1.Уничтожить();
		мПолеТекстаПрограммы2.Уничтожить();
	КонецЕсли;

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

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

Функция РедакторHTML()
	Если мОболочкаРедактора = Неопределено Тогда 
		Возврат Неопределено;
	КонецЕсли; 
	Возврат мОболочкаРедактора.РедакторHTML();
КонецФункции

Процедура РедакторHTMLДокументСформирован(Элемент)
	
	Инфо = Новый СистемнаяИнформация();
	РедакторHTML = ЭлементыФормы.РедакторHTML.Документ.defaultView;
	РедакторHTML.init(Инфо.ВерсияПриложения);
	РедакторHTML.minimap(Ложь);
	РедакторHTML.setOption("disableNativeHovers", Истина); // События не перестают вызываться  // Пока не работает https://github.com/salexdv/bsl_console/issues/193
	РедакторHTML.setOption("generateCompareCompleteEvent", Истина);
	РедакторHTML.showStatusBar(Ложь);
	ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.РедакторHTML;
	//РедакторHTML.editor.focus(); // Если раскоментировать, то сочетания клавиш перестают срабатывать https://github.com/salexdv/bsl_console/issues/165#issuecomment-852768520
	ОбновитьСравнениеТекстов(Ложь);
	Если СтрДлина(Текст1) < 2 И СтрДлина(Текст2) < 2 Тогда
		ПодключитьОбработчикОжидания("АктивироватьСторону1", 0.1, Истина); // Иначе кнопка установки текст первый раз не в ту сторону вставляет
	КонецЕсли;
	
КонецПроцедуры

//.
// Возвращаемое значение:
//   Число, Неопределено - 
Функция КодЯзыкаПрограммы() Экспорт
	Если ВариантСинтаксиса = "ЯзыкЗапросов" Тогда
		КодЯзыкаПрограммы = 1;
	//ИначеЕсли ВариантСинтаксиса = "ЯзыкКомпоновки" Тогда
	//	КодЯзыкаПрограммы = 2;
	ИначеЕсли ВариантСинтаксиса = "ВстроенныйЯзык" Тогда
		КодЯзыкаПрограммы = 0;
	Иначе
		КодЯзыкаПрограммы = Неопределено;
	КонецЕсли;
	Возврат КодЯзыкаПрограммы;
КонецФункции

Процедура РедакторHTMLonclick(Элемент, ДанныеСобытия)
	РедакторHTMLonclickДинамический(ДанныеСобытия);
КонецПроцедуры

// Для подключения через ДобавитьОбработчик внутри ПолеТекстаАлгоритма.РедакторHTML_Инициировать
Процедура РедакторHTMLonclickДинамический(ДанныеСобытия) Экспорт
	РедакторHTML = РедакторHTML();
	Если РедакторHTML = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Событие = ДанныеСобытия.eventData1C;
	Если Событие <> Неопределено Тогда
		Если Событие.event = "EVENT_COMPARE_COMPLETE" Тогда // https://github.com/salexdv/bsl_console/issues/364
			Если ПараметрНомерСтроки2 = 0 И ПараметрНомерСтроки1 = 0 Тогда
				ОбновитьСтруктуруОтличий(); // После этого редактор сам делает активацию первого изменения
			Иначе
				ПодключитьОбработчикОжидания("ОбновитьСтруктуруОтличий", 0.1, Истина);
			КонецЕсли;
			Возврат;
		КонецЕсли;
	КонецЕсли;
	ОбновитьСравнениеТекущихСтрок();
	ОбновитьТекущиеПути();
КонецПроцедуры

Процедура ОбновитьСравнениеТекущихСтрок() Экспорт
	РедакторHTML = РедакторHTML();
	Если РедакторHTML = Неопределено Тогда
		Возврат;     
	КонецЕсли;
	ОтличияСтрок = РедакторHTML.editor.getLineChanges(); // Массив Из см. НовыйЭлементОтличия
	НомерСтроки2 = РедакторСтороны2().getSelection().positionLineNumber;
	НомерСтроки1 = РедакторСтороны1().getSelection().positionLineNumber;
	Если ОтличияСтрок <> Неопределено Тогда
		_РежимОтладки = Ложь;
		Если _РежимОтладки Тогда // Можно менять на Истина в точке останова, например условием ирОбщий.Пр(_РежимОтладки, 1, 1)
			// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
			Для Каждого ОтличиеСтрок Из ОтличияСтрок Цикл
				Если НомерСтроки2 < ОтличиеСтрок.modifiedStartLineNumber Тогда
					Прервать;
				ИначеЕсли Истина
					И НомерСтроки2 >= ОтличиеСтрок.modifiedStartLineNumber
					И (Ложь
						Или НомерСтроки2 <= ОтличиеСтрок.modifiedEndLineNumber
						Или (Истина
							И НомерСтроки2 = ОтличиеСтрок.modifiedStartLineNumber 
							И ОтличиеСтрок.modifiedEndLineNumber = 0))
				Тогда
					НомерСтроки1 = ОтличиеСтрок.originalStartLineNumber;
					Если ОтличиеСтрок.originalEndLineNumber = 0 Тогда
						НомерСтроки1 = Неопределено;
					КонецЕсли;
					Если ОтличиеСтрок.modifiedEndLineNumber = 0 Тогда
						НомерСтроки2 = Неопределено;
					КонецЕсли;
					Прервать;
				КонецЕсли; 
			КонецЦикла;   
		Иначе
			// Однострочный код использован для ускорения при разрешенной отладке. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика"
			Для Каждого ОтличиеСтрок Из ОтличияСтрок Цикл  			Если НомерСтроки2 < ОтличиеСтрок.modifiedStartLineNumber Тогда  				Прервать;  			ИначеЕсли Истина  				И НомерСтроки2 >= ОтличиеСтрок.modifiedStartLineNumber  				И (Ложь  					Или НомерСтроки2 <= ОтличиеСтрок.modifiedEndLineNumber  					Или (Истина  						И НомерСтроки2 = ОтличиеСтрок.modifiedStartLineNumber  						И ОтличиеСтрок.modifiedEndLineNumber = 0))  			Тогда  				НомерСтроки1 = ОтличиеСтрок.originalStartLineNumber;  				Если ОтличиеСтрок.originalEndLineNumber = 0 Тогда  					НомерСтроки1 = Неопределено;  				КонецЕсли;  				Если ОтличиеСтрок.modifiedEndLineNumber = 0 Тогда  					НомерСтроки2 = Неопределено;  				КонецЕсли;  				Прервать;  			КонецЕсли;  		КонецЦикла;  
		КонецЕсли;
		//Если НомерСтроки1 <> Неопределено Тогда
		//	РедакторСтороны1().setPosition(НомерСтроки1, 1); // Почему то не работает
		//КонецЕсли;
	КонецЕсли;
	СравнитьТекущиеСтрокиПоНомерам(НомерСтроки1, НомерСтроки2);
КонецПроцедуры

Процедура СравнитьТекущиеСтрокиПоНомерам(Знач НомерСтроки1, Знач НомерСтроки2) Экспорт
	РедакторHTML = РедакторHTML();
	ТекстСтроки1 = "";
	Если НомерСтроки1 <> Неопределено Тогда
		ТекстСтроки1 = РедакторHTML.editor.getModel().original.getLineContent(НомерСтроки1);
	КонецЕсли;
	ТекстСтроки2 = "";
	Если НомерСтроки2 <> Неопределено Тогда
		ТекстСтроки2 = РедакторHTML.editor.getModel().modified.getLineContent(НомерСтроки2);
	КонецЕсли;
	ЭлементыФормы.СравнениеТекущейСтроки.Документ.defaultView.setText(ТекстСтроки1, ТекстСтроки2, Не УчитыватьКрайнююПустоту);
КонецПроцедуры

Функция РедакторСтороны1() Экспорт
	РедакторHTML = РедакторHTML();
	Если РедакторHTML = Неопределено Тогда
		Возврат Неопределено;     
	КонецЕсли;
	Результат = РедакторHTML.editor.getOriginalEditor();
	Возврат Результат;
КонецФункции

Функция РедакторСтороны2() Экспорт
	РедакторHTML = РедакторHTML();
	Если РедакторHTML = Неопределено Тогда
		Возврат Неопределено;     
	КонецЕсли;
	Результат = РедакторHTML.editor.getModifiedEditor();
	Возврат Результат;
КонецФункции

Процедура ОбновитьТекущиеПути(Знач НомерСтроки1 = 0, Знач НомерСтроки2 = 0) Экспорт
	РедакторHTML = РедакторHTML();
	Если РедакторHTML = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если НомерСтроки1 = 0 Тогда
		НомерСтроки1 = РедакторСтороны1().getSelection().positionLineNumber;
	КонецЕсли;
	Если НомерСтроки2 = 0 Тогда
		НомерСтроки2 = РедакторСтороны2().getSelection().positionLineNumber;
	КонецЕсли;
	Если КодЯзыкаПрограммы() <> Неопределено Тогда
		Если ПоБлокам Тогда 
			Если ЭлементыФормы.СравнениеБлоков.ТекущаяСтрока = Неопределено Тогда
				ЭтаФорма.ПутьВТексте1 = "";
				ЭтаФорма.ПутьВТексте2 = "";
			Иначе
				ЭтаФорма.ПутьВТексте1 = ЭлементыФормы.СравнениеБлоков.ТекущаяСтрока.Имя1;
				ЭтаФорма.ПутьВТексте2 = ЭлементыФормы.СравнениеБлоков.ТекущаяСтрока.Имя2;
			КонецЕсли;
		Иначе
			ОбновитьПутьСтороны(ЭлементыФормы.ПутьВТексте1, мПолеТекстаПрограммы1, НомерСтроки1);
			ОбновитьПутьСтороны(ЭлементыФормы.ПутьВТексте2, мПолеТекстаПрограммы2, НомерСтроки2, Истина);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

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

Функция ЛиАктивнаЛеваяСторона() Экспорт
	РедакторHTML = РедакторHTML();
	Возврат РедакторHTML.getActiveEditor() = РедакторСтороны1();
КонецФункции

Процедура ОбновитьСравнениеТекстов(Знач СохранятьПозицию = Истина)
	РедакторHTML = РедакторHTML();
	Если РедакторHTML = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ПодменюСинтаксис = ЭлементыФормы.ДействияФормы.Кнопки.Синтаксис.Кнопки;
	Если ВариантСинтаксиса = ПодменюСинтаксис.ЯзыкЗапросов.Имя Тогда
		РедакторHTML.setLanguageMode("bsl_query");
	ИначеЕсли ВариантСинтаксиса = ПодменюСинтаксис.ЯзыкКомпоновки.Имя Тогда
		РедакторHTML.setLanguageMode("dcs_query");
	ИначеЕсли ВариантСинтаксиса = ПодменюСинтаксис.XML.Имя Тогда
		РедакторHTML.setLanguageMode("xml");
	ИначеЕсли ВариантСинтаксиса = ПодменюСинтаксис.ВстроенныйЯзык.Имя Тогда
		РедакторHTML.setLanguageMode("bsl");
	Иначе
		РедакторHTML.setLanguageMode("");
	КонецЕсли;
	Если СохранятьПозицию Тогда
		мСтароеВыделение = мОболочкаРедактора.ВыделениеДвумерное(Истина);
	КонецЕсли;
	Попытка
		мЛиСтараяСторонаЛевая = ЛиАктивнаЛеваяСторона();
	Исключение
		// Первый раз
		мЛиСтараяСторонаЛевая = Истина;
	КонецПопытки;
	ОтобразитьСравнениеБлоков();
	ПолеТекстаHTML = ирКлиент.ОболочкаПоляТекстаЛкс(ЭлементыФормы.РедакторHTML);
	#Если Сервер И Не Сервер Тогда
		ПолеТекстаHTML = Обработки.ирОболочкаПолеТекста.Создать();
	#КонецЕсли
	ПолеТекстаHTML.Инициировать(ЭтаФорма);
	КодЯзыкаПрограммы = КодЯзыкаПрограммы();
	СтруктураОтличий.Очистить();
	ЭлементыФормы.ДействияФормы.Кнопки.СформироватьМодульРасширения.Доступность = КодЯзыкаПрограммы = 0;
	Если КодЯзыкаПрограммы <> Неопределено Тогда
		ЭлементыФормы.ПоБлокам.Доступность = Истина;
		мПолеТекстаПрограммы1 = ирОбщий.НовыйАнализаторКодаЛкс(КодЯзыкаПрограммы); 
		мПолеТекстаПрограммы1.УстановитьТекст(Текст1,,,,,, СтрДлина(Текст1));
		мПолеТекстаПрограммы2 = ирОбщий.НовыйАнализаторКодаЛкс(КодЯзыкаПрограммы);
		мПолеТекстаПрограммы2.УстановитьТекст(Текст2,,,,,, СтрДлина(Текст2));
		мПолеТекстаПрограммы1.РазобратьТекущийКонтекст();
		мПолеТекстаПрограммы2.РазобратьТекущийКонтекст();
		Если КодЯзыкаПрограммы = 1 Тогда
			мПолеТекстаПрограммы1.ПодготовитьПакетЗапросов();
			мПолеТекстаПрограммы2.ПодготовитьПакетЗапросов();
		КонецЕсли;
		ЕстьСтруктура = Ложь
			Или (Истина
				И КодЯзыкаПрограммы = 0
				И мПолеТекстаПрограммы1.мМодульМетаданных.Методы.Количество() + мПолеТекстаПрограммы2.мМодульМетаданных.Методы.Количество() > 2)
			Или (Истина
				И КодЯзыкаПрограммы = 1
				И мПолеТекстаПрограммы1.мПакетЗапросов.Позиции0Запросов.Количество() + мПолеТекстаПрограммы2.мПакетЗапросов.Позиции0Запросов.Количество() > 2);
	Иначе
		ЕстьСтруктура = Ложь;
		ЭлементыФормы.ПоБлокам.Доступность = Ложь;
		Если ПоБлокам Тогда
			ЭтаФорма.ПоБлокам = Ложь;
		КонецЕсли;
		ИзменитьСвернутостьСравнениеБлоков();
	КонецЕсли;
	ИзменитьСвернутостьПанельСтруктуры(ЕстьСтруктура);
	//ПодключитьОбработчикОжидания("ОбновитьСтруктуруОтличий", 0.2, Истина);
КонецПроцедуры

Процедура ОтобразитьСравнениеБлоков(Знач ТекстБлока1 = Неопределено, Знач ТекстБлока2 = Неопределено) Экспорт
	РедакторHTML = РедакторHTML();
	ПодсветкаСинтаксиса = ВариантСинтаксиса <> "Обычный";
	Если ТекстБлока1 = Неопределено Тогда
		ТекстБлока1 = Текст1;
	КонецЕсли;
	Если ТекстБлока2 = Неопределено Тогда
		ТекстБлока2 = Текст2;
	КонецЕсли;
	ЛиОкрашиватьСтрокиЦеликом = Истина;
	//мОболочкаРедактора.УстановитьТекст(ТекстБлока1);
	РедакторHTML.compare(ТекстБлока2, Параллельно, ПодсветкаСинтаксиса, ЛиОкрашиватьСтрокиЦеликом, Не УчитыватьКрайнююПустоту, ТекстБлока1); // https://github.com/salexdv/bsl_console/blob/develop/docs/compare.md
КонецПроцедуры

Функция НовыйЭлементОтличия()
	Структура = Новый Структура;
	Структура.Вставить("modifiedText", "");
	Структура.Вставить("originalStartLineNumber", 0);
	Структура.Вставить("originalEndLineNumber", 0);
	Структура.Вставить("modifiedStartLineNumber", 0);
	Структура.Вставить("modifiedEndLineNumber", 0);
	Возврат Структура;
КонецФункции

Процедура ОбновитьСтруктуруОтличий() Экспорт
	мРазрешитьАвтоПрокруткуТекста = Ложь;
	РедакторHTML = РедакторHTML();
	КодЯзыкаПрограммы = КодЯзыкаПрограммы();
	Если ЗначениеЗаполнено(ПараметрНомерСтроки1) Тогда
		Если мСтароеВыделение = Неопределено Тогда
			мСтароеВыделение = мОболочкаРедактора.НоваяСтруктураДвумерногоВыделения();
		КонецЕсли;
		мСтароеВыделение.НачальнаяСтрока = ПараметрНомерСтроки1;
		мСтароеВыделение.КонечнаяСтрока = ПараметрНомерСтроки1;
		мСтароеВыделение.КонечнаяКолонка = 100;
		ПараметрНомерСтроки1 = 0;
		мЛиСтараяСторонаЛевая = Истина;
	КонецЕсли;
	Если ЗначениеЗаполнено(ПараметрНомерСтроки2) Тогда
		Если мСтароеВыделение = Неопределено Тогда
			мСтароеВыделение = мОболочкаРедактора.НоваяСтруктураДвумерногоВыделения();
		КонецЕсли;
		мСтароеВыделение.НачальнаяСтрока = ПараметрНомерСтроки2;
		мСтароеВыделение.КонечнаяСтрока = ПараметрНомерСтроки2;
		мСтароеВыделение.КонечнаяКолонка = 100;
		ПараметрНомерСтроки2 = 0;
		мЛиСтараяСторонаЛевая = Ложь;
	КонецЕсли;
	Если мЛиСтараяСторонаЛевая Тогда
		АктивироватьСторону1();
	Иначе
		АктивироватьСторону2();
	КонецЕсли;
	Если мСтароеВыделение <> Неопределено Тогда
		мОболочкаРедактора.УстановитьВыделениеДвумерное(мСтароеВыделение, Истина);
		Если Не мЛиСтараяСторонаЛевая Тогда
			СоответствиеПозиций = РедакторHTML.editor.getDiffLineInformationForModified(мСтароеВыделение.КонечнаяСтрока);
			Если СоответствиеПозиций <> Неопределено Тогда
				АктивироватьСторону1();
				мСтароеВыделение.НачальнаяСтрока = СоответствиеПозиций.equivalentLineNumber;
				мСтароеВыделение.КонечнаяСтрока = мСтароеВыделение.НачальнаяСтрока;
				мОболочкаРедактора.УстановитьВыделениеДвумерное(мСтароеВыделение);
				АктивироватьСторону2();
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	СтруктураОтличий.Очистить();
	ОбновитьСравнениеТекущихСтрок();
	Если ПоБлокам Или КодЯзыкаПрограммы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	СписокОтличий = РедакторHTML.getDifferences(); // Массив Из см. НовыйЭлементОтличия
	Если СписокОтличий = Неопределено Тогда
		// Ошибка в коде редактора https://github.com/salexdv/bsl_console/issues/362
		ирОбщий.СообщитьЛкс("Не удалось получить изменные фрагменты текстов", СтатусСообщения.Внимание);
		Возврат;
	КонецЕсли;
	Если КодЯзыкаПрограммы = 0 Тогда
		ЗаполнитьНомераСтрокМетодов(мПолеТекстаПрограммы1);
		ЗаполнитьНомераСтрокМетодов(мПолеТекстаПрограммы2);
	Иначе
		ЗаполнитьНомераСтрокЗапросов(мПолеТекстаПрограммы1);
		ЗаполнитьНомераСтрокЗапросов(мПолеТекстаПрограммы2);
	КонецЕсли;
	Для Каждого СписокЭлемент Из СписокОтличий Цикл
		СтрокаТаблицы = СтруктураОтличий.Добавить();
		СтрокаТаблицы.НомерСтрокиНачало1 = СписокЭлемент.originalStartLineNumber;
		СтрокаТаблицы.НомерСтрокиКонец1 = СписокЭлемент.originalEndLineNumber;
		СтрокаТаблицы.НомерСтрокиНачало2 = СписокЭлемент.modifiedStartLineNumber;
		СтрокаТаблицы.НомерСтрокиКонец2 = СписокЭлемент.modifiedEndLineNumber;
		Если КодЯзыкаПрограммы = 0 Тогда
			Имена1 = ПокрытиеОтличиемМетоды(мПолеТекстаПрограммы1, СтрокаТаблицы.НомерСтрокиНачало1, СтрокаТаблицы.НомерСтрокиКонец1);
			Имена2 = ПокрытиеОтличиемМетоды(мПолеТекстаПрограммы2, СтрокаТаблицы.НомерСтрокиНачало2, СтрокаТаблицы.НомерСтрокиКонец2);
		Иначе
			Имена1 = ПокрытиеОтличиемЗапросы(мПолеТекстаПрограммы1, СтрокаТаблицы.НомерСтрокиНачало1, СтрокаТаблицы.НомерСтрокиКонец1);
			Имена2 = ПокрытиеОтличиемЗапросы(мПолеТекстаПрограммы2, СтрокаТаблицы.НомерСтрокиНачало2, СтрокаТаблицы.НомерСтрокиКонец2);
		КонецЕсли;
		НоваяСтрокаТаблицы = СтрокаТаблицы;
		Для Каждого ЭлементСписка Из Имена1 Цикл
			Если НоваяСтрокаТаблицы = Неопределено Тогда
				НоваяСтрокаТаблицы = СтруктураОтличий.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрокаТаблицы, СтрокаТаблицы);
				Если ЭлементСписка.Значение <> Неопределено Тогда
					НоваяСтрокаТаблицы.НомерСтрокиНачало1 = ЭлементСписка.Значение.НомерСтрокиНачало;
				КонецЕсли;
			КонецЕсли;
			Если ЭлементСписка.Значение <> Неопределено Тогда
				НоваяСтрокаТаблицы.НомерСтрокиКонец1 = ЭлементСписка.Значение.НомерСтрокиКонец;
			КонецЕсли;
			НоваяСтрокаТаблицы.Блок = ЭлементСписка.Представление;
			НоваяСтрокаТаблицы.ТипОтличия = 1;
			НоваяСтрокаТаблицы = Неопределено;
		КонецЦикла;
		СтрокаТаблицы = СтруктураОтличий[СтруктураОтличий.Количество() - 1];
		Если ирОбщий.НайтиЭлементКоллекцииЛкс(Имена2, "Представление", СтрокаТаблицы.Блок) <> Неопределено Тогда
			НоваяСтрокаТаблицы = СтрокаТаблицы;
		Иначе
			// Блок удален и добавлен другой
			НоваяСтрокаТаблицы = Неопределено;
		КонецЕсли;
		Для Каждого ЭлементСписка Из Имена2 Цикл
			Если НоваяСтрокаТаблицы = Неопределено Тогда
				НоваяСтрокаТаблицы = СтруктураОтличий.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрокаТаблицы, СтрокаТаблицы);
			КонецЕсли;
			УдалитьНовуюСтроку = Ложь;
			Если ирОбщий.НайтиЭлементКоллекцииЛкс(Имена1, "Представление", ЭлементСписка.Представление) = Неопределено Тогда
				НоваяСтрокаТаблицы.ТипОтличия = 2;
				НоваяСтрокаТаблицы.Блок = ЭлементСписка.Представление;
				Если ЭлементСписка.Значение <> Неопределено Тогда
					НоваяСтрокаТаблицы.НомерСтрокиНачало2 = ЭлементСписка.Значение.НомерСтрокиНачало;
					НоваяСтрокаТаблицы.НомерСтрокиКонец2 = ЭлементСписка.Значение.НомерСтрокиКонец;
				КонецЕсли;
			ИначеЕсли ЭлементСписка.Представление = НоваяСтрокаТаблицы.Блок Тогда
				НоваяСтрокаТаблицы.ТипОтличия = 0;
				Если Ложь
					Или (Истина
						И СтруктураОтличий.Количество() > 1
						И СтруктураОтличий[СтруктураОтличий.Количество() - 2].Блок = НоваяСтрокаТаблицы.Блок
						И СтруктураОтличий[СтруктураОтличий.Количество() - 2].ТипОтличия = 0
						И НоваяСтрокаТаблицы.НомерСтрокиНачало1 - СтруктураОтличий[СтруктураОтличий.Количество() - 2].НомерСтрокиНачало1 < 5)
					Или (Истина
						И ПустаяСтрока(СписокЭлемент.modifiedText) 
						И НоваяСтрокаТаблицы.НомерСтрокиКонец2 = 0
						И ЭлементСписка.Значение <> Неопределено
						И ЭлементСписка.Значение.НомерСтрокиНачало = НоваяСтрокаТаблицы.НомерСтрокиНачало2)
				Тогда
					УдалитьНовуюСтроку = Истина;
				КонецЕсли;
			Иначе
				Если НоваяСтрокаТаблицы.ТипОтличия = 2 Тогда
					УдалитьНовуюСтроку = Истина;
				КонецЕсли;
			КонецЕсли;
			Если УдалитьНовуюСтроку И НоваяСтрокаТаблицы <> СтрокаТаблицы Тогда
				СтруктураОтличий.Удалить(НоваяСтрокаТаблицы);
			КонецЕсли;
			НоваяСтрокаТаблицы = Неопределено;
		КонецЦикла;
	КонецЦикла;
	ирОбщий.ОбновитьКопиюКолонкиВНижнемРегистреЛкс(СтруктураОтличий, "Блок");
	// Поиск перемещений
	Для Каждого СтруктураЭлемент Из СтруктураОтличий Цикл
		Если СтруктураЭлемент.ТипОтличия = 1 Тогда
			ПарныйТипОтличия = 2;
		ИначеЕсли СтруктураЭлемент.ТипОтличия = 2 Тогда
			ПарныйТипОтличия = 1;
		Иначе
			Продолжить;
		КонецЕсли;
		ПараметрыОтбора = Новый Структура;
		ПараметрыОтбора.Вставить("ТипОтличия", ПарныйТипОтличия);
		ПараметрыОтбора.Вставить("НБлок", СтруктураЭлемент.НБлок);
		СтруктураЭлемент.Перемещен = СтруктураОтличий.НайтиСтроки(ПараметрыОтбора).Количество() > 0;
	КонецЦикла;
	СортироватьСтруктуру();   
	ОбновитьТекущиеПути();
КонецПроцедуры

Процедура СортироватьСтруктуру() Экспорт
	Если ПорядокПоИмени Тогда
		СтруктураОтличий.Сортировать("Блок, НомерСтрокиНачало1, НомерСтрокиНачало2");
	Иначе
		СтруктураОтличий.Сортировать("НомерСтрокиНачало1, НомерСтрокиНачало2, Блок");
	КонецЕсли;
КонецПроцедуры

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

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

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

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

Функция ИмяЗапросаПакета(Знач ПакетЗапросов, Знач ИндексЗапроса) Экспорт
	ИмяЭлемента = ПакетЗапросов.Структура[ИндексЗапроса].Представление;
	Если ПустаяСтрока(ИмяЭлемента) Тогда
		ИмяЭлемента = "Запрос" + ИндексЗапроса;
	КонецЕсли;
	Возврат ИмяЭлемента;
КонецФункции

Процедура ДействияФормыСледующий(Кнопка = Неопределено)
	
	РедакторHTML().nextDiff();
	ОбновитьСравнениеТекущихСтрок();
	ОбновитьТекущиеПути();
	
КонецПроцедуры

Процедура ДействияФормыПредыдущий(Кнопка = Неопределено)
	
	РедакторHTML().previousDiff();
	ОбновитьСравнениеТекущихСтрок();
	ОбновитьТекущиеПути();

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

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

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

Процедура КПРедакторHTMLНайтиСледующееHTML(Кнопка)
	
	РедакторHTML().nextMatch();
	
КонецПроцедуры

Процедура КПРедакторHTMLНайтиПредыдущееHTML(Кнопка)
	
	РедакторHTML().previousMatch();

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

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

Процедура УчитыватьКрайнююПустотуПриИзменении(Элемент)
	ОбновитьСравнениеТекстов();
КонецПроцедуры

Процедура ПриПовторномОткрытии(СтандартнаяОбработка)
	//РедакторHTML = РедакторHTML();
	//Если РедакторHTML = Неопределено Тогда
	//	Возврат;
	//КонецЕсли;
	//РедакторHTML.updateText(Текст1);
	//ОбновитьСравнениеТекстов();
КонецПроцедуры

Процедура ДействияФормыСравнитьВVSCode(Кнопка)
	Если ВариантСинтаксиса = "ВстроенныйЯзык" Тогда
		РасширениеФайла = "bsl";
	Иначе
		РасширениеФайла = "txt";
	КонецЕсли;
	ИмяФайла1 = ПолучитьИмяВременногоФайла(РасширениеФайла);
	ИмяФайла2 = ПолучитьИмяВременногоФайла(РасширениеФайла);
	ирОбщий.ЗаписатьТекстВФайлЛкс(Текст1, ИмяФайла1);
	ирОбщий.ЗаписатьТекстВФайлЛкс(Текст2, ИмяФайла2);
	Команда = "code -d """+ ИмяФайла1 +""" "+ ИмяФайла2 + """";
	ирОбщий.ЗапуститьСкрытоеПриложениеИДождатьсяЗавершенияЛкс(Команда);
КонецПроцедуры

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

Процедура СкрытьОдинаковоеПриИзменении(Элемент)
	// Слишком старое ядро редактора
	//ОбновитьСравнениеТекстов();
КонецПроцедуры

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

Процедура АктивироватьСторону2() Экспорт
	РедакторHTML().editor.getModifiedEditor().focus();
КонецПроцедуры 

Процедура АктивироватьСторону1() Экспорт
	РедакторHTML().editor.getOriginalEditor().focus();
КонецПроцедуры 

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

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

Процедура ПорядокПоИмениПриИзменении(Элемент)
	СортироватьСтруктуру();
КонецПроцедуры

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
	ИзменитьСвернутостьПанельСтруктуры(Истина);
	ИзменитьСвернутостьСравнениеБлоков(Истина);
КонецПроцедуры

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

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

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

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

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

Процедура КПСтруктураСравнитьБлоки(Кнопка)
	Если ЭлементыФормы.СтруктураОтличий.ВыделенныеСтроки.Количество() <> 2 Тогда
		Возврат;
	КонецЕсли;
	СтрокаБлока1 = ЭлементыФормы.СтруктураОтличий.ВыделенныеСтроки[0];
	СтрокаБлока2 = ЭлементыФормы.СтруктураОтличий.ВыделенныеСтроки[1];
	ТекстБлока1 = ТекстБлока(СтрокаБлока1);
	ТекстБлока2 = ТекстБлока(СтрокаБлока2);
	ирКлиент.Сравнить2ЗначенияВФормеЛкс(ТекстБлока1, ТекстБлока2,, СтрокаБлока1.Блок, СтрокаБлока2.Блок,,,,, ВариантСинтаксиса);
КонецПроцедуры

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

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

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

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

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

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

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

Процедура СравнениеБлоковПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	ОформитьСтрокуПоТипуОтличия(ОформлениеСтроки, ДанныеСтроки);
	Если ДанныеСтроки.Экспорт1 = ДанныеСтроки.Экспорт2 Тогда
		ОформлениеСтроки.Ячейки.Экспорт2.УстановитьТекст("=");
	КонецЕсли;
	Если ДанныеСтроки.ПутьГруппировки1 = ДанныеСтроки.ПутьГруппировки2 Тогда
		ОформлениеСтроки.Ячейки.ПутьГруппировки2.УстановитьТекст("=");
	КонецЕсли;
	Если ДанныеСтроки.ПутьКомпиляции1 = ДанныеСтроки.ПутьКомпиляции2 Тогда
		ОформлениеСтроки.Ячейки.ПутьКомпиляции2.УстановитьТекст("=");
	КонецЕсли;
	Если ДанныеСтроки.Аннотация1 = ДанныеСтроки.Аннотация2 Тогда
		ОформлениеСтроки.Ячейки.Аннотация2.УстановитьТекст("=");
	КонецЕсли;
	Если ДанныеСтроки.Имя1 = ДанныеСтроки.Имя2 Тогда
		ОформлениеСтроки.Ячейки.Имя2.УстановитьТекст("=");
	КонецЕсли;
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
КонецПроцедуры

Процедура ОформитьСтрокуПоТипуОтличия(ОформлениеСтроки, ДанныеСтроки) Экспорт
	Если ДанныеСтроки.ТипОтличия = 1 Тогда
		ОформлениеСтроки.ЦветФона = ирОбщий.ЦветФонаОшибкиЛкс();
	ИначеЕсли ДанныеСтроки.ТипОтличия = 2 Тогда
		ОформлениеСтроки.ЦветФона = ирОбщий.ЦветФонаДобавленоЛкс();
	КонецЕсли;
КонецПроцедуры

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

Процедура ПараллельноПриИзменении(Элемент)
	РедакторHTML().setDiffSideBySideMode(Параллельно); 
КонецПроцедуры

Процедура ДействияФормыПрименить(Кнопка)
	Закрыть(Истина);
КонецПроцедуры

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

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирСравнениеТекстов.Форма.Форма");
#Если Сервер И Не Сервер Тогда
	мОболочкаРедактора = Обработки.ирОболочкаПолеТекста.Создать();
	мПолеТекстаПрограммы1 = Обработки.ирКлсПолеТекстаПрограммы.Создать();
	мПолеТекстаПрограммы2 = Обработки.ирКлсПолеТекстаПрограммы.Создать();
#КонецЕсли
ПорядокПоИмени = Истина;
Параллельно = Истина;
Текст1 = "1"; // Нужно чтобы установка вручную корректно работала
Текст2 = "2";
мРазрешитьАвтоПрокруткуТекста = Ложь;
