← Назад к вопросам

Можно ли передавать между запросами временную таблицу?

2.2 Middle🔥 121 комментариев
#Запросы и оптимизация#СУБД и хранение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Передача временных таблиц между запросами в 1С

Короткий ответ: ДА, но с условиями

Временная таблица может быть передана между запросами, но это возможно только в рамках одной сессии СУБД (одного подключения). Передавать временную таблицу между разными подключениями или сеансами невозможно.

Что такое временная таблица

Временная таблица (ВТ) в 1С — это результирующая таблица запроса, созданная в памяти СУБД, которая существует только в текущей сессии подключения:

Выбрать
    Товары.Ссылка,
    Товары.Наименование,
    Товары.Цена
В РегистрСведений.ЦеныТоваров
В ВремТабл1  // ← создание ВТ с именем ВремТабл1

Как использовать ВТ в цепочке запросов

Сценарий: вам нужно получить данные в первом запросе, затем использовать их во втором.

// Первый запрос — создаёт ВТ
Запрос1 = Новый Запрос(
    "ВЫБРАТЬ
        Товары.Ссылка КАК Товар,
        Товары.Наименование,
        СУММА(ДвижениеТоваров.Количество) КАК КоличествоНаСкладе
    ИЗ РегистрНакопления.ТоварыНаСкладах КАК ДвижениеТоваров
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары
        НА ДвижениеТоваров.Номенклатура = Товары.Ссылка
    СГРУППИРОВАТЬ ПО
        Товары.Ссылка,
        Товары.Наименование
    В ВремТабл1  // ← создание ВТ
"
);
Результат1 = Запрос1.Выполнить();

// Второй запрос — использует ВТ из первого
Запрос2 = Новый Запрос(
    "ВЫБРАТЬ
        ВремТабл1.Товар,
        ВремТабл1.Наименование,
        ВремТабл1.КоличествоНаСкладе
    ИЗ ВремТабл1  // ← использование ВТ
    ГДЕ ВремТабл1.КоличествоНаСкладе > 100"
);
Результат2 = Запрос2.Выполнить();

Ключевое условие: одна сессия СУБД

Это работает только, если оба запроса выполняются в одном подключении:

// ✅ ПРАВИЛЬНО — одно подключение, одна ВТ
БД = Новое Соединение(ПараметрыПодключения);

Запрос1 = Новый Запрос("SELECT ... В ВремТабл1");
Запрос1.УстановитьСоединение(БД);
Результат1 = Запрос1.Выполнить();

Запрос2 = Новый Запрос("SELECT ВремТабл1 ...");
Запрос2.УстановитьСоединение(БД);  // ← ТО ЖЕ подключение!
Результат2 = Запрос2.Выполнить();  // ← ВТ видна!
// ❌ НЕПРАВИЛЬНО — разные подключения
Запрос1 = Новый Запрос("SELECT ... В ВремТабл1");
Запрос1.УстановитьСоединение(БД1);  // подключение 1
Результат1 = Запрос1.Выполнить();

Запрос2 = Новый Запрос("SELECT ВремТабл1 ...");
Запрос2.УстановитьСоединение(БД2);  // подключение 2 — ВТ НЕВИДНА!
Результат2 = Запрос2.Выполнить();   // Ошибка: таблица ВремТабл1 не существует

Время жизни ВТ

Временная таблица существует:

  • Пока открыто подключение к СУБД
  • После завершения последнего запроса в этом подключении, ВТ сохраняется
  • При закрытии подключения ВТ удаляется автоматически
БД = Новое Соединение(ПараметрыПодключения);

Запрос1 = Новый Запрос("SELECT ... В ВремТабл1");
Запрос1.УстановитьСоединение(БД);
Результат1 = Запрос1.Выполнить();  // ВТ1 создана

// ВТ существует здесь и видна для следующих запросов

БД.Закрыть();  // ← ВТ УДАЛЕНА автоматически

Практический пример: цепочка обработок

Частый сценарий — обработать данные в несколько этапов:

// Этап 1: выборка товаров с низким остатком
Запрос = Новый Запрос(
    "ВЫБРАТЬ
        Товары.Ссылка,
        Товары.Наименование,
        СУММА(Движение.Количество) КАК Остаток
    ИЗ РегистрНакопления.ТоварыНаСкладах КАК Движение
    СГРУППИРОВАТЬ ПО Товары.Ссылка
    ИМЕЮЩИЕ Остаток < 50
    В ТоварыДляЗаказа"  // ← ВТ
);
Запрос.Выполнить();

// Этап 2: получить поставщиков этих товаров
Запрос = Новый Запрос(
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
        Поставки.Поставщик,
        ТоварыДляЗаказа.Наименование
    ИЗ ТоварыДляЗаказа  // ← использование ВТ из этапа 1
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПоставщикиТоваров КАК Поставки
        НА ТоварыДляЗаказа.Товар = Поставки.Товар"
);
Результат = Запрос.Выполнить();

Альтернатива: сохранение в памяти (Таблица значений)

Если вы хотите независимости от подключения, используйте ТаблицаЗначений:

// Вместо ВТ в СУБД — используем память 1С
Таблица = Новая ТаблицаЗначений;
Таблица.Колонки.Добавить("Товар");
Таблица.Колонки.Добавить("Количество");

// Заполнить данные
Строка = Таблица.Добавить();
Строка.Товар = ...
Строка.Количество = 100;

// ТаблицаЗначений можно передавать между подключениями
// Но она занимает память приложения

Итог

Да, можно передавать ВТ между запросами, но:

  • Только в рамках одной сессии СУБД
  • Используя одно подключение для всех запросов
  • ВТ удаляется при закрытии подключения
  • Для независимости — используйте ТаблицаЗначений в памяти
Можно ли передавать между запросами временную таблицу? | PrepBro