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

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

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

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

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

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

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

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

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

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

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

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

Запрос.МенеджерВременныхТаблиц.Таблицы[0].Получить()

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

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

Способ 2: программная выгрузка временной таблицы

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

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

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

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

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

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

Важный нюанс: запрос на выборку из временной таблицы обязательно должен использовать тот же экземпляр менеджера. Если создать новый МенеджерВременныхТаблиц или не задать свойство вовсе, запрос завершится ошибкой «Таблица не найдена: ВТ_Данные», потому что в новом менеджере этой таблицы нет.

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

Способ 3: консоль запросов и инструменты разработчика

Наиболее удобный путь для анализа сложных пакетных запросов — консоль запросов. В типовых конфигурациях на БСП есть встроенная «Консоль запросов» (Администрирование → Печатные формы, отчеты и обработки, либо через функциональность разработчика). Также широко используются внешние инструменты, например консоль запросов с диска ИТС или подсистема «Инструменты разработчика».

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

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

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

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

Если Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ВТ_Данные") <> Неопределено Тогда

// таблица существует, можно обращаться

КонецЕсли;

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

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

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

Большинство проблем с просмотром и использованием ВТ сводится к нескольким повторяющимся причинам. Их стоит проверять в первую очередь, прежде чем углубляться в логику запроса.

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

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

Проверка результата и завершение работы

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

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

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

Таблица есть в коллекции Таблицы менеджера
Норма

Найти(Имя) возвращает элемент

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

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

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

Совпадает с ожидаемым объёмом выборки

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

0 строк или кратно больше ожидаемого (декартово произведение)

Значения ключевых полей
Норма

Поля связи заполнены и совпадают по типам

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

NULL или несовпадение типов — соединения не сработают

Когда диагностика завершена, удалите отладочный код выгрузки из рабочего кода. Если временные таблицы больше не нужны в рамках процедуры, их можно явно уничтожить запросом УНИЧТОЖИТЬ ИмяТаблицы — это освобождает память сервера СУБД, что заметно при массовых операциях.

Итог

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

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

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

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

Да, через консоль запросов в режиме предприятия — типовую из БСП или внешнюю. Она выполняет пакетный запрос и показывает все временные таблицы как отдельные результаты, конфигуратор для этого не нужен. Потребуются только права на запуск обработок.

Почему в отладчике коллекция Таблицы пустая?

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

Как посмотреть ВТ, если запрос выполняется в фоновом задании?

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

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

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

Чем метод Получить() отличается от нового запроса к ВТ?

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

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

Выполните запрос с текстом «УНИЧТОЖИТЬ ИмяТаблицы», передав ему тот же менеджер. Это освобождает память сервера СУБД. Если менеджер больше не нужен целиком, достаточно прекратить использование объекта — таблицы удалятся при его уничтожении.