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