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

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

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

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

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

Проверить содержимое временной таблицы можно несколькими способами: через отладчик с вычислением выражения, через выгрузку результата запроса в таблицу значений, через консоль запросов с менеджером временных таблиц и через технологический журнал для анализа физического SQL-кода. Выбор способа зависит от того, где выполняется запрос — в отлаживаемом коде, в консоли или на сервере в рабочей базе.

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

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

Временная таблица создаётся конструкцией «ПОМЕСТИТЬ ИмяТаблицы» в тексте запроса. Она существует только внутри менеджера временных таблиц — объекта, который управляет её жизненным циклом. Если менеджер не задан явно, платформа создаёт его автоматически и уничтожает вместе с запросом после выполнения.

Физически временные таблицы хранятся в памяти сервера 1С или в СУБД (в зависимости от режима работы), но не в таблицах базы данных, доступных через конфигуратор. Поэтому увидеть их в списке объектов метаданных нельзя — только программно, в момент выполнения.

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

Просмотр через отладчик и вычисление выражения

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

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

1c
Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ВТ_Товары").ПолучитьДанные().Выгрузить()

Если запрос выполнялся без явного менеджера временных таблиц, свойство «МенеджерВременныхТаблиц» всё равно вернёт объект, созданный платформой, — но только если вычисление происходит до уничтожения запроса. На практике надёжнее заранее объявить менеджер явно: «Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц».

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

Порядок действий в отладчике
  1. 1
    Убедитесь, что у запроса задан менеджер временных таблиц (явно или неявно)
  2. 2
    Поставьте точку останова на строке после Запрос.Выполнить()
  3. 3
    Запустите отладку и дождитесь остановки
  4. 4
    Откройте «Вычислить выражение» (Shift+F9)
  5. 5
    Введите выражение получения данных временной таблицы и нажмите «Рассчитать»
  6. 6
    Дважды щёлкните по результату, чтобы открыть таблицу значений в просмотровом окне

Просмотр через консоль запросов

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

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

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

Программная выгрузка временной таблицы в таблицу значений

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

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

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

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

Анализ через технологический журнал

Технологический журнал показывает физический SQL-код, который платформа отправляет в СУБД, включая создание временных таблиц и обращения к ним. Это помогает понять, какой запрос реально выполняется, какие индексы используются и не превращается ли обращение к ВТ в полное сканирование.

Включите в конфигурационном файле logcfg.xml события DBMSSQL и DBPOSTGRS (или соответствующие вашей СУБД) с детализацией, выполните проблемный запрос и найдите в журнале текст SQL. Временные таблицы на уровне СУБД обычно видны как таблицы с системными именами, создаваемые в tempdb или аналогичном хранилище.

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

Типичные ошибки при работе с временными таблицами

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

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

Типичные ошибки
01
Обращение к ВТ из нового запроса без передачи менеджера — ошибка «Таблица не найдена»
02
Попытка посмотреть ВТ после уничтожения менеджера — данные уже недоступны, нужно заново выполнять пакет
03
Отладка ВТ с миллионами строк через выгрузку целиком — зависание отладчика; выбирайте первые 100–1000 строк
04
Неуничтоженные менеджеры в цикле — утечка памяти на сервере; явно присваивайте Неопределено после использования

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

Проверка результата и ограничения

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

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

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

Существование ВТ
Норма

Таблицы.Найти(Имя) возвращает объект, а не Неопределено

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

Возвращается Неопределено — ВТ не создана или менеджер другой

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

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

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

Ноль строк или в разы больше ожидаемого — проверяйте условия и соединения

Ключевые поля
Норма

Поля соединения заполнены и уникальны на нужном уровне

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

NULL в ключевых полях или дубли — итоговый запрос даст искажённые суммы

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

Итог

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

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

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

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

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

Почему «Таблицы.Найти» возвращает Неопределено, хотя запрос с ПОМЕСТИТЬ выполнился?

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

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

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

Как узнать, сколько строк во временной таблице, не выгружая её целиком?

Выполните запрос «ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ ИмяВТ» с тем же менеджером временных таблиц. Это быстро даже для больших таблиц и помогает понять, стоит ли выгружать данные для просмотра или лучше ограничить выборку.

Видны ли временные таблицы в SQL Server Management Studio?

Физические временные таблицы создаются в tempdb и существуют только в рамках соединения, которое их создало. Из другого соединения их данные не увидеть, поэтому прямой просмотр через SSMS практически бесполезен — используйте отладчик платформы или технологический журнал.

Что делать, если временная таблица создаётся внутри запроса к СКД?

В СКД менеджер временных таблиц задаётся программно при инициализации процессора компоновки. Создайте менеджер, передайте его в конструктор процессора, выполните компоновку — после этого ВТ будут доступны для просмотра тем же способом через отдельный запрос.