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

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

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

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

Временная таблица в 1С — это результат запроса, помещённый в менеджер временных таблиц и существующий только в рамках текущего сеанса работы с запросом. Посмотреть её содержимое «из коробки» в пользовательском интерфейсе нельзя: временные таблицы живут на сервере СУБД или в памяти сервера 1С и не отображаются в дереве объектов конфигурации. Поэтому разработчику приходится использовать специальные приёмы — отладчик, программную выгрузку или консоль запросов.

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

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

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

Ключевое следствие: увидеть временную таблицу средствами СУБД напрямую затруднительно, а в клиентском приложении её не существует вовсе. Все способы просмотра сводятся к одному — выполнить к временной таблице запрос и выгрузить результат в объект, который можно отобразить: таблицу значений или табличный документ.

Просмотр через отладчик конфигуратора

Самый быстрый способ — остановиться точкой останова после выполнения запроса и вычислить выражение. Откройте отладку (F5), поставьте точку на строке после «Запрос.Выполнить()», и когда выполнение остановится, нажмите Shift+F9 (Вычислить выражение) и введите обращение к менеджеру временных таблиц.

Универсальное выражение для просмотра любой временной таблицы выглядит так:

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

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

Порядок действий в отладчике
  1. 1
    Поставьте точку останова после строки Запрос.Выполнить() и запустите отладку (F5)
  2. 2
    Дождитесь остановки и нажмите Shift+F9 — откроется окно вычисления выражений
  3. 3
    Введите выражение обращения к временной таблице через МенеджерВременныхТаблиц и нажмите «Вычислить»
  4. 4
    Разверните полученную таблицу значений и проверьте строки, колонки и типы данных
  5. 5
    Сравните фактическое содержимое с ожидаемым и найдите расхождение

Программная выгрузка в таблицу значений и табличный документ

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

bsl
ВТ = Запрос.МенеджерВременныхТаблиц.ВременныеТаблицы["ВТ_Данные"];
ТЗ = ВТ.ПолучитьЗапрос().Выполнить().Выгрузить();

ТабДок = Новый ТабличныйДокумент;
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗ);
Построитель.Вывести(ТабДок);
ТабДок.Показать("Содержимое временной таблицы");

Обратите внимание: метод Показать() доступен только в клиентском контексте. Если код выполняется в серверной процедуре, оберните вывод в директиву &НаКлиенте либо передайте таблицу значений на клиента через временное хранилище. Для толстого клиента и управляемых форм подход идентичен — отличается только место вызова.

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

Просмотр через консоль запросов

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

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

Ограничение способа: консоль воспроизводит запрос изолированно. Если временная таблица строится на данных, которые в реальном коде формируются динамически (например, передаются как параметр-таблица значений), придётся вручную воспроизвести эти параметры в консоли, иначе результат будет отличаться от реального.

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

Отладчик конфигуратора

Подходит при разработке и тестировании на копии базы. Требует точки останова и права на отладку; на рабочем сервере отладка часто отключена.

Программная выгрузка в табличный документ

Работает без отладки, но требует изменения кода. Опасна в продуктиве — обязательно защищайте условием и удаляйте после диагностики.

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

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

Точка останова + табло (F3 по таблице значений)

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

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

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

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

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

Учтите, что таблица появляется в коллекции менеджера только после выполнения запроса, который её создаёт. Если вы смотрите коллекцию до выполнения пакета, она будет пустой — это нормально, а не признак ошибки.

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

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

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

Таблица есть в коллекции ВременныеТаблицы после выполнения запроса

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

Таблицы нет — запрос не выполнялся или ПОМЕСТИТЬ указан в другом менеджере

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

Число строк соответствует ожиданиям по логике отбора

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

Строк ноль или в разы больше из-за декартова произведения при соединении

Типы колонок
Норма

Типы соответствуют типам полей запроса

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

Неожиданные типы — например, строка вместо ссылки из-за ВЫРАЗИТЬ или объединения

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

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

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

Типичные ошибки
01
Обращение к временной таблице из нового запроса без передачи общего МенеджерВременныхТаблиц — ошибка «Таблица не найдена»
02
Попытка посмотреть таблицу после уничтожения менеджера — данные уже удалены, выгружайте в таблицу значений заранее
03
Отладочный Показать() в серверном коде рабочей базы — обрыв выполнения и возможная порча транзакций
04
Оценка содержимого по итоговому запросу вместо промежуточных таблиц — источник задвоения строк остаётся незамеченным
05
Использование имени таблицы с ошибкой регистра или опечаткой в квадратных скобках — выражение в отладчике возвращает Неопределено

Практические рекомендации по диагностике

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

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

Если запрос работает медленно, а временных таблиц много, полезно выводить не только содержимое, но и количество строк каждой таблицы сразу после её создания. Часто выясняется, что одна из промежуточных таблиц содержит сотни тысяч строк из-за отсутствия индексируемого отбора — и именно она тормозит весь пакет.
ПЗ
Практическое замечание

Часто задаваемые вопросы

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

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

Почему отладчик показывает ошибку при вычислении выражения с временной таблицей?

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

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

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

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

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

Почему временная таблица пустая, хотя запрос-источник возвращает данные?

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

Чем отличается ПОМЕСТИТЬ от выгрузки в таблицу значений?

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

Итог

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

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