Можно ли передавать между запросами временную таблицу?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Передача временных таблиц между запросами в 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;
// ТаблицаЗначений можно передавать между подключениями
// Но она занимает память приложения
Итог
Да, можно передавать ВТ между запросами, но:
- Только в рамках одной сессии СУБД
- Используя одно подключение для всех запросов
- ВТ удаляется при закрытии подключения
- Для независимости — используйте ТаблицаЗначений в памяти