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