Столкнулся с такой проблемой, что произвольно созданные таблицы значений не так-то легко преобразовать во временную таблицу, чтобы её можно было использовать в запросе, т.к. для преобразования требуется создать описание типов, а если тип составной, то тут совсем замучаешься. Поэтому возникла идея немного автоматизировать этот процесс. Описание типов данных формирую в промежуточных запросах, т.к. к данным, которые выгрузились из запроса, автоматически формируется и описание типов.
Вот сами функции....
//------------------------------------------------
процедура ПреобразоватьТЗвВТ(ТЗ,МВТ,имяВТ)
ТЗнов = ПреобразоватьТЗвТЗсОписаниемТипов(ТЗ);
запрос = новый запрос;
запрос.МенеджерВременныхТаблиц = МВТ;
запрос.Текст = "ВЫБРАТЬ
| *
|ПОМЕСТИТЬ "+ имяВТ+"
| ИЗ &ТЗнов КАК ТЗнов";
запрос.УстановитьПараметр("ТЗнов",ТЗнов);
запрос.Выполнить();
КонецПроцедуры
Функция ПолучитьТЗизВТ(МВТ,имяВТ)
//---------------------------------
// Выгружаем значение Временной таблицы(ВТ)
// в ТаблицуЗначений (ТЗ)
//---------------------------------
запрос = новый запрос;
запрос.МенеджерВременныхТаблиц = МВТ;
запрос.Текст = "ВЫБРАТЬ * из "+имяВТ+" КАК ТЗ";
ТЗ = Запрос.Выполнить().Выгрузить();
//---------------------------------
возврат ТЗ;
КонецФункции
//------------------------------------------------
//--------тех ФУНКЦИИ ----------------------------
функция ПреобразоватьТЗвТЗсОписаниемТипов(ТЗ)
//--------------------------------------------
// Создаём новую ТЗ с описанием типов
//--------------------------------------------
ТЗ_tmp2 = новый ТаблицаЗначений;
для каждого кол из ТЗ.Колонки Цикл
ОпТипов = ОпределитьОписаниеТиповПоляТЗ(ТЗ,кол.Имя);
ТЗ_tmp2.Колонки.Добавить(кол.Имя,ОпТипов);
КонецЦикла;
//--------------------------------------------
для каждого стр_t из ТЗ Цикл
стр_нов_t = ТЗ_tmp2.Добавить();
ЗаполнитьЗначенияСвойств(стр_нов_t,стр_t);
КонецЦикла;
возврат ТЗ_tmp2;
КонецФункции
функция ПолучитьТипы(мас)
//-----------------------------------------
// Определяет все различные типы элементов
// встречающиеся в массиве
//-----------------------------------------
ТЗтипы = новый ТаблицаЗначений;
ТЗтипы.Колонки.Добавить("Тип");
ТЗтипы.Колонки.Добавить("Индекс");
колво = мас.Количество();
Если колво>0 тогда
стрТип = ТЗтипы.Добавить();
стрТип.Тип = ТипЗнч(мас[0]);
стрТип.индекс = 0; // номер элемента в ТЗ с этим типом
предыдущ_тип = стрТип.Тип; // предыдущее значение типа
КонецЕсли;
для н = (0+1) по (колво-1) Цикл
эл = мас[н];
типЭл = ТипЗнч(эл);
// Чтобы каждый раз не проверять тип по всему ТЗ, делаем проверку
// только когда он меняется
Если типЭл <> предыдущ_тип тогда
//-------------------
// теперь проверяем, есть ли у нас такой тип
ЦиклПрерван = 0;
для каждого стрТип из ТЗтипы Цикл
Если стрТип.Тип = типЭл тогда
ЦиклПрерван = 1;
Прервать;
КонецЕсли;
КонецЦикла;
//-------------------
// перебрали все наши типы и такого не нашли
Если ЦиклПрерван = 0 тогда
// добавляем в наш список
стрТип = ТЗтипы.Добавить();
стрТип.Тип = типЭл;
стрТип.индекс = н; // номер элемента в ТЗ с этим типом
КонецЕсли;
//-------------------
предыдущ_тип = типЭл;
КонецЕсли;
КонецЦикла;
возврат ТЗтипы;
конецФункции
функция ОпределитьОписаниеТиповПоляТЗ(ТЗ,имяКолонки)
мас1 = ТЗ.ВыгрузитьКолонку(имяКолонки);
тзТипов = ПолучитьТипы(мас1);
//----------------------------------------
// Собираем все типы в одином запросе
// для того чтобы получить составной тип
//----------------------------------------
запрос= новый запрос;
н = 0;
Если тзТипов.Количество()>0 тогда
Запрос.Текст = "ВЫБРАТЬ &поле"+н+" как поле";
запрос.УстановитьПараметр("поле"+н, мас1[тзТипов[н].Индекс]);
КонецЕсли;
колво = тзТипов.Количество();
для н = 0+1 по (колво-1) Цикл
Запрос.Текст = Запрос.Текст + " ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ &поле"+н+" как поле";
запрос.УстановитьПараметр("поле"+н, мас1[тзТипов[н].Индекс]);
КонецЦикла;
ТЗ_tmp = запрос.Выполнить().Выгрузить();
//-------------------------------
возврат ТЗ_tmp.Колонки.поле.ТипЗначения;
КонецФункции
//------------------------------------------------
// Пример!!!
Процедура КнопкаВыполнитьНажатие(Кнопка)
//----------------------------------------------
// Составляем произвольную ТЗ для проверки
//----------------------------------------------
ТЗ2 = новый ТаблицаЗначений;
ТЗ2.Колонки.Добавить("поле1");
ТЗ2.Колонки.Добавить("поле2");
ТЗ2.Колонки.Добавить("поле3");
ТЗ2.Колонки.Добавить("поле4");
стр = ТЗ2.Добавить();
стр.поле1 = 10.3434;
стр = ТЗ2.Добавить();
стр.поле1 = Справочники.Контрагенты.ПустаяСсылка();
стр = ТЗ2.Добавить();
стр.поле1 = Справочники.Контрагенты.ПустаяСсылка();
стр = ТЗ2.Добавить();
стр.поле1 = Справочники.Контрагенты.ПустаяСсылка();
стр = ТЗ2.Добавить();
стр.поле1 = Справочники.Номенклатура.ПустаяСсылка();
стр = ТЗ2.Добавить();
стр.поле1 = Справочники.Контрагенты.ПустаяСсылка();
стр.поле2 = 45.12;
стр.поле3 = 1;
стр.поле4 = 3;
МВТ = новый МенеджерВременныхТаблиц;
//--------------------------------------------------------
//Преобразование таблицы значений во временную таблицу
//--------------------------------------------------------
//ПреобразоватьТЗвВТ(,,);
ПреобразоватьТЗвВТ(ТЗ2,МВТ,"ТЗЯху");
ТЗ_рез = ПолучитьТЗизВТ(МВТ,"ТЗЯху");
ТЗ_рез.ВыбратьСтроку();
КонецПроцедуры
В качестве примера выложил обработку для 8.1, где это всё реализовано