Не претендуя на какое-то открытие, просто в качестве примера динамического формирования текста запроса, вашему вниманию:
Функция для сравнения/склеивания двух таблиц по произвольным колонкам запросом.
В прикрепленных файлах пример использования - обработка для склейки двух ексель-файлов по выбранным колонкам.
Параметры функции:
тзОдин, тзДва - таблицы значений для сравнения.
КолонкиДляСравнения - таблица значений с колонками: Колонки1, Колонки2, содержащая имена колонок соответственно первой и второй таблиц, по которым нужно склеивать таблицы.
ВыводитьРавные - булево, добавлять или нет в результирующую таблицу найденные по соответствию строки.
Функция СравнитьДанные(тзОдин,тзДва,КолонкиДляСравнения,ВыводитьРавные=Истина)
Запрос = Новый Запрос;
ТекстЗапроса = "
|ВЫБРАТЬ ";
Для инд=0 по тзОдин.Колонки.Количество()-1 Цикл
ТекстЗапроса = ТекстЗапроса+"
|тзОдин."+тзОдин.Колонки[инд].Имя+" КАК "+тзОдин.Колонки[инд].Имя+",";
КонецЦикла;
ТекстЗапроса = ТекстЗапроса+"
|""ПоследнийСтолбец"" как ДляЗавершения__
|ПОМЕСТИТЬ тзОдин
|ИЗ
| &тзОдин КАК тзОдин
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ";
Для инд=0 по тзДва.Колонки.Количество()-1 Цикл
ТекстЗапроса = ТекстЗапроса+"
|тзДва."+тзДва.Колонки[инд].Имя+" КАК "+тзДва.Колонки[инд].Имя+",";
КонецЦикла;
ТекстЗапроса = ТекстЗапроса+"
|""ПоследнийСтолбец"" как ДляЗавершения__
|ПОМЕСТИТЬ тзДва
|ИЗ
| &тзДва КАК тзДва
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ";
Для инд=0 по тзОдин.Колонки.Количество()-1 Цикл
ТекстЗапроса = ТекстЗапроса+"
|тзОдин."+тзОдин.Колонки[инд].Имя+" КАК "+тзОдин.Колонки[инд].Имя+"_1,";
КонецЦикла;
Для инд=0 по тзДва.Колонки.Количество()-1 Цикл
ТекстЗапроса = ТекстЗапроса+"
|тзДва."+тзДва.Колонки[инд].Имя+" КАК "+тзДва.Колонки[инд].Имя+"_2,";
КонецЦикла;
ТекстЗапроса = ТекстЗапроса+"
| ВЫБОР
| КОГДА (НЕ тзДва."+тзДва.Колонки[0].Имя+" ЕСТЬ NULL и не тзОдин."+тзОдин.Колонки[0].Имя+" ЕСТЬ NULL)
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ЕстьКонтакт
|ИЗ
| тзОдин КАК тзОдин
| Полное СОЕДИНЕНИЕ тзДва КАК тзДва
| ПО Истина";
Для инд = 0 По КолонкиДляСравнения.Количество()-1 Цикл
ТекстЗапроса = ТекстЗапроса+"
| И тзОдин."+КолонкиДляСравнения[инд].Колонки1+" = тзДва."+КолонкиДляСравнения[инд].Колонки2;
КонецЦикла;
ТекстЗапроса = ТекстЗапроса+"
|";
Запрос.УстановитьПараметр("тзОдин", тзОдин);
Запрос.УстановитьПараметр("тзДва", тзДва);
Запрос.Текст = ТекстЗапроса;
РЗ = Запрос.Выполнить().Выгрузить();
Если не ВыводитьРавные тогда
Отбор = Новый Структура("ЕстьКонтакт",Истина);
СтрокиДляУдаления = РЗ.НайтиСтроки(Отбор);
Для каждого удСтрока из СтрокиДляУдаления Цикл
РЗ.Удалить(удСтрока);
КонецЦикла;
КонецЕсли;
Возврат РЗ;
КонецФункции