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