Разработка и Конфигурация · 10 мин
Как посмотреть временные таблицы в 1С
Как посмотреть содержимое временных таблиц в 1С: отладка через точку останова, выгрузка в таблицу значений, работа с менеджером временных таблиц и типичные ошибки.
Временные таблицы в 1С — это промежуточные результаты запроса, которые хранятся в памяти сервера до конца сеанса менеджера временных таблиц. Они не отображаются в интерфейсе пользователя и не видны в конфигураторе напрямую, поэтому у разработчиков часто возникает вопрос: как посмотреть, что реально попало во временную таблицу, и почему запрос возвращает не те данные.
Проверить содержимое временной таблицы можно несколькими способами: через отладчик с вычислением выражения, через выгрузку результата запроса в таблицу значений, через консоль запросов с менеджером временных таблиц и через технологический журнал для анализа физического SQL-кода. Выбор способа зависит от того, где выполняется запрос — в отлаживаемом коде, в консоли или на сервере в рабочей базе.
Ниже разобраны рабочие приёмы просмотра временных таблиц, типичные ошибки при их отладке и способы проверить, что данные помещены и выбраны корректно.
Что такое временная таблица и где она хранится
Временная таблица создаётся конструкцией «ПОМЕСТИТЬ ИмяТаблицы» в тексте запроса. Она существует только внутри менеджера временных таблиц — объекта, который управляет её жизненным циклом. Если менеджер не задан явно, платформа создаёт его автоматически и уничтожает вместе с запросом после выполнения.
Физически временные таблицы хранятся в памяти сервера 1С или в СУБД (в зависимости от режима работы), но не в таблицах базы данных, доступных через конфигуратор. Поэтому увидеть их в списке объектов метаданных нельзя — только программно, в момент выполнения.
Важное следствие: временная таблица доступна только пока жив её менеджер. Если запрос выполнен с неявным менеджером, после вызова метода «Выполнить» или «Выгрузить» обратиться к временной таблице уже не получится — она будет удалена.
Просмотр через отладчик и вычисление выражения
Основной рабочий способ — отладка. Поставьте точку останова на строке после выполнения запроса, запустите сеанс в режиме отладки и, когда выполнение остановится, откройте окно «Вычислить выражение» (Shift+F9).
В поле выражения введите обращение к менеджеру временных таблиц запроса. Метод «ПолучитьДанные» возвращает результат запроса, а «Выгрузить» превращает его в таблицу значений, которую можно просмотреть в табличном виде прямо из отладчика.
Запрос.МенеджерВременныхТаблиц.Таблицы.Найти("ВТ_Товары").ПолучитьДанные().Выгрузить()Если запрос выполнялся без явного менеджера временных таблиц, свойство «МенеджерВременныхТаблиц» всё равно вернёт объект, созданный платформой, — но только если вычисление происходит до уничтожения запроса. На практике надёжнее заранее объявить менеджер явно: «Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц».
Чтобы посмотреть, какие вообще временные таблицы существуют в менеджере на текущий момент, вычислите выражение «Запрос.МенеджерВременныхТаблиц.Таблицы» и разверните коллекцию — у каждого элемента будет свойство «ПолноеИмя».
- 1Убедитесь, что у запроса задан менеджер временных таблиц (явно или неявно)
- 2Поставьте точку останова на строке после Запрос.Выполнить()
- 3Запустите отладку и дождитесь остановки
- 4Откройте «Вычислить выражение» (Shift+F9)
- 5Введите выражение получения данных временной таблицы и нажмите «Рассчитать»
- 6Дважды щёлкните по результату, чтобы открыть таблицу значений в просмотровом окне
Просмотр через консоль запросов
Консоль запросов — внешняя обработка, которая позволяет выполнять запросы интерактивно. Многие популярные консоли поддерживают работу с менеджером временных таблиц: можно выполнить пакет запросов целиком, а затем отдельно выбрать любую временную таблицу простым запросом «ВЫБРАТЬ * ИЗ ИмяТаблицы».
Чтобы этот приём сработал, менеджер временных таблиц должен быть общим для обоих запросов. В типовых консолях есть отдельная настройка или кнопка для просмотра временных таблиц после выполнения пакета — ищите в интерфейсе обработки пункт вроде «Временные таблицы» или «Показать ВТ».
Если ваша консоль не поддерживает менеджер, обойдите ограничение: замените в тексте «ПОМЕСТИТЬ ВТ_Товары» на выборку без помещения, чтобы увидеть промежуточный результат как обычный результат запроса. После отладки верните конструкцию ПОМЕСТИТЬ на место.
Программная выгрузка временной таблицы в таблицу значений
Когда отладчик недоступен (например, код выполняется в фоновом задании или на сервере без интерактивной сессии), содержимое временной таблицы можно выгрузить программно и вывести в сообщение, журнал регистрации или файл.
Для этого создаётся отдельный запрос с тем же менеджером временных таблиц, который выбирает данные из нужной ВТ. Результат выгружается в таблицу значений, и дальше её можно обойти в цикле или сериализовать.
ЗапросВТ = Новый Запрос;
ЗапросВТ.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
ЗапросВТ.Текст = "ВЫБРАТЬ * ИЗ ВТ_Товары";
ТЗ = ЗапросВТ.Выполнить().Выгрузить();
Для Каждого Строка Из ТЗ Цикл
Сообщить(Строка.Номенклатура);
КонецЦикла;Для больших таблиц вывод через «Сообщить» неудобен. Практичнее выгрузить таблицу значений в табличный документ методом «Вывести» или сохранить её во временный файл (например, через «ЗначениеВСтрокуВнутр» или выгрузку в MXL) и открыть отдельно.
Анализ через технологический журнал
Технологический журнал показывает физический SQL-код, который платформа отправляет в СУБД, включая создание временных таблиц и обращения к ним. Это помогает понять, какой запрос реально выполняется, какие индексы используются и не превращается ли обращение к ВТ в полное сканирование.
Включите в конфигурационном файле logcfg.xml события DBMSSQL и DBPOSTGRS (или соответствующие вашей СУБД) с детализацией, выполните проблемный запрос и найдите в журнале текст SQL. Временные таблицы на уровне СУБД обычно видны как таблицы с системными именами, создаваемые в tempdb или аналогичном хранилище.
Этот способ не показывает данные в привычном виде, но незаменим, когда проблема не в содержимом, а в производительности: например, запрос к временной таблице выполняется минутами из-за отсутствия индекса.
Типичные ошибки при работе с временными таблицами
Самая частая проблема — ошибка «Таблица не найдена» при обращении к ВТ. Причина почти всегда в том, что запрос выполняется с другим менеджером временных таблиц или менеджер уже уничтожен. Проверьте, что свойство «МенеджерВременныхТаблиц» заполнено до выполнения и передаётся во все последующие запросы.
Вторая типичная ситуация — временная таблица пуста, хотя данные в базе есть. Проверьте условия отбора в запросе, который помещает данные в ВТ, параметры виртуальных таблиц (период, организация) и типы параметров: несовпадение типа параметра с типом поля часто приводит к тихому отсутствию строк.
Отдельная ошибка — попытка посмотреть содержимое ВТ, выгружая её полностью, когда в ней сотни тысяч строк. Отладчик может зависнуть надолго. Ограничивайте выборку: «ВЫБРАТЬ ПЕРВЫЕ 100 * ИЗ ВТ».
Проверка результата и ограничения
После просмотра временной таблицы убедитесь, что её содержимое соответствует ожиданиям: количество строк, наличие ключевых полей, отсутствие дублей по соединительным полям. Дубли в ВТ — частая причина задвоения сумм в итоговом запросе при соединении.
Как проверить результат
Таблицы.Найти(Имя) возвращает объект, а не Неопределено
Возвращается Неопределено — ВТ не создана или менеджер другой
Число строк совпадает с ожидаемым по логике отбора
Ноль строк или в разы больше ожидаемого — проверяйте условия и соединения
Поля соединения заполнены и уникальны на нужном уровне
NULL в ключевых полях или дубли — итоговый запрос даст искажённые суммы
Помните об ограничениях: временные таблицы живут только в рамках своего менеджера, не передаются между клиентом и сервером и недоступны после завершения вызова. Если промежуточные данные нужны между вызовами — используйте таблицы значений или параметры, а не ВТ.
Что важно запомнить
Посмотреть временную таблицу можно через отладчик выражением с ПолучитьДанные().Выгрузить(), через консоль запросов с общим менеджером ВТ или программной выгрузкой отдельным запросом. Ключевое условие — один и тот же менеджер временных таблиц и его «живость» на момент обращения.
Частые вопросы
Как посмотреть временную таблицу, если запрос выполняется в типовом коде, который нельзя менять?
Используйте точку останова без изменения кода: остановитесь на строке после выполнения запроса и вычислите выражение через менеджер временных таблиц объекта запроса. Если переменная запроса локальна и недоступна, поставьте точку с условием внутри процедуры, где запрос ещё жив.
Почему «Таблицы.Найти» возвращает Неопределено, хотя запрос с ПОМЕСТИТЬ выполнился?
Чаще всего вы смотрите не тот менеджер: запрос выполнялся с неявным менеджером, который уже уничтожен, либо обращаетесь к менеджеру другого объекта запроса. Проверяйте коллекцию «Таблицы» именно у того запроса, который выполнял пакет, и сразу после выполнения.
Можно ли посмотреть временную таблицу в консоли запросов на тонком клиенте?
Да, если консоль поддерживает менеджер временных таблиц и выполнение пакетных запросов. Выполните пакет, затем отдельным запросом выберите данные из ВТ. Если консоль этого не умеет, временно уберите ПОМЕСТИТЬ и посмотрите промежуточный результат как обычную выборку.
Как узнать, сколько строк во временной таблице, не выгружая её целиком?
Выполните запрос «ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ ИмяВТ» с тем же менеджером временных таблиц. Это быстро даже для больших таблиц и помогает понять, стоит ли выгружать данные для просмотра или лучше ограничить выборку.
Видны ли временные таблицы в SQL Server Management Studio?
Физические временные таблицы создаются в tempdb и существуют только в рамках соединения, которое их создало. Из другого соединения их данные не увидеть, поэтому прямой просмотр через SSMS практически бесполезен — используйте отладчик платформы или технологический журнал.
Что делать, если временная таблица создаётся внутри запроса к СКД?
В СКД менеджер временных таблиц задаётся программно при инициализации процессора компоновки. Создайте менеджер, передайте его в конструктор процессора, выполните компоновку — после этого ВТ будут доступны для просмотра тем же способом через отдельный запрос.