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