Функция сравнения двух таблиц


Сравнение/склейка двух таблиц значений по произвольным колонкам. Пример формирования запроса для сравнения.

Не претендуя на какое-то открытие, просто в качестве примера динамического формирования текста запроса, вашему вниманию:

Функция для сравнения/склеивания двух таблиц по произвольным колонкам запросом.

В прикрепленных файлах пример использования - обработка для склейки двух ексель-файлов по выбранным колонкам.

 

Параметры функции:

тзОдин, тзДва - таблицы значений для сравнения.

КолонкиДляСравнения - таблица значений с колонками: Колонки1, Колонки2, содержащая имена колонок соответственно первой и второй таблиц, по которым нужно склеивать таблицы.

ВыводитьРавные - булево, добавлять или нет в результирующую таблицу найденные по соответствию строки.


Функция СравнитьДанные(тзОдин,тзДва,КолонкиДляСравнения,ВыводитьРавные=Истина)

   
Запрос = Новый Запрос;

   
ТекстЗапроса = "
    |ВЫБРАТЬ "
;

    Для
инд=0 по тзОдин.Колонки.Количество()-1 Цикл

       
ТекстЗапроса = ТекстЗапроса+"
        |тзОдин."
+тзОдин.Колонки[инд].Имя+" КАК "+тзОдин.Колонки[инд].Имя+",";

    КонецЦикла;

   
ТекстЗапроса = ТекстЗапроса+"
    |""ПоследнийСтолбец"" как ДляЗавершения__
    |ПОМЕСТИТЬ тзОдин
    |ИЗ
    |   &тзОдин КАК тзОдин
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ"
;

    Для
инд=0 по тзДва.Колонки.Количество()-1 Цикл

       
ТекстЗапроса = ТекстЗапроса+"
        |тзДва."
+тзДва.Колонки[инд].Имя+" КАК "+тзДва.Колонки[инд].Имя+",";

    КонецЦикла;

   
ТекстЗапроса = ТекстЗапроса+"
    |""ПоследнийСтолбец"" как ДляЗавершения__
    |ПОМЕСТИТЬ тзДва
    |ИЗ
    |   &тзДва КАК тзДва
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ"
;

    Для
инд=0 по тзОдин.Колонки.Количество()-1 Цикл

       
ТекстЗапроса = ТекстЗапроса+"
        |тзОдин."
+тзОдин.Колонки[инд].Имя+" КАК "+тзОдин.Колонки[инд].Имя+"_1,";

    КонецЦикла;

    Для
инд=0 по тзДва.Колонки.Количество()-1 Цикл

       
ТекстЗапроса = ТекстЗапроса+"
        |тзДва."
+тзДва.Колонки[инд].Имя+" КАК "+тзДва.Колонки[инд].Имя+"_2,";

    КонецЦикла;

   
ТекстЗапроса = ТекстЗапроса+"
    |   ВЫБОР
    |       КОГДА (НЕ тзДва."
+тзДва.Колонки[0].Имя+" ЕСТЬ NULL и не тзОдин."+тзОдин.Колонки[0].Имя+" ЕСТЬ NULL)
    |           ТОГДА ИСТИНА
    |       ИНАЧЕ ЛОЖЬ
    |   КОНЕЦ КАК ЕстьКонтакт
    |ИЗ
    |   тзОдин КАК тзОдин
    |       Полное СОЕДИНЕНИЕ тзДва КАК тзДва
    |       ПО Истина"
;

    Для
инд = 0 По КолонкиДляСравнения.Количество()-1 Цикл

       
ТекстЗапроса = ТекстЗапроса+"
        |   И тзОдин."
+КолонкиДляСравнения[инд].Колонки1+" = тзДва."+КолонкиДляСравнения[инд].Колонки2;

    КонецЦикла;

   
ТекстЗапроса = ТекстЗапроса+"
    |"
;

   
Запрос.УстановитьПараметр("тзОдин", тзОдин);
   
Запрос.УстановитьПараметр("тзДва", тзДва);

   
Запрос.Текст = ТекстЗапроса;

   
РЗ = Запрос.Выполнить().Выгрузить();

    Если не
ВыводитьРавные тогда
       
Отбор = Новый Структура("ЕстьКонтакт",Истина);
       
СтрокиДляУдаления = РЗ.НайтиСтроки(Отбор);
        Для каждого
удСтрока из СтрокиДляУдаления Цикл
           
РЗ.Удалить(удСтрока);
        КонецЦикла;
    КонецЕсли;

    Возврат РЗ;

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

Файлы обработки:

-