Просмотр временных таблиц

Сегодня сделаем на сайте заметку о способах просмотра временных таблиц запросов. Что бы понять каким образом запрос нам собрал итоговый результат, необходимо рассмотреть его внутренности и при наличии временных таблиц понять что же у них там внутри.
Рассмотрим 4 способа получения этой информации.
Данные: в наличии имеется бесполезный запрос с двумя временными таблицами (“Подразделения”, “Пользователи”):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Подразделения.Ссылка КАК Ссылка |ПОМЕСТИТЬ Подразделения |ИЗ | Справочник.Подразделения КАК Подразделения |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Пользователи.Ссылка КАК Ссылка |ПОМЕСТИТЬ Пользователи |ИЗ | Справочник.Пользователи КАК Пользователи |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЗарплатаСотрудника.Ссылка КАК Ссылка |ИЗ | Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника"; |
Хоть они и не участвуют в результирующей выборки, но для данного примера это не суть важно.
В результате отладки запроса вам вдруг понадобилось посмотреть, а что же хранится в этих временных таблицах. И тут вы поняли, что посмотреть это нереально, так как вы в этом ничего не понимаете. Стоп. Шутка. Все вы знаете. И так начнем.
Способ 1. Берем консоль запросов для разработчиков под управляемые формы, вставляем наш туда текст запроса и с помощью панели управления таблицами, выводим их в табличный документ:
Для обычных форм так же существуют консоли запросов, в которых можно просматривать временные таблицы. Для примера можете её взять из подсистемы “Инструменты разработчика”.
Способ 2. Используя процедуру многих типовых конфигураций: “ПоказатьВременнуюТаблицу”. Если в вашей конфигурации таковой не имеется, то приведу полное её описание (смело копируйте в свой общий модуль):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
// Показать временную таблицу из менеджера временных таблиц. // Используется для просмотра временных таблиц в отладчике. // Пример вызова функции: // ОбщегоНазначенияУТ.ПоказатьВременнуюТаблицу(Запрос, "ТаблицаТоваров") // Функция ПоказатьВременнуюТаблицу(МенеджерВременныхТаблицИлиЗапрос, ИмяВременнойТаблицы) Экспорт ЗакрытьМенеджерВременныхТаблиц = Ложь; Если ТипЗнч(МенеджерВременныхТаблицИлиЗапрос) = Тип("Запрос") Тогда Если МенеджерВременныхТаблицИлиЗапрос.МенеджерВременныхТаблиц = Неопределено Тогда МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; ЗакрытьМенеджерВременныхТаблиц = Истина; МенеджерВременныхТаблицИлиЗапрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Иначе МенеджерВременныхТаблиц = МенеджерВременныхТаблицИлиЗапрос.МенеджерВременныхТаблиц; КонецЕсли; Попытка МенеджерВременныхТаблицИлиЗапрос.Выполнить(); Исключение // Ничего не делаем. КонецПопытки; Иначе МенеджерВременныхТаблиц = МенеджерВременныхТаблицИлиЗапрос; КонецЕсли; ДанныеТаблицы = ЗапросВыполнитьВыгрузить("ВЫБРАТЬ * ИЗ " + ИмяВременнойТаблицы,, МенеджерВременныхТаблиц); Если ЗакрытьМенеджерВременныхТаблиц Тогда МенеджерВременныхТаблиц.Закрыть(); МенеджерВременныхТаблицИлиЗапрос.МенеджерВременныхТаблиц = Неопределено; КонецЕсли; Возврат ДанныеТаблицы; КонецФункции // Показать произвольную выборку данных в отладчике // Пример: // ОбщегоНазначенияУТ.ЗапросВыполнитьВыгрузить("выбрать * из Справочник.Валюты где Валюты.Код = &Код", Новый Структура("Код", "810")) // Функция ЗапросВыполнитьВыгрузить(ТекстЗапроса, ПараметрыЗапроса = Неопределено, МенеджерВременныхТаблиц = Неопределено) Экспорт Запрос = Новый Запрос(ТекстЗапроса); Если НЕ МенеджерВременныхТаблиц = Неопределено Тогда Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; КонецЕсли; Если ЗначениеЗаполнено(ПараметрыЗапроса) Тогда Для Каждого Параметр Из ПараметрыЗапроса Цикл Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение); КонецЦикла; КонецЕсли; Возврат Запрос.Выполнить().Выгрузить(); КонецФункции |
Имея такую процедуру в общем модуле своей конфигурации, при отладке, можно получить любую временную таблицу выполняемого запроса:

Способ 3. Данный способ вытекает из предыдущего решения. Если мы внимательно посмотрим на содержимое процедуры “ПоказатьВременнуюТаблицу()”, то поймем, что для того что бы увидеть данные из временных таблиц, нам нужен “МенеджерВременныхТаблиц”. Из которого мы уже по индексу или с помощью поиска по наименования получим то, что нам нужно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Подразделения.Ссылка КАК Ссылка |ПОМЕСТИТЬ Подразделения |ИЗ | Справочник.Подразделения КАК Подразделения |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Пользователи.Ссылка КАК Ссылка |ПОМЕСТИТЬ Пользователи |ИЗ | Справочник.Пользователи КАК Пользователи |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЗарплатаСотрудника.Ссылка КАК Ссылка |ИЗ | Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника"; //!!Определяем менеджер временных таблиц МВТ = новый МенеджерВременныхТаблиц; Запрос.МенеджерВременныхТаблиц = МВТ; //!!Определяем менеджер временных таблиц ИтоговаяТЗ = Запрос.Выполнить().Выгрузить(); //!!Получаем содержимое временных таблиц ТЗ_Пользователи = МВТ.Таблицы.Найти("Пользователи").ПолучитьДанные().Выгрузить(); ТЗ_Подразделения = МВТ.Таблицы.Найти("Подразделения").ПолучитьДанные().Выгрузить(); ТЗ_Пользователи = МВТ.Таблицы[0].ПолучитьДанные().Выгрузить(); ТЗ_Подразделения = МВТ.Таблицы[1].ПолучитьДанные().Выгрузить(); //!!Получаем содержимое временных таблиц |
Так же содержимое можем и посмотреть при помощи отладки:

Способ 4. Как и предыдущий, данный способ так же подразумевает изменения в коде. Что бы посмотреть содержимое временных таблиц запроса, нужно выполнить его при помощи метода “ВыполнитьПакетСПромежуточнымиДанными()“:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Подразделения.Ссылка КАК Ссылка |ПОМЕСТИТЬ Подразделения |ИЗ | Справочник.Подразделения КАК Подразделения |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Пользователи.Ссылка КАК Ссылка |ПОМЕСТИТЬ Пользователи |ИЗ | Справочник.Пользователи КАК Пользователи |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЗарплатаСотрудника.Ссылка КАК Ссылка |ИЗ | Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника"; Пакеты = Запрос.ВыполнитьПакетСПромежуточнымиДанными(); |
В результате мы получим массив, в котором будут хранится результаты всех таблиц запроса, в той последовательности, в которой они описаны в запросе:
Внимание! Не путайте данный метод с другим методом “ВыполнитьПакет()“, который вернет вам все тот же массив, но вместо данных, там будут храниться лишь количество элементов в этих таблицах:
Надеюсь теперь вы без труда вытащите содержимое любого запроса и без проблем решите любую задачку. Всем удачи.
Наконец-то понятно, как с этим работать.спасибо