На текущий момент для отладки запросов, в основном, использую консоль запросов из поставки БСП. В этой консоли удобно пользоваться "импортом" запроса из XML. Этот XML предоставляет типовая ф-я БСП ОбщегоНазначения.ЗапросВСтрокуXML(...).
Но определенное количество матюков проблем возникает, когда отлаживаемый запрос должен работать с временными таблицами, сформированными когда-то ранее, и переданными в запрос менеджером временных таблиц.
Матюкнувшись в очередной раз, решил написать обертку над штатной ЗапросВСтрокуXML(...), чтобы в сериализуемом запросе зафиксировать данные временных таблиц.
// Выгружает запрос в строку XML, которую можно вставить в Консоль запросов.
// Работает с помощью одноименного метода БСП ОбщегоНазначения.ЗапросВСтрокуXML(...).
// В дополнение к ее функционалу, реализовано снятие дампа временных таблиц и внедрение в запрос кода и параметров для
// заполнения временных таблиц на основании параметров запроса типа ТаблицаЗначений.
//
// Параметры:
// Запрос - Запрос - запрос, который необходимо выгрузить в формат строки XML.
// ЗаполнитьВременныеТаблицы - Булево, Неопределено - Нужно ли дополнять запрос кодом и данными для создания временных таблиц.
// При значении =Неопределено, необходимость определяется автоматически, исходя из наличия менеджера временных таблиц у Запроса,
// и есть ли временные таблицы, управляемые менеджером.
//
// Возвращаемое значение:
// Строка - строка в формате XML, которую можно извлечь при помощи метода "ОбщегоНазначения.ЗначениеИзСтрокиXML".
// После извлечения получится объект типа "Структура" с полями:
// * Текст - Строка - текст запроса.
// * Параметры - Структура - параметры запроса.
//
Функция ЗапросВСтрокуXML(Запрос, Знач ЗаполнитьВременныеТаблицы = Неопределено) Экспорт
// Авто-определение необходимости заполнения.
ЗаполнитьВТ = Запрос.МенеджерВременныхТаблиц<>Неопределено И Запрос.МенеджерВременныхТаблиц.Таблицы.Количество()<>0;
// Уточняем исходя из значения параметра ЗаполнитьВременныеТаблицы.
Если ТипЗнч(ЗаполнитьВременныеТаблицы)=Тип("Булево") Тогда
ЗаполнитьВТ = ЗаполнитьВТ И ЗаполнитьВременныеТаблицы;
КонецЕсли;
Если Не ЗаполнитьВТ Тогда
Возврат ОбщегоНазначения.ЗапросВСтрокуXML(Запрос); // Внимание! Ранний возврат.
КонецЕсли;
// Будем работать с копией Запроса
КопияЗапроса = Новый Запрос;
КопияЗапроса.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
СоставТекстаЗапроса = Новый Массив; // Здесь будем собирать все части будущего запроса с дампами таблиц.
Для Каждого ОписаниеТаблицы Из КопияЗапроса.МенеджерВременныхТаблиц.Таблицы Цикл
// Снимаем дамп временной таблицы.
КопияЗапроса.Текст = СтрШаблон("ВЫБРАТЬ * ИЗ %1", ОписаниеТаблицы.ПолноеИмя);
ДанныеТаблицы = КопияЗапроса.Выполнить().Выгрузить();
// Устанавливаем полученную таблицу в параметр запроса.
ИмяПараметраТаблица = "Внеш" + ОписаниеТаблицы.ПолноеИмя;
КопияЗапроса.УстановитьПараметр(ИмяПараметраТаблица, ДанныеТаблицы);
// Конструируем текст запроса для помещения таблицы значений во временную таблицу.
ИменаПолейТаблицы = Новый Массив;
Для Каждого Колонка Из ОписаниеТаблицы.Колонки Цикл
// Увы, но есть проблема с "виртуальными" полями.
// Поэтому обрабатывать УИДы и хранилища значений не будем.
// https://its.1c.ru/db/v8312doc/bookmark/dev/TI000001778
Если Колонка.ТипЗначения.СодержитТип(Тип("УникальныйИдентификатор"))
Или Колонка.ТипЗначения.СодержитТип(Тип("ХранилищеЗначения"))
Тогда
Продолжить;
КонецЕсли;
ИменаПолейТаблицы.Добавить("вн." + Колонка.Имя);
КонецЦикла;
// Собираем строка запроса пакета запросов, добавляем ее в массив составляющих.
СтрокаИменПолей = СтрСоединить(ИменаПолейТаблицы, ", ");
СоставТекстаЗапроса.Добавить(СтрШаблон("ВЫБРАТЬ %1 ПОМЕСТИТЬ %2 ИЗ &%3 КАК вн;",
СтрокаИменПолей, ОписаниеТаблицы.ПолноеИмя, ИмяПараметраТаблица));
КонецЦикла;
// В финале добавляем исходный запрос.
СоставТекстаЗапроса.Добавить(Запрос.Текст);
КопияЗапроса.Текст = СтрСоединить(СоставТекстаЗапроса, "
|");
// Заполняем параметры
Для Каждого ОписаниеПараметра Из Запрос.Параметры Цикл
КопияЗапроса.УстановитьПараметр(ОписаниеПараметра.Ключ, ОписаниеПараметра.Значение);
КонецЦикла;
КопияЗапроса.МенеджерВременныхТаблиц = Неопределено; // Ну на всякий случай.
// Вызываем оригинальный метод.
Возврат ОбщегоНазначения.ЗапросВСтрокуXML(КопияЗапроса);
КонецФункции
Будет работать на платформах с 8.3.8. Версия БСП может быть использована любая.