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