Разработка и Конфигурация · 11 мин
Как посмотреть временные таблицы в запросе 1С 8.3
Как посмотреть содержимое временных таблиц в запросе 1С 8.3: отладка пакетных запросов, консоль запросов, метод ВременныеТаблицы, типичные ошибки и приёмы проверки.
Временные таблицы — основной инструмент оптимизации сложных запросов в 1С: промежуточные выборки помещаются во временные таблицы, а затем используются в последующих частях пакетного запроса. Проблема в том, что содержимое этих таблиц не видно напрямую: результат выполнения запроса возвращает только итоговую выборку, а промежуточные данные остаются «за кадром». Когда запрос выдаёт не то, что ожидалось, разработчику приходится специально извлекать временные таблицы, чтобы понять, на каком этапе данные «потерялись» или исказились.
Посмотреть временные таблицы можно несколькими способами: через менеджер временных таблиц в отладчике, через консоль запросов, через программное чтение свойства ВременныеТаблицы объекта запроса или через временную замену итоговой выборки. Каждый способ подходит для своей ситуации — от быстрой проверки в конфигураторе до диагностики запроса, встроенного в код обработки.
Ниже разобраны все рабочие методы с конкретным кодом, ограничениями платформы и типичными ошибками, из-за которых временная таблица кажется пустой или недоступной.
Что такое временная таблица и когда она доступна
Временная таблица создаётся конструкцией ПОМЕСТИТЬ ИмяТаблицы в тексте пакетного запроса. Она существует в памяти сервера СУБД или в оперативной памяти (в зависимости от СУБД и настроек) и живёт ровно столько, сколько существует объект МенеджерВременныхТаблиц, с которым выполнялся запрос.
Если менеджер временных таблиц не назначен запросу явно, платформа создаёт его неявно и уничтожает сразу после выполнения пакета. Поэтому попытка обратиться к временной таблице из другого запроса без общего менеджера закончится ошибкой «Таблица не найдена». Это самая частая причина, почему разработчик «не видит» свои временные таблицы.
Проверить, какие таблицы сейчас существуют, можно через свойство МенеджерВременныхТаблиц.Таблицы — это коллекция с именами таблиц, количеством строк и возможностью получить содержимое методом Получить(Индекс).ПолучитьДанные() либо через выгрузку.
Способ 1. Отладка в конфигураторе через «Вычислить выражение»
Самый быстрый метод, когда запрос выполняется в коде модуля. Поставьте точку останова сразу после строки Запрос.Выполнить() или после выполнения пакета Запрос.ВыполнитьПакет(). Убедитесь, что запросу заранее назначен менеджер временных таблиц:
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ Товары.Ссылка, Товары.Количество
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Товары";
Запрос.Выполнить();
В отладчике откройте «Вычислить выражение» (Shift+F9) и выполните запрос к временной таблице. Удобнее всего сделать это отдельным объектом запроса, который использует тот же менеджер:
ЗапросПроверка = Новый Запрос("ВЫБРАТЬ * ИЗ ВТ_Товары");
ЗапросПроверка.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
Результат = ЗапросПроверка.Выполнить().Выгрузить();
Переменную Результат можно открыть в табло как таблицу значений и пролистать все строки. Альтернатива без дополнительного запроса — вычислить выражение Запрос.МенеджерВременныхТаблиц.Таблицы[0].ПолучитьДанные().Выгрузить(), что сразу вернёт таблицу значений с содержимым первой временной таблицы.
- 1Убедитесь, что запросу назначен явный МенеджерВременныхТаблиц
- 2Поставьте точку останова после выполнения пакетного запроса
- 3Откройте «Вычислить выражение» (Shift+F9)
- 4Создайте новый запрос с тем же менеджером и текстом ВЫБРАТЬ * ИЗ ИмяТаблицы
- 5Выгрузите результат в таблицу значений и изучите строки
Способ 2. Консоль запросов с поддержкой временных таблиц
Консоль запросов — внешняя обработка, которая позволяет выполнять пакетные запросы интерактивно. Большинство распространённых консолей (в том числе входящие в состав инструментов разработчика) показывают временные таблицы отдельно: после выполнения пакета в интерфейсе появляется список созданных таблиц с количеством строк, и любую из них можно открыть как обычный результат.
Если ваша консоль не показывает временные таблицы автоматически, используйте тот же приём, что и в отладчике: консоль обычно сохраняет менеджер временных таблиц между выполнениями, поэтому достаточно выполнить второй запрос с текстом ВЫБРАТЬ * ИЗ ВТ_Товары — он прочитает таблицу, созданную предыдущим пакетом.
Важный нюанс: некоторые консоли по умолчанию создают новый менеджер при каждом выполнении. Ищите в настройках консоли опцию вроде «Сохранять временные таблицы» или «Использовать общий менеджер временных таблиц», иначе второй запрос не найдёт таблицу.
Способ 3. Программный просмотр через свойство Таблицы менеджера
Когда нужно вывести содержимое временных таблиц из кода — например, в журнал регистрации, в сообщение или в файл для анализа, — используйте коллекцию МенеджерВременныхТаблиц.Таблицы. Каждый элемент содержит имя таблицы и количество строк, а метод ПолучитьДанные() возвращает результат запроса.
Для Каждого ВТ Из Запрос.МенеджерВременныхТаблиц.Таблицы Цикл
Сообщить("Таблица: " + ВТ.Имя + ", строк: " + ВТ.КоличествоСтрок);
ТЗ = ВТ.ПолучитьДанные().Выгрузить();
// Дальше ТЗ можно вывести, сохранить или проанализировать
КонецЦикла;
Этот подход удобен для автоматической диагностики: можно временно вставить цикл в проблемный участок кода, выполнить сценарий в тестовой базе и получить полный снимок всех промежуточных таблиц без ручной работы в отладчике.
Не забудьте удалить или закомментировать диагностический код после решения проблемы: выгрузка больших таблиц в таблицы значений потребляет память и замедляет выполнение, а в рабочей базе это лишняя нагрузка.
Способ 4. Временная замена итоговой выборки в тексте запроса
Если под рукой нет ни отладчика, ни консоли с нужными возможностями, самый простой приём — временно изменить текст запроса так, чтобы итоговой выборкой стала интересующая временная таблица. Закомментируйте финальную часть пакета и добавьте в конец:
ВЫБРАТЬ * ИЗ ВТ_Товары КАК ВТ_Товары
Тогда обычный вызов Запрос.Выполнить().Выгрузить() вернёт содержимое временной таблицы, и его можно посмотреть любым привычным способом — хоть в отладке, хоть выведя в табличный документ. После диагностики верните исходный текст запроса.
Метод грубый, но надёжный: он не требует ни менеджера временных таблиц, ни специальных инструментов и работает даже при анализе запроса, встроенного в чужой код, который нельзя останавливать отладкой (например, в фоновом задании на сервере, куда проще временно подставить текст и записать результат в файл).
Почему временная таблица «не видна»: типичные ошибки
Первая и главная ошибка — запросу не назначен МенеджерВременныхТаблиц, либо каждому запросу назначен свой. Временные таблицы изолированы внутри своего менеджера: два запроса с разными менеджерами не видят таблиц друг друга. Всегда создавайте один менеджер и передавайте его всем запросам, участвующим в обмене временными таблицами.
Вторая частая ситуация — таблица уничтожена раньше времени. В пакетном запросе может быть конструкция УНИЧТОЖИТЬ ВТ_Товары, после которой таблица недоступна. Также таблицы пропадают, если менеджер был локальной переменной процедуры и процедура завершилась. Проверяйте порядок пакетов и время жизни переменных.
Третья группа ошибок — обращение по неправильному имени. Имя временной таблицы задаётся в ПОМЕСТИТЬ, а не в псевдониме источника. Если в пакете несколько таблиц, легко перепутать ВТ_Товары и ВТ_ТоварыИтог. Список реально существующих имён всегда можно получить перебором МенеджерВременныхТаблиц.Таблицы.
Проверка результата и границы применения
Признак того, что вы всё сделали правильно: запрос ВЫБРАТЬ * ИЗ ИмяТаблицы выполняется без ошибок и возвращает ожидаемое число строк, которое совпадает со значением КоличествоСтрок в коллекции таблиц менеджера. Если строк ноль — проблема не в просмотре, а в логике заполнения таблицы: проверяйте условия соединений и отборов в исходной части пакета.
Для сопоставления содержимого удобно выгружать временную таблицу и итоговый результат рядом и сравнивать по ключевым полям. Часто именно так выявляются дубли после соединений, потерянные строки из-за ВНУТРЕННЕГО соединения вместо ЛЕВОГО или неучтённые отборы по периоду.
Как проверить результат
Запрос выполняется, строки возвращаются
Ошибка «Таблица не найдена» — нет общего менеджера или таблица уничтожена
Совпадает с ожиданием по логике отбора
Ноль строк или явные дубли — ошибка в соединениях и условиях пакета
Все таблицы пакета присутствуют с нужными именами
Часть таблиц отсутствует — проверьте УНИЧТОЖИТЬ и порядок пакетов
Помните об ограничении: все описанные приёмы работают только в пределах одного сеанса и одного менеджера временных таблиц. «Подсмотреть» временные таблицы чужого сеанса или уже завершившегося фонового задания невозможно — для таких случаев добавляйте в код запись содержимого в файл или журнал на этапе разработки.
Что важно запомнить
Временные таблицы доступны, пока жив их МенеджерВременныхТаблиц. Смотреть их можно через отладчик с отдельным запросом, через консоль запросов, программно через МенеджерВременныхТаблиц.Таблицы или временной заменой итоговой выборки. Большинство проблем «невидимых» таблиц — это отсутствие общего менеджера, УНИЧТОЖИТЬ в пакете или неверное имя.
Частые вопросы
Можно ли посмотреть временные таблицы без отладчика и консоли?
Да. Временно замените итоговую выборку пакета на ВЫБРАТЬ * ИЗ ИмяТаблицы и выгрузите результат привычным способом, либо добавьте в код цикл по МенеджерВременныхТаблиц.Таблицы с выводом имён и количества строк в сообщения или журнал регистрации.
Почему запрос «ВЫБРАТЬ * ИЗ ВТ» выдаёт ошибку «Таблица не найдена»?
Почти всегда причина в том, что проверочный запрос использует другой менеджер временных таблиц или менеджер не задан вовсе. Передайте проверочному запросу тот же объект МенеджерВременныхТаблиц, с которым выполнялся исходный пакет. Также проверьте, нет ли в пакете команды УНИЧТОЖИТЬ для этой таблицы.
Как узнать, сколько строк во временной таблице, не выгружая её?
Обратитесь к свойству КоличествоСтрок элемента коллекции МенеджерВременныхТаблиц.Таблицы. Это безопасный способ оценить размер таблицы перед выгрузкой и избежать загрузки в память миллионов строк.
Видны ли временные таблицы между разными сеансами или фоновыми заданиями?
Нет. Временные таблицы существуют только в рамках сеанса и менеджера, который их создал. Для передачи данных между сеансами используйте обычные таблицы базы данных, регистры сведений или хранилище значений.
Чем отличается ВыполнитьПакет() от Выполнить() при работе с временными таблицами?
ВыполнитьПакет() возвращает массив результатов всех выборок пакета, а таблицы, созданные через ПОМЕСТИТЬ, остаются в менеджере. Выполнить() возвращает результат последней выборки. Для диагностики удобнее ВыполнитьПакет() в сочетании с явным менеджером — тогда доступны и промежуточные результаты, и сами временные таблицы.
Влияет ли просмотр временных таблиц на производительность запроса?
Сам запрос не меняется, но выгрузка содержимого в таблицу значений потребляет память пропорционально объёму данных. На этапе разработки это приемлемо; в рабочем коде диагностические выгрузки нужно удалять или ограничивать выборкой первых строк.