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