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