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