Можно ли передавать между запросами временную таблицу?
Комментарии (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;
// ТаблицаЗначений можно передавать между подключениями
// Но она занимает память приложения
Итог
Да, можно передавать ВТ между запросами, но:
- Только в рамках одной сессии СУБД
- Используя одно подключение для всех запросов
- ВТ удаляется при закрытии подключения
- Для независимости — используйте ТаблицаЗначений в памяти
Похожие вопросы
- Как работают регламентные задания и чем они отличаются от фоновых задач?
- Почему нельзя использовать запросы в цикле?
- Какие задачи администрирования СУБД важны для 1С-разработчика?
- Для каких случаев обращение через точку опасно?
- В чем разница между HTTP и Web-сервисами?
- Имеет ли значение порядок измерений в регистрах 1С?
- Что такое сеанс в 1С и как он используется?
- Когда появляется виртуальная таблица субконто для регистра бухгалтерии?
- Какие универсальные коллекции нельзя передавать между клиентом и сервером?
- Для чего нужна закладка "Индексированные"?
- Что такое определяемые типы в 1С?
- В чём разница между директивами &НаСервере и &НаСервереБезКонтекста?
- Зачем дорабатывать проведение документа через подписку?
- Для чего нужна конструкция РАЗРЕШЕННЫЕ?
- Опиши принцип работы со сторонними API
- Какие знаешь типы блокировок бд?
- Какие наборы данных можно использовать в СКД?
- Сколько таблиц используется для хранения констант?
- Почему возникает ошибка «В данной транзакции уже происходили ошибки»?
- Что такое XDTO в 1С и зачем он нужен?