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

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

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

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

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

Проблема усугубляется тем, что временные таблицы живут на сервере (в клиент-серверном варианте — на сервере СУБД), а отладчик показывает только программные объекты встроенного языка. Поэтому стандартный просмотр переменной типа «МенеджерВременныхТаблиц» ничего не даст — нужно выполнять дополнительные запросы к этому менеджеру прямо из окна «Вычислить выражение».

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

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

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

В файловом варианте временные таблицы размещаются во временном хранилище платформы, в клиент-серверном — в базе tempdb на сервере СУБД (в MS SQL Server) или в аналогичных структурах PostgreSQL и Oracle. Отладчик работает с объектами встроенного языка и не имеет прямого доступа к этим структурам, поэтому развернуть менеджер в дереве переменных и увидеть строки таблицы невозможно в принципе.

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

Способ 1. Вычисление выражения в отладчике

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

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

bsl
ЗапросОтладки = Новый Запрос("ВЫБРАТЬ * ИЗ ВТ_Товары");
ЗапросОтладки.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
ТЗ = ЗапросОтладки.Выполнить().Выгрузить();

Однострочный вариант для окна «Вычислить выражение», если многострочный ввод неудобен: создайте выражение вида Новый Запрос("ВЫБРАТЬ * ИЗ ВТ_Товары") — но учтите, что присвоить менеджер и выполнить запрос одной строкой без промежуточной переменной не получится, поэтому обычно вводят несколько выражений последовательно: сначала создать запрос, затем присвоить менеджер, затем вычислить ЗапросОтладки.Выполнить().Выгрузить().

Результат — таблица значений — можно развернуть прямо в окне вычисления: коллекции строк отображаются с возможностью просмотра каждой строки и каждой колонки. Для больших таблиц удобнее сначала узнать количество строк выражением ТЗ.Количество(), а затем смотреть отдельные строки по индексу, например ТЗ[0].Номенклатура.

Порядок просмотра через выражение
  1. 1
    Поставьте точку останова после строки Запрос.Выполнить() и запустите отладку
  2. 2
    Откройте окно «Вычислить выражение» (Shift+F9)
  3. 3
    Создайте новый объект Запрос с текстом ВЫБРАТЬ * ИЗ нужной таблицы
  4. 4
    Присвойте ему тот же МенеджерВременныхТаблиц из контекста
  5. 5
    Вычислите Выполнить().Выгрузить() и разверните полученную таблицу значений
  6. 6
    Проверьте количество строк и значения ключевых колонок

Способ 2. Вспомогательная функция в общем модуле

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

Функция ВТ_ВТаблицуЗначений(МенеджерВТ, ИмяТаблицы) Экспорт

Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ " + ИмяТаблицы);

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

Возврат Запрос.Выполнить().Выгрузить();

КонецФункции

В отладчике остаётся вычислить одно выражение: ОбщегоНазначенияОтладка.ВТ_ВТаблицуЗначений(Запрос.МенеджерВременныхТаблиц, "ВТ_Товары"). Это сокращает ручной ввод и снижает риск опечатки в имени таблицы.

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

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

Многие инструменты разработчика (консоли запросов, в том числе входящие в подсистему «Инструменты разработчика» и аналогичные) умеют показывать список временных таблиц менеджера и их содержимое. Если запрос в коде отлаживается через такую консоль, временные таблицы видны в отдельной панели после выполнения пакета.

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

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

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

Вычисление выражения

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

Функция в общем модуле

Быстро при регулярной отладке, один вызов. Минус — требует изменения конфигурации или расширения и доступности серверного контекста.

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

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

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

Самая частая ситуация — выражение «ВЫБРАТЬ * ИЗ ВТ_Товары» возвращает ошибку «Таблица не найдена». Причина почти всегда в том, что вы обращаетесь не к тому менеджеру временных таблиц: временные таблицы видны только запросам с тем же экземпляром менеджера. Проверьте, что вы присвоили именно Запрос.МенеджерВременныхТаблиц из текущего контекста, а не создали новый.

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

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

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

Ограничения и риски при отладке на сервере

В клиент-серверном варианте вычисление выражений с выполнением запроса происходит на сервере 1С. Это значит, что отладка серверного кода должна быть включена на сервере (параметр отладки в свойствах сервера или запуск с ключом отладки), иначе точки останова на сервере просто не сработают.

Учтите и транзакционный контекст: если временная таблица создана внутри транзакции, а отладочный запрос выполняется в том же соединении, он её увидит. Но длительная остановка в отладчике внутри транзакции держит блокировки в СУБД — на рабочей базе это может заблокировать других пользователей. Отлаживайте такие места на копии базы.

Ещё одно ограничение — объём: выгрузка временной таблицы с сотнями тысяч строк в таблицу значений в окне вычисления может занять заметное время и память. В таких случаях сначала вычислите ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ ВТ, а затем выбирайте с ограничением ВЫБРАТЬ ПЕРВЫЕ 100 или с фильтром по интересующим записям.

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

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

Полезный приём — вычислить агрегатное выражение прямо в отладчике: ВЫБРАТЬ Поле, КОЛИЧЕСТВО() ИЗ ВТ СГРУППИРОВАТЬ ПО Поле ИМЕЮЩИЕ КОЛИЧЕСТВО() > 1. Такой запрос сразу покажет дубли по ключу без ручного перебора строк.

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

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

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

Совпадает с ожиданием по логике запроса

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

Ноль строк или многократно больше ожидаемого — ошибка в условиях или соединениях выше по коду

Ключевые поля связи
Норма

Заполнены, без NULL и пустых ссылок

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

NULL или пустые значения — последующие соединения потеряют строки

Дубли по ключу
Норма

Одна строка на ключ

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

Несколько строк на ключ — при соединении произойдёт размножение записей

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

Итог

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

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

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

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

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

Можно ли посмотреть временную таблицу после завершения процедуры, где она создана?

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

Запрос в отладчике выдаёт «Таблица не найдена», хотя таблица точно создаётся. Что не так?

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

Как посмотреть только часть строк большой временной таблицы?

Используйте в тексте отладочного запроса конструкции ВЫБРАТЬ ПЕРВЫЕ N, условия ГДЕ или сначала вычислите количество строк агрегатным запросом. Выгружать целиком таблицу на сотни тысяч строк в окно вычисления не стоит — это долго и требует много памяти.

Работает ли этот приём в мобильной платформе или веб-клиенте?

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

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

Напрямую редактировать временную таблицу нельзя — она доступна только на чтение через запросы. Но можно выполнить запрос с конструкцией УНИЧТОЖИТЬ и заново создать таблицу с нужными данными тем же менеджером, фактически подменив её содержимое для дальнейшей отладки.