RDT1C/DataProcessors/ирСравнениеТаблиц/Ext/ObjectModule.bsl
Администратор 86d62034f2 Добавлен инструмент "Сравнение таблиц"
Загрузка табличных данных
        +Редактирование и хранение алгоритмов переделано на новый механизм с поддержкой внутренних параметров
        +При заполнении колонок таблицы значений по табличному документу и конвертации значений теперь учитываются расшифровки ячеек
    Таблица значений
        +Команда "Получить"/"из табличного документа" теперь открывает инструмент "Загрузка табличных данных"
        +Добавлена команда "Передать"/"в сравнитель"
    Табличный документ
        +Добавлена команда "Загрузить в таблицу значений"
    Общее
        *Размеры логотипа подсистемы изменены на 24x24
        *Исправлена запуск приложения из управляемой формы с флажком "Подключиться к отладчику", который мог некорректно находить текущие параметры http отладки
    Конструктор запроса
        +Для таблицы выбранных полей включено множественное выделение строк
        *Исправлена свежая проблема не заполнения параметров по тексту запроса
    Консоль запросов
        *При активизации строки дерева запроса теперь выполняется поиск элемента пакетного результата только при включенной панели пакета
        *Исправлены свежие проблемы накопления и не заполнения параметров при работе с конструктором запросов ИР
        +Для таблицы параметров добавлена команда "Заменить на ЗНАЧЕНИЕ()"
    Портативный
        *Устранено дублирование баз с квадратными скобками в списке пользователя при сохранении в окне "Список инструментов и общие настройки"
    Подбор и обработка объектов
        *Исправлена ошибка обработки следующего объекта после отображения модального окна при обработке текущего объекта
2017-07-24 01:00:15 +03:00

636 lines
46 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
#Если Клиент Тогда
Перем ПризнакРавно Экспорт; // признаки сравнения
Перем ПризнакНеРавно Экспорт;
Перем ПризнакТолько1 Экспорт;
Перем ПризнакТолько2 Экспорт;
Перем ВыводитьРазницу Экспорт; // флаг, выводить ли разницу числовых сравниваемых колонок
Перем ВсегоРазличий Экспорт; // количество найденных различий при сравнении файлов
Перем ЗагрузкаТабличныхДанных1 Экспорт;
Перем ЗагрузкаТабличныхДанных2 Экспорт;
Перем мИмяГруппыКлючевыхКолонок Экспорт;
Перем мИмяГруппыСравниваемыхКолонок Экспорт;
Перем мИмяГруппыНесравниваемыхКолонок Экспорт;
Перем мИмяГруппыРазностныхКолонок Экспорт;
Перем мИмяКолонкиРезультатаСравнения Экспорт;
Перем мИмяКолонкиНомераСтрокиРезультата Экспорт;
Перем РезультатыСравненияСтрок Экспорт;
Перем СравниваемыеКолонкиРезультата Экспорт;
Перем СтруктураКолонокРезультата Экспорт;
// сравнение файлов
Функция ВыполнитьСравнение(ТабличноеПолеРезультата) Экспорт
Если Не ОбновитьДанныеТаблицы("1") Тогда
Возврат Ложь;
КонецЕсли;
Если Не ОбновитьДанныеТаблицы("2") Тогда
Возврат Ложь;
КонецЕсли;
Результат = СравнитьТаблицы(ТабличноеПолеРезультата);
Возврат Результат;
КонецФункции
Функция ОбновитьДанныеТаблицы(Знач НомерСтороны, Интерактивно = Ложь, СброситьНастройки = Ложь) Экспорт
ИмяФайла = ЭтотОбъект["ИмяФайла" + НомерСтороны];
Если ЗначениеЗаполнено(ИмяФайла) Тогда
Файл = Новый Файл(ИмяФайла);
Если ирОбщий.СтрокиРавныЛкс(Файл.Расширение, ".vt_") Тогда
Таблица = ирОбщий.ПрочитатьЗначениеИзФайлаСКонтролемПотерьЛкс(Файл.ПолноеИмя);
Иначе
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(Файл.ПолноеИмя);
ЗагрузкаТабличныхДанных = ЗагрузчикТабличныхДанных(НомерСтороны);
#Если Сервер И Не Сервер Тогда
ЗагрузкаТабличныхДанных = Обработки.ирЗагрузкаТабличныхДанных.Создать();
#КонецЕсли
ФормаЗагрузки = ЗагрузкаТабличныхДанных.ПолучитьФорму(); // Чтобы создались колонки в реквизитах объекта
ЗагрузкаТабличныхДанных.ТабличныйДокумент = ТабличныйДокумент;
НастройкаЗагрузки = Неопределено;
Если Не СброситьНастройки Тогда
НастройкаЗагрузки = ЭтотОбъект["НастройкаЗагрузки" + НомерСтороны];
КонецЕсли;
Если НастройкаЗагрузки <> Неопределено Тогда
ЗагрузкаТабличныхДанных.ЗагрузитьНастройку(НастройкаЗагрузки);
Иначе
Интерактивно = Истина;
КонецЕсли;
ЗагрузкаТабличныхДанных.ОбновитьКолонкиТаблицыЗначений(Истина, Ложь);
ЗагрузкаТабличныхДанных.ОбновитьСопоставлениеКолонокТЗ();
ЗагрузкаТабличныхДанных.СопоставлениеКолонокТЗЗаполнить();
Если Интерактивно Тогда
ФормаЗагрузки.СинхронизироватьРеквизитыОбъекта(Ложь);
ФормаЗагрузки.РежимРедактора = Истина;
РезультатФормы = ФормаЗагрузки.ОткрытьМодально();
Если РезультатФормы = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
ЭтотОбъект["НастройкаЗагрузки" + НомерСтороны] = ЗагрузкаТабличныхДанных.ПолучитьНастройку();
КонецЕсли;
ЗагрузкаТабличныхДанных.ЗагрузитьВТаблицуЗначений();
Таблица = ЗагрузкаТабличныхДанных.ТаблицаЗначений;
КонецЕсли;
ЭтотОбъект["Таблица" + НомерСтороны] = Таблица;
КонецЕсли;
ОбновитьСопоставлениеКолонок();
Таблица = ЭтотОбъект["Таблица" + НомерСтороны];
Если Таблица.Количество() = 0 Тогда
Сообщить("Таблица " + НомерСтороны + " не содержит данных");
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Функция ЗагрузчикТабличныхДанных(Знач НомерСтороны) Экспорт
ЗагрузкаТабличныхДанных = ЭтотОбъект["ЗагрузкаТабличныхДанных" + НомерСтороны];
Если ЗагрузкаТабличныхДанных = Неопределено Тогда
ЗагрузкаТабличныхДанных = ирОбщий.ПолучитьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирЗагрузкаТабличныхДанных");
ЭтотОбъект["ЗагрузкаТабличныхДанных" + НомерСтороны] = ЗагрузкаТабличныхДанных;
КонецЕсли;
Возврат ЗагрузкаТабличныхДанных;
КонецФункции
Процедура ОбновитьСопоставлениеКолонок() Экспорт
КопияСопоставления1 = КолонкиТаблица1.Выгрузить();
КопияСопоставления2 = КолонкиТаблица2.Выгрузить();
КолонкиТаблица2.Очистить();
Для Каждого Колонка Из Таблица2.Колонки Цикл
Если Истина
И ЗагрузкаТабличныхДанных2 <> Неопределено
И ирОбщий.СтрокиРавныЛкс(Колонка.Имя, ЗагрузкаТабличныхДанных2.мИмяКолонкиНомерСтроки)
Тогда
Продолжить;
КонецЕсли;
СопоставлениеКолонки = КолонкиТаблица2.Добавить();
СопоставлениеКолонки.Выводить = Истина;
СопоставлениеКолонки.ИмяКолонки = Колонка.Имя;
СопоставлениеКолонки.СинонимКолонки = Колонка.Заголовок;
СопоставлениеКолонки.ОписаниеТипов = Колонка.ТипЗначения;
КонецЦикла;
КолонкиТаблица1.Очистить();
Для Каждого Колонка Из Таблица1.Колонки Цикл
СопоставлениеКолонки = КолонкиТаблица1.Добавить();
СопоставлениеКолонки.Выводить = Истина;
СопоставлениеКолонки.ИмяКолонки = Колонка.Имя;
Если Истина
И ЗагрузкаТабличныхДанных1 <> Неопределено
И ирОбщий.СтрокиРавныЛкс(Колонка.Имя, ЗагрузкаТабличныхДанных1.мИмяКолонкиНомерСтроки)
Тогда
СопоставлениеКолонки.Сравнивать = Ложь;
КонецЕсли;
СтараяСтрока = КопияСопоставления1.Найти(СопоставлениеКолонки.ИмяКолонки, "ИмяКолонки");
Если СтараяСтрока <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(СопоставлениеКолонки, СтараяСтрока);
Колонка2 = Неопределено;
Если ЗначениеЗаполнено(СопоставлениеКолонки.ИмяКолонки2) Тогда
Колонка2 = Таблица2.Колонки.Найти(СопоставлениеКолонки.ИмяКолонки2);
КонецЕсли;
СопоставитьКолонку(СопоставлениеКолонки, Колонка2);
КонецЕсли;
СопоставлениеКолонки.СинонимКолонки = Колонка.Заголовок;
СопоставлениеКолонки.ОписаниеТипов = Колонка.ТипЗначения;
СопоставлениеКолонки.Числовая = Колонка.ТипЗначения.СодержитТип(Тип("Число"));
КонецЦикла;
ЭтотОбъект.КоличествоСтрок1 = Таблица1.Количество();
ЭтотОбъект.КоличествоСтрок2 = Таблица2.Количество();
КонецПроцедуры
Процедура ЗаполнитьСопоставлениеКолонок(ПоИменам = Ложь) Экспорт
Для Каждого Колонка Из Таблица2.Колонки Цикл
Если Истина
И ЗагрузкаТабличныхДанных2 <> Неопределено
И ирОбщий.СтрокиРавныЛкс(Колонка.Имя, ЗагрузкаТабличныхДанных2.мИмяКолонкиНомерСтроки)
Тогда
Продолжить;
КонецЕсли;
СтруктураОтбора = Новый Структура("СинонимКолонки2", "");
СтрокиСопоставления = КолонкиТаблица1.НайтиСтроки(СтруктураОтбора);
СтрокаИмен = "";
Для Каждого СтрокаСопоставления Из СтрокиСопоставления Цикл
Если Не ирОбщий.ОписаниеТипов1ВходитВОписаниеТипов2Лкс(Колонка.ТипЗначения, Таблица1.Колонки[СтрокаСопоставления.ИмяКолонки].ТипЗначения) Тогда
Продолжить;
КонецЕсли;
Если Ложь
Или ирОбщий.СтрокиРавныЛкс(СтрокаСопоставления.ИмяКолонки, Колонка.Имя)
Или ирОбщий.СтрокиРавныЛкс(СтрокаСопоставления.СинонимКолонки, Колонка.Заголовок)
Тогда
СопоставитьКолонку(СтрокаСопоставления, Колонка);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ПодобратьКлючевыеИСравниваемыеКолонки() Экспорт
Уникальность1Достигнута = Ложь;
Уникальность2Достигнута = Ложь;
СтрокаКлюча1 = "";
СтрокаКлюча2 = "";
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КолонкиТаблица1.Количество(), "Подбор ключа таблиц");
КолонкиТаблица1.Сортировать("Числовая");
Для Каждого СтрокаСопоставления Из КолонкиТаблица1 Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
Если СтрокаСопоставления.ИмяКолонки2 = "" Тогда
Продолжить;
КонецЕсли;
ДобавитьКолонкуВСтрокуКлюча(СтрокаСопоставления.ИмяКолонки, СтрокаКлюча1);
ДобавитьКолонкуВСтрокуКлюча(СтрокаСопоставления.ИмяКолонки2, СтрокаКлюча2);
Если Не ПроверитьУникальностьКлючаТаблицы(Таблица1, СтрокаКлюча1) Тогда
СтрокаСопоставления.Ключевая = Истина;
СтрокаСопоставления.Выводить = Истина;
Продолжить;
Иначе
Уникальность1Достигнута = Истина;
КонецЕсли;
Если Не ПроверитьУникальностьКлючаТаблицы(Таблица2, СтрокаКлюча2) Тогда
СтрокаСопоставления.Ключевая = Истина;
СтрокаСопоставления.Выводить = Истина;
Продолжить;
Иначе
Уникальность2Достигнута = Истина;
КонецЕсли;
Прервать;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
Если Истина
И Не Уникальность1Достигнута
И Таблица1.Количество() > 0
И ЗначениеЗаполнено(СтрокаКлюча1)
Тогда
Сообщить("В таблице 1 имеются неуникальные строки по сопоставленным колонкам (" + СтрокаКлюча1 + ")");
КонецЕсли;
Если Истина
И Не Уникальность2Достигнута
И Таблица2.Количество() > 0
И ЗначениеЗаполнено(СтрокаКлюча2)
Тогда
Сообщить("В таблице 2 имеются неуникальные строки по сопоставленным колонкам (" + СтрокаКлюча2 + ")");
КонецЕсли;
Для Каждого СтрокаСопоставления Из КолонкиТаблица1 Цикл
Если СтрокаСопоставления.ИмяКолонки2 = "" Тогда
Продолжить;
КонецЕсли;
СтрокаСопоставления.Сравнивать = Не СтрокаСопоставления.Ключевая;
КонецЦикла;
КонецПроцедуры
Функция ПроверитьУникальностьКлючаТаблицы(Таблица, СтрокаКлюча)
КопияТаблицы = Таблица.Скопировать(, СтрокаКлюча);
КопияТаблицы.Свернуть(СтрокаКлюча);
ТолькоУникальные = КопияТаблицы.Количество() = Таблица.Количество();
Возврат ТолькоУникальные;
КонецФункции
Процедура ДобавитьКолонкуВСтрокуКлюча(Знач ИмяДобавляемойКолонки, СтрокаКлюча)
Если СтрокаКлюча <> "" Тогда
СтрокаКлюча = СтрокаКлюча + ",";
КонецЕсли;
СтрокаКлюча = СтрокаКлюча + ИмяДобавляемойКолонки;
КонецПроцедуры
Процедура СопоставитьКолонку(Знач СтрокаСопоставления, Знач Колонка = Неопределено) Экспорт
Если Колонка <> Неопределено Тогда
СтрокаКолонки2 = КолонкиТаблица2.Найти(Колонка.Имя, "ИмяКолонки");
Если СтрокаКолонки2 <> Неопределено Тогда
СтрокаКолонки2.ИмяКолонки1 = СтрокаСопоставления.ИмяКолонки;
СтрокаКолонки2.СинонимКолонки1 = СтрокаСопоставления.СинонимКолонки;
КонецЕсли;
СтрокаСопоставления.ИмяКолонки2 = Колонка.Имя;
СтрокаСопоставления.СинонимКолонки2 = Колонка.Заголовок;
СтрокаСопоставления.ОписаниеТипов2 = Колонка.ТипЗначения;
Иначе
СтрокаКолонки2 = КолонкиТаблица2.Найти(СтрокаСопоставления.ИмяКолонки2, "ИмяКолонки");
Если СтрокаКолонки2 <> Неопределено Тогда
СтрокаКолонки2.ИмяКолонки1 = "";
СтрокаКолонки2.СинонимКолонки1 = "";
КонецЕсли;
СтрокаСопоставления.ИмяКолонки2 = "";
СтрокаСопоставления.СинонимКолонки2 = "";
СтрокаСопоставления.ОписаниеТипов2 = Неопределено;
КонецЕсли;
КонецПроцедуры
Функция Сравнить2СтрокиПоКолонкам(Знач ОтборКолонок, Знач Строка1, Знач Строка2)
ЗначенияЯчеекРавны = Истина;
КолонкиСопоставления = КолонкиТаблица1.НайтиСтроки(ОтборКолонок);
Для Каждого СтрокаСопоставления Из КолонкиСопоставления Цикл
Если Не СравнитьЗначенияЯчеек(СтрокаСопоставления.ИмяКолонки, СтрокаСопоставления.ИмяКолонки2, Строка1, Строка2) Тогда
ЗначенияЯчеекРавны = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ЗначенияЯчеекРавны;
КонецФункции
Функция СравнитьЗначенияЯчеек(Знач ИмяКолонки1, Знач ИмяКолонки2, Знач Строка1, Знач Строка2) Экспорт
ЗначенияЯчеекРавны = Истина;
ЛевоеЗначение = Строка1[ИмяКолонки1];
ПравоеЗначение = Строка2[ИмяКолонки2];
// регистронезависимое сравнение
Если НеУчитыватьРегистр Тогда
// сравнение без учета регистра имеет смысл только для строк
Если ТипЗнч(ЛевоеЗначение) = Тип("Строка") И ТипЗнч(ПравоеЗначение) = Тип("Строка") Тогда
Если ВРег(ЛевоеЗначение) <> ВРег(ПравоеЗначение) Тогда
ЗначенияЯчеекРавны = Ложь;
КонецЕсли;
Иначе
Если ЛевоеЗначение <> ПравоеЗначение Тогда
ЗначенияЯчеекРавны = Ложь;
КонецЕсли;
КонецЕсли;
// регистрозависимое сравнение
Иначе
Если ЛевоеЗначение <> ПравоеЗначение Тогда
ЗначенияЯчеекРавны = Ложь;
КонецЕсли;
КонецЕсли;
Возврат ЗначенияЯчеекРавны;
КонецФункции
Функция СравнитьТаблицы(ТабличноеПолеРезультата)
Перем Таблица2;
// первая таблица - основная, во второй ищем подходящие строки
Таблица2 = ЭтотОбъект.Таблица2.Скопировать();
СоздатьКолонкиРезультата(ТабличноеПолеРезультата);
ВсегоРазличий = 0;
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Таблица1.Количество());
Для i = 0 По Таблица1.Количество() - 1 Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
СтрокаРезультата = Неопределено;
Строка1 = Таблица1[i];
Отбор = Новый Структура;
Для Каждого СтрокаСравнения Из КолонкиТаблица1.НайтиСтроки(Новый Структура("Ключевая", Истина)) Цикл
Отбор.Вставить(СтрокаСравнения.ИмяКолонки2, Строка1[СтрокаСравнения.ИмяКолонки]);
КонецЦикла;
Если Отбор.Количество() > 0 Тогда
Строки2 = Таблица2.НайтиСтроки(Отбор);
Иначе
Строки2 = Таблица2;
КонецЕсли;
НайденоСтрок = Строки2.Количество();
// вариант 1. Найдена 1 и более строка
Если НайденоСтрок >= 1 Тогда
Строка2 = Строки2[0];
Если Сравнить2СтрокиПоКолонкам(Новый Структура("Сравнивать, Ключевая", Истина, Ложь), Строка1, Строка2) Тогда
Признак = ПризнакРавно;
Иначе
Признак = ПризнакНеРавно;
КонецЕсли;
Если Признак <> ПризнакРавно Или Не НеВыводитьОдинаковыеСтроки Тогда
ВывестиСтрокуРезультата(СтрокаРезультата, Строка1, "1");
ВывестиСтрокуРезультата(СтрокаРезультата, Строка2, "2");
Если ВыводитьРазницуЧисловыхКолонокСравнения Тогда
ВывестиРазницуЧисел(СтрокаРезультата, Признак);
КонецЕсли;
КонецЕсли;
Если Признак <> ПризнакРавно Тогда
ВсегоРазличий = ВсегоРазличий + 1;
КонецЕсли;
// удаляем строку из второй таблицы, чтоб не мешалась дальше
Таблица2.Удалить(Строка2);
ИначеЕсли НайденоСтрок = 0 Тогда
ВывестиСтрокуРезультата(СтрокаРезультата, Строка1, "1");
Признак = ПризнакТолько1;
Если ВыводитьРазницуЧисловыхКолонокСравнения Тогда
ВывестиРазницуЧисел(СтрокаРезультата, Признак);
КонецЕсли;
ВсегоРазличий = ВсегоРазличий + 1;
КонецЕсли;
Если СтрокаРезультата <> Неопределено Тогда
СтрокаРезультата[мИмяКолонкиРезультатаСравнения] = Признак;
КонецЕсли;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
Признак = ПризнакТолько2;
// если во второй таблице остались строки, выводим их в конце
Для Каждого Строка2 Из Таблица2 Цикл
СтрокаРезультата = Неопределено;
ВывестиСтрокуРезультата(СтрокаРезультата, Строка2, "2");
СтрокаРезультата[мИмяКолонкиРезультатаСравнения] = Признак;
Если ВыводитьРазницуЧисловыхКолонокСравнения Тогда
ВывестиРазницуЧисел(СтрокаРезультата, Признак);
КонецЕсли;
ВсегоРазличий = ВсегоРазличий + 1;
КонецЦикла;
Возврат ВсегоРазличий = 0;
КонецФункции
Процедура СоздатьКолонкиРезультата(ТабличноеПолеРезультата)
ЭтотОбъект.СравниваемыеКолонкиРезультата = Новый Массив;
ЭтотОбъект.СтруктураКолонокРезультата = Новый Структура;
ЭтотОбъект.ВыбранныйРезультат = Новый ТаблицаЗначений;
ЭтотОбъект.РезультатСравнения = Новый ТаблицаЗначений;
ТабличноеПолеРезультата.Колонки.Очистить();
РезультатСравнения.Колонки.Добавить(мИмяКолонкиРезультатаСравнения, Новый ОписаниеТипов("Число"));
РезультатСравнения.Колонки.Добавить(мИмяКолонкиНомераСтрокиРезультата, Новый ОписаниеТипов("Число"));
КолонкаТабличногоПоля = ТабличноеПолеРезультата.Колонки.Добавить(мИмяКолонкиРезультатаСравнения);
КолонкаТабличногоПоля.Данные = мИмяКолонкиРезультатаСравнения;
КолонкаТабличногоПоля.ТекстШапки = "Результат сравнения";
КолонкиГруппы = КолонкиТаблица1.НайтиСтроки(Новый Структура("Ключевая", Истина));
ДобавитьКолонкиТаблицыГруппыРезультата(КолонкиГруппы, "1");
ДобавитьКолонкиТабличногоПоляГруппыРезультата(КолонкиГруппы, мИмяГруппыКлючевыхКолонок, "Ключевые колонки", , "1", "1", ТабличноеПолеРезультата);
СоздатьКолонкиСтороныРезультата("1", ТабличноеПолеРезультата);
СоздатьКолонкиСтороныРезультата("2", ТабличноеПолеРезультата);
Если ВыводитьРазницуЧисловыхКолонокСравнения Тогда
КолонкиГруппы = КолонкиТаблица1.НайтиСтроки(Новый Структура("Числовая, Сравнивать", Истина, Истина));
Для Каждого КолонкаГруппы Из КолонкиГруппы Цикл
КолонкаИсходнойТаблицы = Таблица1.Колонки[КолонкаГруппы.ИмяКолонки];
ДобавитьКолонкуТаблицыРезультата(КолонкаГруппы.ИмяКолонки, КолонкаГруппы.ИмяКолонки, КолонкаИсходнойТаблицы, "Разность");
КонецЦикла;
ДобавитьКолонкиТабличногоПоляГруппыРезультата(КолонкиГруппы, мИмяГруппыРазностныхКолонок, "Разность числовых колонок", , "Разность", "1", ТабличноеПолеРезультата);
КонецЕсли;
ЭтотОбъект.ВыбранныйРезультат = РезультатСравнения;
ирОбщий.НастроитьДобавленныеКолонкиТабличногоПоляЛкс(ТабличноеПолеРезультата,,,, Истина);
КонецПроцедуры
Процедура СоздатьКолонкиСтороныРезультата(Знач НомерСтороны, Знач ТабличноеПолеРезультата)
// Используем имена сопоставленных колонок от первой стороны
КолонкиГруппы = КолонкиТаблица1.НайтиСтроки(Новый Структура("Ключевая", Ложь));
ДобавитьКолонкиТаблицыГруппыРезультата(КолонкиГруппы, НомерСтороны);
КолонкиГруппы = КолонкиТаблица1.НайтиСтроки(Новый Структура("Ключевая, Сравнивать", Ложь, Истина));
ДобавитьКолонкиТабличногоПоляГруппыРезультата(КолонкиГруппы, мИмяГруппыСравниваемыхКолонок, "Сравниваемые колонки", НомерСтороны, НомерСтороны, НомерСтороны, ТабличноеПолеРезультата);
Если НомерСтороны = "1" Тогда
Для Каждого КолонкаГруппы Из КолонкиГруппы Цикл
СравниваемыеКолонкиРезультата.Добавить(КолонкаГруппы.ИмяКолонки + НомерСтороны);
КонецЦикла;
КонецЕсли;
КолонкиГруппы = КолонкиТаблица1.Выгрузить(Новый Структура("Ключевая, Сравнивать", Ложь, Ложь));
// Отбросим несопоставленные, т.к. их отдельно выводим
Отбрасываемые = КолонкиГруппы.НайтиСтроки(Новый Структура("ИмяКолонки2", ""));
Для Каждого Отбрасываемая Из Отбрасываемые Цикл
КолонкиГруппы.Удалить(Отбрасываемая);
КонецЦикла;
ДобавитьКолонкиТабличногоПоляГруппыРезультата(КолонкиГруппы, мИмяГруппыНесравниваемыхКолонок, "Несравниваемые колонки", НомерСтороны, НомерСтороны, НомерСтороны,
ТабличноеПолеРезультата);
// Используем имена несопоставленных колонок от своей стороны
Если НомерСтороны = "1" Тогда
КолонкиГруппы = КолонкиТаблица1.НайтиСтроки(Новый Структура("ИмяКолонки2", ""));
ДобавитьКолонкиТаблицыГруппыРезультата(КолонкиГруппы, НомерСтороны);
ДобавитьКолонкиТабличногоПоляГруппыРезультата(КолонкиГруппы, мИмяГруппыНесравниваемыхКолонок, "Несопоставленные колонки", НомерСтороны, НомерСтороны, НомерСтороны,
ТабличноеПолеРезультата);
КонецЕсли;
Если НомерСтороны = "2" Тогда
КолонкиГруппы = КолонкиТаблица2.НайтиСтроки(Новый Структура("ИмяКолонки1", ""));
ДобавитьКолонкиТаблицыГруппыРезультата(КолонкиГруппы, НомерСтороны);
ДобавитьКолонкиТабличногоПоляГруппыРезультата(КолонкиГруппы, мИмяГруппыНесравниваемыхКолонок, "Несопоставленные колонки", НомерСтороны, НомерСтороны, НомерСтороны,
ТабличноеПолеРезультата);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьКолонкиТаблицыГруппыРезультата(Знач КолонкиГруппы, Знач НомерСтороны)
Для Каждого КолонкаГруппы Из КолонкиГруппы Цикл
Если НомерСтороны = "2" Тогда
ИмяКолонки = КолонкаГруппы.ИмяКолонки2;
Иначе
ИмяКолонки = КолонкаГруппы.ИмяКолонки;
КонецЕсли;
КолонкаИсходнойТаблицы = ЭтотОбъект["Таблица" + НомерСтороны].Колонки[ИмяКолонки];
ДобавитьКолонкуТаблицыРезультата(ИмяКолонки, КолонкаГруппы.ИмяКолонки, КолонкаИсходнойТаблицы, НомерСтороны);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьКолонкуТаблицыРезультата(Знач ИмяКолонкиТаблицыРезультата, Знач ИмяИсходнойКолонки, Знач КолонкаИсходнойТаблицы, Суффикс)
РезультатСравнения.Колонки.Добавить(ИмяКолонкиТаблицыРезультата + Суффикс, КолонкаИсходнойТаблицы.ТипЗначения, КолонкаИсходнойТаблицы.Заголовок + " " + Суффикс,
КолонкаИсходнойТаблицы.Ширина);
СтруктураКолонокРезультата.Вставить(ИмяКолонкиТаблицыРезультата + Суффикс, ИмяИсходнойКолонки);
КонецПроцедуры
Процедура ДобавитьКолонкиТабличногоПоляГруппыРезультата(Знач КолонкиГруппы, Знач ИмяГруппы, Знач ЗаголовокГруппы, Знач НомерСтороныГруппы = "", СуффиксКолонки = "",
Знач НомерСтороныКолонки = "", Знач ТабличноеПолеРезультата)
Если КолонкиГруппы.Количество() > 0 Тогда
КолонкаТабличногоПоля = ТабличноеПолеРезультата.Колонки.Добавить(ИмяГруппы + НомерСтороныГруппы);
Если ЗначениеЗаполнено(НомерСтороныГруппы) Тогда
ЗаголовокГруппы = ЗаголовокГруппы + " " + НомерСтороныГруппы;
КонецЕсли;
КолонкаТабличногоПоля.ТекстШапки = ЗаголовокГруппы;
ЭтоПерваяКолонка = Истина;
Для Каждого КолонкаГруппы Из КолонкиГруппы Цикл
ИмяКолонкиТаблицыРезультата = КолонкаГруппы.ИмяКолонки + СуффиксКолонки;
КолонкаТабличногоПоля = ТабличноеПолеРезультата.Колонки.Добавить(ИмяКолонкиТаблицыРезультата);
КолонкаТабличногоПоля.Данные = ИмяКолонкиТаблицыРезультата;
КолонкаТабличногоПоля.ТекстШапки = ЭтотОбъект["КолонкиТаблица" + НомерСтороныКолонки].Найти(КолонкаГруппы.ИмяКолонки, "ИмяКолонки").СинонимКолонки;
Если ЭтоПерваяКолонка Тогда
КолонкаТабличногоПоля.Положение = ПоложениеКолонки.НаСледующейСтроке;
ЭтоПерваяКолонка = Ложь;
Иначе
КолонкаТабличногоПоля.Положение = ПоложениеКолонки.ВТойЖеКолонке;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ВывестиСтрокуРезультата(СтрокаРезультата, СтрокаТаблицы, НомерСтороны)
#Если Сервер И Не Сервер Тогда
СтрокаТаблицы = Новый ТаблицаЗначений;
СтрокаТаблицы = СтрокаТаблицы.Добавить();
#КонецЕсли
Если СтрокаРезультата = Неопределено Тогда
СтрокаРезультата = РезультатСравнения.Добавить();
СтрокаРезультата[мИмяКолонкиНомераСтрокиРезультата] = РезультатСравнения.Количество();
КонецЕсли;
КолонкиТаблица = ЭтотОбъект["КолонкиТаблица" + НомерСтороны];
ВыведенныеКолонки = Новый Структура;
Если НомерСтороны = "2" Тогда
Для Каждого ВыводимаяКолонка Из КолонкиТаблица1.НайтиСтроки(Новый Структура("Ключевая", Истина)) Цикл
СтрокаРезультата[ВыводимаяКолонка.ИмяКолонки + "1"] = СтрокаТаблицы[ВыводимаяКолонка.ИмяКолонки2];
ВыведенныеКолонки.Вставить(ВыводимаяКолонка.ИмяКолонки2);
КонецЦикла;
КонецЕсли;
Для Каждого ВыводимаяКолонка Из КолонкиТаблица.НайтиСтроки(Новый Структура("Выводить", Истина)) Цикл
Если ВыведенныеКолонки.Свойство(ВыводимаяКолонка.ИмяКолонки) Тогда
Продолжить;
КонецЕсли;
СтрокаРезультата[ВыводимаяКолонка.ИмяКолонки + НомерСтороны] = СтрокаТаблицы[ВыводимаяКолонка.ИмяКолонки];
КонецЦикла;
КонецПроцедуры
// вывод разницы
Процедура ВывестиРазницуЧисел(Знач СтрокаРезультата, Знач РезультатСравненияСтрок);
#Если Сервер И Не Сервер Тогда
СтрокаРезультата = Новый ТаблицаЗначений;
СтрокаРезультата = СтрокаТаблицы.Добавить();
Строка2 = СтрокаТаблицы.Добавить();
#КонецЕсли
КолонкиТаблица = ЭтотОбъект.КолонкиТаблица1;
Для Каждого ВыводимаяКолонка Из КолонкиТаблица.НайтиСтроки(Новый Структура("Сравнивать", Истина)) Цикл
Колонка1 = Таблица1.Колонки[ВыводимаяКолонка.ИмяКолонки];
Колонка2 = Таблица2.Колонки[ВыводимаяКолонка.ИмяКолонки2];
Если Истина
И Колонка1.ТипЗначения.СодержитТип(Тип("Число"))
И Колонка2.ТипЗначения.СодержитТип(Тип("Число"))
Тогда
Если РезультатСравненияСтрок = ПризнакТолько2 Тогда
ЗначениеЯчейки1 = 0;
Иначе
ЗначениеЯчейки1 = СтрокаРезультата[ВыводимаяКолонка.ИмяКолонки + "1"];
КонецЕсли;
Если РезультатСравненияСтрок = ПризнакТолько1 Тогда
ЗначениеЯчейки2 = 0;
Иначе
ЗначениеЯчейки2 = СтрокаРезультата[ВыводимаяКолонка.ИмяКолонки + "2"];
КонецЕсли;
СтрокаРезультата[ВыводимаяКолонка.ИмяКолонки + "Разность"] = ЗначениеЯчейки1 - ЗначениеЯчейки2;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// установка отборов по результатам сравнения
Процедура ОтображениеРезультатаУстановитьОтбор(ТабличноеПолеРезультата, РежимОтбора = "ОтборВсе") Экспорт
Если РежимОтбора = "ОтборВсе" Тогда
НужныйПризнак = 0;
ИначеЕсли РежимОтбора = "ОтборОтличия" Тогда
НужныйПризнак = ПризнакНеРавно;
ИначеЕсли РежимОтбора = "Отбор1" Тогда
НужныйПризнак = ПризнакТолько1;
ИначеЕсли РежимОтбора = "Отбор2" Тогда
НужныйПризнак = ПризнакТолько2;
КонецЕсли;
ТекущаяСтрока = ТабличноеПолеРезультата.ТекущаяСтрока;
Если ТекущаяСтрока <> Неопределено Тогда
КлючСтаройСтроки = ТекущаяСтрока[мИмяКолонкиНомераСтрокиРезультата];
КонецЕсли;
Если НужныйПризнак = 0 Тогда
ВыбранныйРезультат = РезультатСравнения;
Иначе
ВыбранныйРезультат = РезультатСравнения.Скопировать(Новый Структура(мИмяКолонкиРезультатаСравнения, НужныйПризнак));
КонецЕсли;
Если КлючСтаройСтроки <> Неопределено Тогда
НоваяТекущаяСтрока = ВыбранныйРезультат.Найти(КлючСтаройСтроки, мИмяКолонкиНомераСтрокиРезультата);
Если НоваяТекущаяСтрока <> Неопределено Тогда
ТабличноеПолеРезультата.ТекущаяСтрока = НоваяТекущаяСтрока;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
// цвета по-умолчанию
ОтличаютсяЦветФона = WebЦвета.Красный;
ОтличаютсяЦветТекста = WebЦвета.Белый;
ТолькоВТаблице1ЦветФона = WebЦвета.Желтый;
ТолькоВТаблице1ЦветТекста = WebЦвета.Черный;
ТолькоВТаблице2ЦветФона = WebЦвета.БледноЗеленый;
ТолькоВТаблице2ЦветТекста = WebЦвета.Черный;
ПризнакРавно = 1;
ПризнакНеРавно = 2;
ПризнакТолько1 = 3;
ПризнакТолько2 = 4;
НеВыводитьОдинаковыеСтроки = Истина;
ВыводитьРазницуЧисловыхКолонокСравнения = Истина;
РезультатыСравненияСтрок = Новый Соответствие;
РезультатыСравненияСтрок.Вставить(ПризнакРавно, "Равно");
РезультатыСравненияСтрок.Вставить(ПризнакНеРавно, "Не равно");
РезультатыСравненияСтрок.Вставить(ПризнакТолько1, "Только 1");
РезультатыСравненияСтрок.Вставить(ПризнакТолько2, "Только 2");
мИмяГруппыКлючевыхКолонок = "_ГруппаКлючевых9234284";
мИмяГруппыСравниваемыхКолонок = "_ГруппаСравниваемых9234284";
мИмяГруппыНесравниваемыхКолонок = "_ГруппаНесравниваемых9234284";
мИмяГруппыРазностныхКолонок = "_ГруппаРазностных9234284";
мИмяКолонкиРезультатаСравнения = "РезультатСравнения9234284";
мИмяКолонкиНомераСтрокиРезультата = "НомерСтрокиРезультата9234284";
#КонецЕсли