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

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

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

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

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

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

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

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

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

Способ 1. Перебор коллекции таблиц менеджера

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

Типовой код обхода выглядит так:

Для Каждого ОписаниеВТ Из МенеджерВТ.Таблицы Цикл

Результат = ОписаниеВТ.ПолучитьДанные();

ТЗ = Результат.Выгрузить();

Сообщить(ОписаниеВТ.ПолноеИмя + ": строк " + ТЗ.Количество());

КонецЦикла;

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

bsl
// Вывести содержимое всех временных таблиц менеджера
Для Каждого ОписаниеВТ Из МенеджерВТ.Таблицы Цикл
    ТЗ = ОписаниеВТ.ПолучитьДанные().Выгрузить();
    Сообщить("ВТ: " + ОписаниеВТ.ПолноеИмя + " | строк: " + ТЗ.Количество());
КонецЦикла;

Способ 2. Запрос к конкретной временной таблице

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

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

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

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

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

Этот способ удобен, когда нужно не просто посмотреть данные, а отфильтровать их: добавить ГДЕ, отсортировать, посчитать агрегаты. Фактически вы продолжаете пакетную работу с ВТ, но с диагностической целью.

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

Способ 3. Просмотр в отладчике через вычисление выражения

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

Порядок действий в отладчике
  1. 1
    Поставьте точку останова после строки Запрос.ВыполнитьПакет() или Выполнить()
  2. 2
    Запустите отладку и дождитесь остановки
  3. 3
    Нажмите Shift+F9 и введите МенеджерВТ.Таблицы.Количество() — убедитесь, что таблицы есть
  4. 4
    Вычислите МенеджерВТ.Таблицы.Получить(0).ПолноеИмя — узнайте имя первой ВТ
  5. 5
    Вычислите МенеджерВТ.Таблицы.Получить(0).ПолучитьДанные().Выгрузить() — откроется таблица значений с содержимым
  6. 6
    Просмотрите строки визуально или выгрузите в табличный документ

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

Способ 4. Консоль запросов и внешние инструменты

Консоль запросов (типовая из подсистемы «Инструменты разработчика» или популярные внешние обработки) показывает временные таблицы наглядно: после выполнения пакета можно выбрать любую ВТ из списка и открыть её содержимое отдельной кнопкой. Это самый удобный вариант, когда запрос сложный и таблиц много.

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

Сравнение способов просмотра

Перебор коллекции Таблицы в коде

Подходит для программной диагностики и логирования; требует изменения кода

Запрос ВЫБРАТЬ * ИЗ ВТ

Гибкая фильтрация и агрегаты; нужно знать имя таблицы

Отладчик, вычисление выражения

Быстро и без изменения кода; неудобно для очень больших таблиц

Консоль запросов

Наглядно для сложных пакетов; требует воспроизведения запроса вне кода

Как проверить, что временная таблица не пуста

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

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

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

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

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

Контрольные точки при диагностике

Количество таблиц в менеджере
Норма

Совпадает с числом конструкций ПОМЕСТИТЬ в выполненном пакете

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

Таблиц меньше — часть пакета не выполнилась или ВТ уничтожена УНИЧТОЖИТЬ

Число строк в промежуточной ВТ
Норма

Больше нуля и правдоподобно по смыслу отбора

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

Ноль строк — проверяйте условия соединений и отборов

Типы колонок выгруженной ТЗ
Норма

Совпадают с ожидаемыми типами полей запроса

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

Составной тип или NULL там, где ожидалась ссылка — ошибка в источнике данных

Типичные ошибки и ограничения

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

Вторая ошибка — обращение к ВТ из другого запроса без присвоения менеджера. Каждый Новый Запрос по умолчанию имеет пустой менеджер; пока вы не напишете Запрос.МенеджерВременныхТаблиц = МенеджерВТ, временные таблицы ему недоступны.

Третья группа проблем — ресурсные. Выгрузка огромной ВТ в таблицу значений в отладчике может занять заметное время и память клиентского или серверного процесса. Для больших таблиц ограничивайте выборку (ПЕРВЫЕ 100) или смотрите только количество и структуру колонок.

Типичные ошибки
01
Смотреть ВТ после выхода из функции, где создан менеджер — таблицы уже уничтожены, отладчик покажет пустую коллекцию
02
Забыть присвоить МенеджерВременныхТаблиц новому запросу — ошибка «Таблица не найдена» при обращении к ВТ
03
Выгружать миллионы строк в ТЗ ради просмотра — зависание отладчика и расход памяти; используйте ПЕРВЫЕ N
04
Путать ПолучитьДанные() с готовой таблицей значений — метод возвращает РезультатЗапроса, нужен Выгрузить()

FAQ

Можно ли посмотреть содержимое ВТ без отладчика и изменения кода?

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

Почему МенеджерВТ.Таблицы.Количество() возвращает 0, хотя запрос с ПОМЕСТИТЬ выполнился?

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

Чем ПолучитьДанные() отличается от запроса «ВЫБРАТЬ * ИЗ ВТ»?

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

Как посмотреть ВТ, созданную внутри СКД или динамического списка?

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

Можно ли сохранить содержимое ВТ между сеансами?

Временные таблицы не переживают завершение сеанса. Если данные нужны позже, выгрузите ВТ в таблицу значений и сериализуйте (например, через ЗначениеВСтрокуВнутр или JSON), либо запишите в регистр сведений.

Итог

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

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