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