Перем мПлатформа;
Перем мПоследняяВыбраннаяТаблицаБД;
Перем мОтборПоРезультатуСравненияСтроки;
Перем мОтборПоРазличиямВКолонке;
Перем мРезультатыСравненияСтроки;

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

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

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

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

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

Процедура Файл1НачалоВыбора(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ПолучитьРезультатВыбораФайла(Элемент, "1");
	
КонецПроцедуры

Процедура Файл2НачалоВыбора(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ПолучитьРезультатВыбораФайла(Элемент, "2");
	
КонецПроцедуры

Функция ПолучитьРезультатВыбораФайла(ПолеВвода, НомерСтороны)
	
	Если ЭтотОбъект["ТипИсточника" + НомерСтороны] = "ТабличныйДокумент" Тогда
		СписокРасширений = Новый СписокЗначений;
		СписокРасширений.Добавить("mxl", "Табличный документ");
		СписокРасширений.Добавить("xls", "Лист Excel");
		СписокРасширений.Добавить("xlsx", "Лист Excel");
		СписокРасширений.Добавить("ods", "Open document");
		ПолноеИмяФайла = ирКлиент.ВыбратьФайлЛкс(, СписокРасширений,, ПолеВвода.Значение);
	Иначе
		ПолноеИмяФайла = ирКлиент.ВыбратьФайлЛкс(, "vt_", "Таблица значений", ПолеВвода.Значение);
	КонецЕсли; 
	Если ЗначениеЗаполнено(ПолноеИмяФайла) Тогда
		ирКлиент.ИнтерактивноЗаписатьВПолеВводаЛкс(ПолеВвода, ПолноеИмяФайла);
	КонецЕсли;
	
КонецФункции	

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

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

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

КонецФункции

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

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

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

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

КонецФункции

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

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

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

// открытие первого файла на просмотр
Процедура Файл1Открытие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ОткрытьФайлНаПросмотр(ИмяФайла1);
	
КонецПроцедуры

// открытие второго файла на просмотр
Процедура Файл2Открытие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ОткрытьФайлНаПросмотр(ИмяФайла2);
	
КонецПроцедуры

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

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

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

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

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

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

Процедура Таблица1Нажатие(Элемент = Неопределено, НомерСтроки = Неопределено)
	
	ОткрытьТаблицуИсточника("1", НомерСтроки);

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

Процедура УстановитьТипИсточникаТаблицаЗначений(НомерСтороны)
	
	ЭтотОбъект["ИмяФайла" + НомерСтороны] = "";
	ЭтотОбъект["ТипИсточника" + НомерСтороны] = "ТаблицаЗначений";
	НастроитьЭлементыФормы();

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

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

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

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

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

Процедура КоманднаяПанельВыводимыеКолонкиФайл1Очистить(Кнопка)
	
	Для Каждого СтрокаСопоставления Из КолонкиТаблица1 Цикл
		СопоставитьКолонку(СтрокаСопоставления);
	КонецЦикла;
	
КонецПроцедуры

Процедура КнопкаОбновитьФайл1Нажатие(Элемент)
	
	ОбновитьДанныеТаблицы("1");
	
КонецПроцедуры

Процедура КнопкаОбновитьФайл2Нажатие(Элемент)
	
	ОбновитьДанныеТаблицы("2");

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

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

Процедура КоманднаяПанельВыводимыеКолонкиФайл1ПодобратьКлючевыеКолонки(Кнопка)
	
	ПодобратьКлючевыеИСравниваемыеКолонки();
	
КонецПроцедуры

Процедура Файл1Очистка(Элемент = Неопределено, СтандартнаяОбработка = Истина)
	
	//ЭтотОбъект.ЗагрузкаТабличныхДанных1 = Неопределено;
	НастроитьЭлементыФормы();

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

Процедура Файл2Очистка(Элемент, СтандартнаяОбработка)
	
	//ЭтотОбъект.ЗагрузкаТабличныхДанных2 = Неопределено;
	НастроитьЭлементыФормы();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

Процедура ОформитьЯчейку(Ячейка, Знач ЦветФона, Знач ЦветТекста)
	
	Ячейка.ЦветФона = ЦветФона;
	Ячейка.ЦветТекста = ЦветТекста;

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

Процедура СкрытьЯчейкиЗаголовковГруппКолонокСтороны(Знач ОформлениеСтроки, НомерСтороны)
	
	СкрытьЯчейкуЗаголовкаГруппыКолонокСтороны(мИмяГруппыСравниваемыхКолонок, НомерСтороны, ОформлениеСтроки);
	СкрытьЯчейкуЗаголовкаГруппыКолонокСтороны(мИмяГруппыНесравниваемыхКолонок, НомерСтороны, ОформлениеСтроки);

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

Процедура СкрытьЯчейкуЗаголовкаГруппыКолонокСтороны(Знач ИмяГруппыКолонок, Знач НомерСтороны = "", Знач ОформлениеСтроки)
	
	Ячейка = ОформлениеСтроки.Ячейки.Найти(ИмяГруппыКолонок + НомерСтороны);
	Если Ячейка <> Неопределено Тогда
		Ячейка.Видимость = Ложь;
	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура НастройкаКонвертации1Нажатие(Элемент)
	
	ОбновитьДанныеТаблицы("1", Истина);
	
КонецПроцедуры

Процедура НастройкаКонвертации2Нажатие(Элемент)
	
	ОбновитьДанныеТаблицы("2", Истина);

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

Процедура ВыбранныйРезультатПриАктивизацииЯчейки(Элемент)
	
	ЭлементыФормы.РезультатСравнения.ОбновитьСтроки(ЭлементыФормы.РезультатСравнения.ТекущаяСтрока);
	
КонецПроцедуры

Процедура КолонкиТаблица1ПриИзмененииФлажка(Элемент, Колонка)
	
	ирКлиент.ТабличноеПолеПриИзмененииФлажкаЛкс(ЭтаФорма, Элемент, Колонка);
	
КонецПроцедуры

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

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

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

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

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

Процедура СкопироватьНастройкиКонвертацииНажатие(Элемент)
	
	Если НастройкаЗагрузки1 <> Неопределено Тогда
		ЭтотОбъект.НастройкаЗагрузки2 = НастройкаЗагрузки1; // Опасно
	КонецЕсли; 
	
КонецПроцедуры

Процедура НадписьНеуникальные2Нажатие(Элемент)
	
	ПоказатьНеуникальныеКлючи("2");
	
КонецПроцедуры

Процедура НадписьНеуникальные1Нажатие(Элемент)
	
	ПоказатьНеуникальныеКлючи("1");
	
КонецПроцедуры

Процедура ПоказатьНеуникальныеКлючи(Знач НомерСтороны)
	
	СтрокаКлючаИсточника = "";
	КлючиНеуникальные = ВыявитьНеуникальныеКлючи(НомерСтороны, СтрокаКлючаИсточника);
	ТаблицаЛок = ЭтотОбъект["Таблица" + НомерСтороны];
	ФормаТаблицы = мПлатформа.ПолучитьФорму("ТаблицаЗначений", , ТаблицаЛок);
	ФормаТаблицы.УстановитьРедактируемоеЗначение(ТаблицаЛок);
	ФормаТаблицы.ПараметрИменаКлючевыхКолонок = СтрокаКлючаИсточника;
	ФормаТаблицы.ОткрытьМодально();

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

Процедура КолонкиТаблица2ПриИзмененииФлажка(Элемент, Колонка)
	
	ирКлиент.ТабличноеПолеПриИзмененииФлажкаЛкс(ЭтаФорма, Элемент, Колонка);

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

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

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

Процедура ПослеИзмененияКлючевыхКолонок()
	
	ВыявитьНеуникальныеКлючи("1");
	ВыявитьНеуникальныеКлючи("2");
	НастроитьЭлементыФормы();

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

Процедура КолонкиТаблица1ПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);

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

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

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

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

Процедура ТипИсточника1ПриИзменении(Элемент = Неопределено)
	
	ИмяФайла1 = "";
	НастроитьЭлементыФормы();
	
КонецПроцедуры

Процедура ТипИсточника2ПриИзменении(Элемент = Неопределено)
	
	ИмяФайла2 = "";
	НастроитьЭлементыФормы();
	
КонецПроцедуры

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

Процедура УстановитьСтандартныеЦветаНажатие(Элемент)
	
	УстановитьСтандартныеЦвета();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ПанельРежимаПриСменеСтраницы(Элемент = Неопределено, ТекущаяСтраница = Неопределено)
	
	ПриИзмененииРежимаСравнения(Истина);
	НастроитьЭлементыФормы();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КолонкиТаблица1Перетаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка)
	СтандартнаяОбработка = ПараметрыПеретаскивания.Действие <> ДействиеПеретаскивания.Копирование;
КонецПроцедуры

Процедура КолонкиТаблица1ПередУдалением(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

Процедура КолонкиТаблица1ПередНачаломДобавления(Элемент, Отказ, Копирование)
	Отказ = Истина;
КонецПроцедуры

Процедура КолонкиТаблица1Выбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)

	Если Колонка = ЭлементыФормы.КолонкиТаблица1.Колонки.ОписаниеТипов Тогда
		ирКлиент.ЯчейкаТабличногоПоляРасширенногоЗначения_ВыборЛкс(ЭтаФорма, Элемент, СтандартнаяОбработка, Таблица1.Колонки[ВыбраннаяСтрока.ИмяКолонки].ТипЗначения, Ложь);
	ИначеЕсли Колонка = ЭлементыФормы.КолонкиТаблица1.Колонки.ОписаниеТипов2 Тогда
		ирКлиент.ЯчейкаТабличногоПоляРасширенногоЗначения_ВыборЛкс(ЭтаФорма, Элемент, СтандартнаяОбработка, Таблица2.Колонки[ВыбраннаяСтрока.ИмяКолонки2].ТипЗначения, Ложь);
	КонецЕсли;
	
КонецПроцедуры

Процедура КолонкиТаблица2Выбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	Если Колонка = ЭлементыФормы.КолонкиТаблица2.Колонки.ОписаниеТипов Тогда
		ирКлиент.ЯчейкаТабличногоПоляРасширенногоЗначения_ВыборЛкс(ЭтаФорма, Элемент, СтандартнаяОбработка, Таблица1.Колонки[ВыбраннаяСтрока.ИмяКолонки].ТипЗначения, Ложь);
	КонецЕсли;
КонецПроцедуры

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