К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как посмотреть содержимое временной таблицы в 1С

Как посмотреть содержимое временной таблицы в 1С: консоль запросов, отладчик, пакетные запросы, менеджер временных таблиц. Примеры кода и типичные ошибки.

Временные таблицы в 1С существуют только внутри менеджера временных таблиц и видны исключительно в рамках одного пакетного запроса или сеанса работы этого менеджера. Из-за этого напрямую «открыть» временную таблицу, как обычный справочник, нельзя — но есть несколько рабочих способов увидеть её содержимое: через консоль запросов, через отладчик и программным выводом.

Чаще всего задача возникает при отладке сложных пакетных запросов: запрос создаёт несколько временных таблиц, объединяет их, а итоговый результат не совпадает с ожиданиями. Чтобы найти ошибку, нужно посмотреть, что реально попало в промежуточную таблицу на каждом шаге.

Ниже разобраны все практические способы: от самого быстрого (консоль запросов с выводом временных таблиц) до программных приёмов в коде, а также типичные ошибки, из-за которых временная таблица «не видна».

Что такое временная таблица и где она хранится

Временная таблица в 1С — это набор строк, материализованный платформой при выполнении конструкции ПОМЕСТИТЬ ИмяТаблицы в тексте запроса. Физически данные размещаются во временном хранилище СУБД (в MS SQL Server — в tempdb) либо в памяти сервера 1С, и доступ к ним возможен только через объект МенеджерВременныхТаблиц.

Ключевое следствие: временная таблица живёт, пока жив её менеджер. Если запрос выполнен без явно созданного менеджера, платформа создаёт его неявно и уничтожает сразу после выполнения — все временные таблицы пропадают. Поэтому попытка посмотреть таблицу «после» выполнения запроса в отдельном коде без общего менеджера закончится ошибкой «Таблица не найдена».

Время жизни менеджера привязано к переменной: пока переменная типа МенеджерВременныхТаблиц существует и не переопределена, таблицы доступны. В серверном коде это время жизни вызова, в толстом клиенте — время жизни переменной модуля или формы.

Способ 1: консоль запросов с просмотром временных таблиц

Самый удобный путь для разработчика — консоль запросов (внешняя обработка, в том числе с диска ИТС или популярные аналоги). Порядок действия прост: вставьте текст пакетного запроса, заполните параметры и выполните его целиком.

Чтобы увидеть конкретную временную таблицу, допишите в конец пакета ещё один запрос-пакет:

ВЫБРАТЬ

*

ИЗ

ВТ_Товары КАК ВТ_Товары

Многие консоли запросов умеют показывать список временных таблиц автоматически: после выполнения пакета они выводят вкладки с содержимым каждой таблицы, созданной через ПОМЕСТИТЬ. Если ваша консоль этого не делает — ручное добавление «ВЫБРАТЬ * ИЗ» работает всегда.

Важный нюанс: если в запросе временная таблица уничтожается командой УНИЧТОЖИТЬ, то после выполнения пакета её уже не посмотреть. На время отладки закомментируйте строки УНИЧТОЖИТЬ — либо вставьте выборку до момента уничтожения, разбив пакет на части.

Порядок действий в консоли запросов
  1. 1
    Откройте консоль запросов и вставьте текст пакетного запроса
  2. 2
    Заполните значения параметров (периоды, ссылки, таблицы значений)
  3. 3
    В конец пакета добавьте: ВЫБРАТЬ * ИЗ ИмяВременнойТаблицы
  4. 4
    Выполните запрос и проанализируйте результат
  5. 5
    Уберите отладочную выборку перед переносом кода в конфигурацию

Способ 2: программный просмотр через МенеджерВременныхТаблиц

Когда запрос выполняется в коде, содержимое временной таблицы получают отдельным объектом Запрос, которому назначают тот же менеджер:

МВТ = Новый МенеджерВременныхТаблиц;

Запрос = Новый Запрос;

Запрос.МенеджерВременныхТаблиц = МВТ;

Запрос.Текст = "ВЫБРАТЬ Т.Номенклатура ПОМЕСТИТЬ ВТ_Товары ИЗ ...";

Запрос.Выполнить();

// Смотрим содержимое

ЗапросПросмотр = Новый Запрос;

ЗапросПросмотр.МенеджерВременныхТаблиц = МВТ;

ЗапросПросмотр.Текст = "ВЫБРАТЬ * ИЗ ВТ_Товары";

Результат = ЗапросПросмотр.Выполнить().Выгрузить();

Переменная Результат — обычная таблица значений. Её можно выгрузить в табличный документ, в дерево на форме, сериализовать или просто посмотреть в отладчике. Количество строк удобно проверять через Результат.Количество().

Обратите внимание: оба запроса обязаны ссылаться на один и тот же экземпляр МВТ. Если создать второй менеджер или не назначить его вовсе, запрос на просмотр упадёт с ошибкой, что таблица не найдена.

bsl
ЗапросПросмотр = Новый Запрос;
ЗапросПросмотр.МенеджерВременныхТаблиц = МВТ;
ЗапросПросмотр.Текст = "ВЫБРАТЬ * ИЗ ВТ_Товары";
ТЗ = ЗапросПросмотр.Выполнить().Выгрузить();

Способ 3: просмотр в отладчике

Отладчик конфигуратора позволяет посмотреть содержимое временной таблицы без изменения кода, но с небольшим трюком. Поставьте точку останова после строки Запрос.Выполнить(), где создана временная таблица.

Далее в окне «Вычислить выражение» (Shift+F9) создайте временный запрос прямо в отладке. Удобный приём — заранее подготовить в коде процедуру, которая принимает менеджер и имя таблицы и возвращает таблицу значений, и вызывать её из окна выражений:

// Функция для отладки

Функция ПоказатьВТ(МВТ, ИмяТаблицы)

З = Новый Запрос;

З.МенеджерВременныхТаблиц = МВТ;

З.Текст = "ВЫБРАТЬ * ИЗ " + ИмяТаблицы;

Возврат З.Выполнить().Выгрузить();

КонецФункции

В отладчике вызываете ПоказатьВТ(МВТ, "ВТ_Товары") — и таблица значений открывается для просмотра через кнопку «Показать значение в отдельном окне». Это безопасно: данные только читаются, сам запрос не изменяется.

Просмотр временных таблиц в СКД и типовых механизмах

В схеме компоновки данных временные таблицы тоже создаются, но отладка сложнее: запрос обёрнут в набор данных, а параметры подставляются компоновщиком. Практичный путь — скопировать текст запроса из набора данных в консоль запросов, вручную заполнить параметры (их список виден на закладке «Параметры» СКД) и дальше работать как с обычным пакетом.

Если отчёт строится на внешнем наборе данных (таблице значений), которую вы сами помещаете во временную таблицу программно, — отлаживайте код формирования этой таблицы до передачи в СКД. Разделите задачу: сначала добейтесь правильных данных в таблице, потом подключайте компоновку.

В типовых конфигурациях многие временные таблицы создаются внутри общих модулей проведения (например, таблицы движений документов). Там работает тот же приём: точка останова после формирования МВТ и просмотр через вспомогательный запрос в окне выражений.

Если пакетный запрос большой, не отлаживайте его целиком. Выполняйте пакет по частям: сначала до первого ПОМЕСТИТЬ, проверьте таблицу, затем добавляйте следующие части. Так ошибка локализуется за минуты, а не за часы.
ПЗ
Практическое замечание

Частые ошибки и ограничения

Самая распространённая проблема — «Таблица не найдена» при попытке прочитать временную таблицу. Причины почти всегда одни и те же: использован другой экземпляр менеджера временных таблиц, менеджер не назначен запросу вовсе, либо таблица уже уничтожена командой УНИЧТОЖИТЬ в тексте пакета.

Вторая группа ошибок связана с контекстом выполнения. Временные таблицы, созданные на сервере, недоступны на клиенте и наоборот. Если запрос выполняется в серверной процедуре, смотреть его содержимое нужно там же — либо выгрузить результат в таблицу значений и вернуть на клиент для показа.

Третья ловушка — производительность отладочной выборки. Команда ВЫБРАТЬ * ИЗ ВТ на таблице в миллионы строк может надолго занять сервер. На продуктивной базе ограничивайте выборку: добавьте ПЕРВЫЕ 1000 или отбор по ключевому условию. И помните: временные таблицы занимают ресурсы СУБД, поэтому в рабочем коде их принято уничтожать после использования.

Типичные ошибки
01
Создание нового МенеджерВременныхТаблиц для запроса просмотра — таблица не найдена, потому что она живёт в другом менеджере
02
Попытка посмотреть таблицу после УНИЧТОЖИТЬ в пакете — данных уже нет, на время отладки комментируйте уничтожение
03
ВЫБРАТЬ * без ограничений на большой таблице в продуктиве — риск длительной блокировки ресурсов сервера
04
Поиск временной таблицы в клиентском контексте, хотя она создана на сервере — контексты не разделяют МВТ

Как проверить результат и что запомнить

Признак правильно организованной отладки прост: запрос на просмотр выполняется без ошибок и возвращает осмысленное число строк. Если строк ноль, хотя по логике они должны быть, — проверяйте параметры исходного пакета, соединения таблиц и условия отбора в части, создающей временную таблицу.

Для систематической работы держите под рукой три инструмента: консоль запросов для интерактивной отладки, вспомогательную функцию просмотра для отладчика и привычку разбивать пакет на части. Этого достаточно, чтобы видеть содержимое любой временной таблицы в любой конфигурации.

Контрольные точки

Как проверить результат

Запрос просмотра выполняется
Норма

Возвращается таблица без ошибки «Таблица не найдена»

Тревожный признак

Ошибка «Таблица не найдена» — неверный или отсутствующий МВТ

Количество строк
Норма

Число строк соответствует ожиданиям по логике отбора

Тревожный признак

0 строк или явно лишние дубли — ошибка в соединениях или отборе пакета

Состав колонок
Норма

Все поля, помещённые в ВТ, присутствуют и заполнены

Тревожный признак

Поля пустые или отсутствуют — ошибка в тексте ПОМЕСТИТЬ

Итог

Что важно запомнить

Временная таблица доступна только через свой МенеджерВременныхТаблиц. Смотрите её либо в консоли запросов добавлением «ВЫБРАТЬ * ИЗ ИмяТаблицы» в конец пакета, либо программно отдельным запросом с тем же менеджером. На время отладки отключайте УНИЧТОЖИТЬ и ограничивайте выборку на больших данных.

Частые вопросы

Можно ли посмотреть временную таблицу после выполнения всего кода, а не в момент отладки?

Нет, если менеджер временных таблиц уже вышел из области видимости или был создан неявно. Сохранить данные можно только заранее: выгрузите временную таблицу в таблицу значений и передайте её дальше или поместите во временное хранилище.

Почему консоль запросов не показывает мою временную таблицу?

Чаще всего таблица уничтожается командой УНИЧТОЖИТЬ внутри пакета либо консоль выполняет только последний запрос пакета. Закомментируйте уничтожение и добавьте в конец явную выборку «ВЫБРАТЬ * ИЗ ИмяТаблицы».

Как посмотреть временную таблицу, созданную внутри типового документа при проведении?

Поставьте точку останова в модуле проведения после формирования менеджера временных таблиц, затем в окне «Вычислить выражение» выполните вспомогательный запрос с этим менеджером. Удобно заранее добавить в конфигурацию отладочную функцию, принимающую МВТ и имя таблицы.

Видны ли временные таблицы другим пользователям или сеансам?

Нет. Временные таблицы приватны для сеанса и конкретного менеджера: другой пользователь или другой сеанс их не увидит. Это делает их безопасными для промежуточных расчётов, но требует отлаживать код в том же сеансе, где таблица создана.

Можно ли сохранить содержимое временной таблицы в файл?

Да: выгрузите её в таблицу значений через Выполнить().Выгрузить(), а затем сохраните, например, через ЗначениеВФайл, сериализуйте в XML или выведите в табличный документ и сохраните его в Excel. Сама временная таблица напрямую в файл не сохраняется.

Сколько временных таблиц может быть в одном запросе?

Жёсткого ограничения платформа не накладывает, но каждая таблица расходует память и ресурсы СУБД. На практике пакеты с десятками таблиц работают, однако запросы следует упрощать и уничтожать ненужные таблицы, чтобы не деградировала производительность.