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