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