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

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

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

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

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

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

Ниже разобраны конкретные способы: через выражения в отладчике, через консоль кода, через вспомогательную процедуру выгрузки, а также ограничения и типичные ошибки, из-за которых содержимое временных таблиц «не видно».

Где хранятся временные таблицы и почему их не видно напрямую

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

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

Способ 1: просмотр через «Вычислить выражение»

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

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

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

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

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

Просмотр через выражение
  1. 1
    Поставьте точку останова после строки Запрос.Выполнить() и запустите отладку
  2. 2
    Откройте «Вычислить выражение» (Shift+F9) и проверьте список: Запрос.МенеджерВременныхТаблиц.Таблицы
  3. 3
    Найдите нужную таблицу по имени и посмотрите КоличествоСтрок
  4. 4
    Вычислите выражение с ПолучитьДанные().Выгрузить() и откройте полученную таблицу значений

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

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

На практике в одно выражение это уложить сложно, поэтому многие разработчики используют консоль кода (внешнюю обработку, позволяющую выполнять произвольный код в контексте сеанса) или временно вставляют отладочный фрагмент прямо в модуль:

ЗапросОтладки = Новый Запрос;

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

ЗапросОтладки.Текст = "ВЫБРАТЬ * ИЗ ВТ_Товары";

Результат = ЗапросОтладки.Выполнить().Выгрузить();

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

Способ 3: универсальная процедура выгрузки всех временных таблиц

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

Для Каждого ВТ Из Запрос.МенеджерВременныхТаблиц.Таблицы Цикл

ТЗ = ВТ.ПолучитьДанные().Выгрузить();

// ТЗ можно вывести, сохранить или просмотреть в отладчике

КонецЦикла;

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

Что мешает увидеть данные: типичные ошибки

Чаще всего содержимое временных таблиц «не видно» по организационным причинам, а не из-за ограничений платформы. Разбор типичных ситуаций экономит время отладки.

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

Отдельная ситуация — динамически формируемый текст запроса. Если имя временной таблицы собирается программно, сначала стоит вычислить сам текст запроса в отладчике и убедиться, какое имя реально получилось.

Как проверить, что вы видите актуальные данные

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

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

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

Количество строк в выгруженной таблице
Норма

Совпадает со свойством КоличествоСтрок у описания временной таблицы

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

Таблица пустая, хотя по логике данные должны быть — проверьте момент остановки и условия запроса

Набор колонок
Норма

Колонки соответствуют полям, перечисленным в тексте запроса с ПОМЕСТИТЬ

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

Лишние или отсутствующие колонки — возможно, смотрите не ту таблицу или старую версию текста запроса

Список таблиц менеджера
Норма

Все ожидаемые таблицы пакета присутствуют в Таблицы менеджера

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

Части таблиц нет — запрос выполнен не полностью или менеджер пересоздавался

Ограничения и альтернативы

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

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

Итог

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

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

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

Почему Запрос.МенеджерВременныхТаблиц пустой (Неопределено) в отладчике?

Значит, менеджер не был назначен запросу в коде. Платформа создала временный менеджер на время выполнения запроса, и после Выполнить() он уничтожен. Чтобы временные таблицы сохранялись, перед выполнением нужно явно присвоить: Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц.

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

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

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

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

Чем ПолучитьДанные() отличается от нового запроса «ВЫБРАТЬ * ИЗ таблицы»?

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

Почему Найти("ИмяТаблицы") возвращает Неопределено, хотя таблица есть в запросе?

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

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

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