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

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

Временные таблицы 1С 8.3: как посмотреть содержимое в запросе

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

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

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

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

Что такое временная таблица и где она хранится

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

Физически временные таблицы размещаются на сервере СУБД (в tempdb для MS SQL Server или аналогичных областях для других СУБД) либо в памяти сервера 1С. Уничтожаются они при вызове МенеджерВременныхТаблиц.Закрыть(), при уничтожении объекта менеджера или при завершении сеанса. Таблицу также можно удалить явно командой УНИЧТОЖИТЬ ИмяТаблицы.

Ключевое следствие: увидеть временную таблицу можно только в контексте того менеджера, где она создана. Если выполнить новый запрос без привязки к менеджеру или с другим менеджером, таблица будет недоступна, и платформа выдаст ошибку «Таблица не найдена».

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

Самый универсальный способ — остановиться точкой останова после выполнения запроса и посмотреть результат. Если временная таблица выбирается в итоговом пакете, достаточно вычислить выражение Запрос.Выполнить().Выгрузить() в окне «Выражение» (Ctrl+Alt+E в конфигураторе) и открыть полученную таблицу значений.

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

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

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

Порядок действий в отладчике
  1. 1
    Поставьте точку останова после выполнения основного запроса
  2. 2
    Запустите отладку и дождитесь остановки
  3. 3
    Добавьте отладочный запрос с тем же МенеджерВременныхТаблиц или вычислите выражение Выгрузить()
  4. 4
    Откройте таблицу значений и проверьте строки и типы колонок
  5. 5
    После проверки удалите отладочный фрагмент из кода

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

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

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

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

Просмотр через пакет запросов и табличный документ

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

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

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

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

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

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

Типичные ошибки
01
Запрос к ВТ с новым менеджером временных таблиц — ошибка «Таблица не найдена»
02
Чтение ВТ после Закрыть() менеджера или после УНИЧТОЖИТЬ — таблица уже удалена
03
Пересоздание ВТ с тем же именем без УНИЧТОЖИТЬ — ошибка «Таблица уже существует»
04
Отладка большой ВТ без ПЕРВЫЕ N — выгрузка миллионов строк подвешивает сеанс
05
Попытка открыть таблицу значений напрямую в управляемой форме — недопустимый тип для отображения

Отдельно стоит ошибка повторного помещения: если пакет выполняется дважды с одним менеджером, второй ПОМЕСТИТЬ ВТ_Данные вызовет ошибку «Таблица уже существует». Перед повторным созданием добавьте УНИЧТОЖИТЬ ВТ_Данные или используйте разные имена.

Выбор способа просмотра под задачу

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

Если нужно показать содержимое ВТ пользователю или сохранить для анализа, выгружайте в таблицу значений и выводите через табличный документ или СКД. Для быстрой проверки «пусто или нет» достаточно Результат.Пустой или выборки первой строки.

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

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

Быстро и наглядно для готового текста запроса; требует переноса параметров и не видит ВТ из работающего кода

Отладчик + отладочный запрос

Видит реальные данные в момент выполнения кода; требует временной вставки кода и точки останова

Дополнительный запрос в пакете

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

Выгрузка в табличный документ

Подходит для передачи результата пользователю или в файл; требует больше кода и преобразований в управляемых формах

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

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

Видимость таблицы
Норма

Запрос к ВТ выполняется без ошибки «Таблица не найдена»

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

Ошибка — значит, другой менеджер ВТ или таблица уже уничтожена

Заполненность
Норма

Выгрузка содержит ожидаемое число строк, ключевые поля заполнены

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

Пустой результат — проверьте условия отбора и соединения в запросе-помещении

Типы колонок
Норма

Типы колонок ВТ совпадают с типами в последующих соединениях

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

Составные типы и NULL в ключевых полях — соединения дадут неполный результат

FAQ

Можно ли посмотреть временную таблицу средствами СУБД, например в SQL Server Management Studio?

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

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

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

Как посмотреть ВТ в управляемом приложении на тонком клиенте?

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

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

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

Можно ли сохранить содержимое временной таблицы между сеансами?

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

Чем временная таблица отличается от таблицы значений?

Временная таблица живёт на стороне СУБД и доступна только внутри запросов через менеджер ВТ; таблица значений — объект встроенного языка в памяти сеанса, с ней работают в коде и формах. ВТ можно выгрузить в таблицу значений методом Выгрузить(), а таблицу значений — передать в запрос как параметр и поместить во временную таблицу.

Итог

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

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