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

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

Как просмотреть временную таблицу в запросе 1С

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

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

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

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

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

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

Физически временные таблицы размещаются на сервере СУБД (в tempdb для MS SQL Server) или в памяти файловой базы. Доступ к ним возможен только через тот же менеджер временных таблиц, в котором они созданы. Если передать запросу другой менеджер, таблица будет «не найдена», хотя в исходном коде она присутствует.

Ключевое следствие: для просмотра содержимого нужно либо выполнить дополнительный запрос ВЫБРАТЬ * ИЗ ИмяВременнойТаблицы к тому же менеджеру, либо воспользоваться методом ПолучитьДанные() у описания временной таблицы в отладчике.

Просмотр через отладчик конфигуратора

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

Выражение для просмотра выглядит так:

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

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

Просмотр временной таблицы в отладчике
  1. 1
    Поставьте точку останова на строке после Запрос.Выполнить(), где создаётся временная таблица
  2. 2
    Запустите отладку и дождитесь остановки
  3. 3
    Откройте «Вычислить выражение» (Shift+F9) и введите обращение к менеджеру временных таблиц с методом ПолучитьДанные().Выгрузить()
  4. 4
    Проверьте количество строк и содержимое колонок в открывшейся таблице значений

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

Просмотр через консоль запросов

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

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

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

Программная выгрузка содержимого временной таблицы

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

ЗапросПроверки = Новый Запрос;

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

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

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

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

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

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

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

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

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

Типичные ошибки
01
Создание нового МенеджерВременныхТаблиц для проверочного запроса — таблица не найдена, хотя в исходном запросе она есть
02
Точка останова до выполнения пакета — коллекция Таблицы пуста, разработчик ошибочно считает, что таблица не создалась
03
Уничтожение временной таблицы командой УНИЧТОЖИТЬ раньше, чем выполнена проверка
04
Проверка в консоли запросов без переноса параметров — содержимое отличается от реального выполнения
05
Вывод большой таблицы в Сообщить() — повисание клиентского сеанса

Выбор способа под конкретную ситуацию

Универсального метода нет: выбор зависит от того, где выполняется код и насколько глубоко нужно копать. Разовая проверка при разработке быстрее всего делается в отладчике. Проектирование сложного пакетного запроса удобнее вести в консоли. Диагностика на рабочей базе требует программной выгрузки с минимальным вмешательством.

Маршрут решения

Как выбрать способ

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

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

Итог

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

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

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

Можно ли посмотреть временную таблицу без отладчика?

Да. Выполните отдельный запрос с текстом «ВЫБРАТЬ * ИЗ ИмяТаблицы» к тому же менеджеру временных таблиц и выгрузите результат в таблицу значений. Её можно вывести на форму, сохранить в файл или записать контрольные итоги в журнал регистрации.

Почему выражение в отладчике возвращает ошибку «Таблица не найдена»?

Чаще всего точка останова стоит до выполнения пакета, создающего таблицу, либо проверочный запрос использует другой менеджер временных таблиц. Проверьте свойство Запрос.МенеджерВременныхТаблиц — там должен быть тот же объект, что и у запроса, создавшего таблицу.

Как узнать, сколько строк во временной таблице, не выгружая её целиком?

Выполните запрос «ВЫБРАТЬ КОЛИЧИЧЕСТВО(*) ИЗ ИмяТаблицы» к тому же менеджеру. В отладчике можно также вычислить выражение с ПолучитьДанные().Выгрузить().Количество() — но для больших таблиц первый вариант быстрее.

Видны ли временные таблицы одного менеджера в другом запросе?

Да, если запросу присвоен тот же объект МенеджерВременныхТаблиц. Это штатный механизм: один запрос создаёт таблицы, последующие запросы читают их. Если менеджер не присвоен явно, платформа создаёт новый пустой — и таблицы будут недоступны.

Можно ли просмотреть временную таблицу в фоновом задании?

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

Что делать, если временная таблица оказалась пустой?

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