Оператор ПОМЕСТИТЬ (Временные таблицы)
4 мин
Оператор ПОМЕСТИТЬ <ПроизвольноеИмяТаблицы> - Создает из результата запроса временную таблицу и сохраняет его результат в памяти на время выполнения пакета запросов.
Используется только сразу после секции ВЫБРАТЬ и перечисления всех полей.
Например:
ВЫБРАТЬ
"Какое-то значение" КАК СтроковоеПоле
ПОМЕСТИТЬ ЛюбоеНазваниеТаблицы
;
ВЫБРАТЬ
ЛюбоеНазваниеТаблицы.СтроковоеПоле
ИЗ ЛюбоеНазваниеТаблицы КАК ЛюбоеНазваниеТаблицы
Результат:
СтроковоеПоле |
---|
Какое-то значение |
или так
ВЫБРАТЬ
Диваны.Наименование КАК Диван
ПОМЕСТИТЬ ВТНаименованияДиванов
ИЗ Справочник.Диваны КАК Диваны
;
ВЫБРАТЬ
ВТНаименованияДиванов.Диван КАК Диван
ИЗ ВТНаименованияДиванов КАК ВТНаименованияДиванов
Результат:
Диван |
---|
Диван-кровать Парма |
Диван-кровать Уно |
Диван-кровать Твигги |
Диван-кровать Эрик |
Диван-кровать Люси |
Диван Ночной путник |
Диван-кровать Люси |
Диван-кровать Люси |
Диван-кровать Люси |
Диван-кровать Твигги Уценка |
оказывается, в нашей базе много диванов с одинаковым названием.
Уточним терминологию. Пакетом запросов называется запрос содержащий в себе одновременно несколько запросов, разделенных символов точки с запятой (;). С практической точки зрения такие запросы чаще всего используются при вычислениях с помощью временных таблиц. Когда мы в одном тексте запроса производим несколько преобразований над данными в разных частях запроса выполняемых по очереди. Это упрощает как чтение, так и некоторые сложные вычисления позволяет разбить на этапы. А так же некоторые вычисления вообще невозможны без использования временных таблиц.
Иногда пакетные запросы используют для оптимизации вычислений в сложных запросах, они позволяют за одно обращение к СУБД получить данные для разных частей программы 1С с помощью кода 1С. Смотри статью пакетные запросы
Пример 1. Вычисление без временных таблиц, с использованием вложенного запроса:
Представим что мы хотим найти все диваны, у которых цена равна максимальной. Для этого нам нужно сначала найти максимальную цену. А после этого найти диваны у которых цена равна максимальной.
ВЫБРАТЬ
Диваны.Наименование КАК Наименование,
Диваны.Код,
Диваны.Цена КАК Цена
ИЗ
Справочник.Диваны КАК Диваны
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
(
ВЫБРАТЬ
МАКСИМУМ(Диваны.Цена) КАК Цена
ИЗ
Справочник.Диваны КАК Диваны
) КАК МинЦенаДиваны
ПО Диваны.Цена = МинЦенаДиваны.Цена
Результат:
Наименование | Код | Цена |
---|---|---|
Диван-кровать Люси |
000000005 |
40 000 |
Диван-кровать Люси |
000000007 |
40 000 |
Диван-кровать Люси |
000000008 |
40 000 |
Диван-кровать Люси |
000000009 |
40 000 |
Мы видим, что в блок соединений, при данном способе, пришлось добавить в качестве источника данных вложенный запрос. Это в целом нормальная практика, и так можно решить множество задач. Но она ухудшает читаемость, снижает возможности отладки запроса (довольно сложно посмотреть что происходит во вложенном запросе при выполнении), и в некоторых случаях снижает производительность.
Пример 2. Вычисление с применением временных таблиц.
Решим задачу из примера 1, с помощью временных таблиц.
ВЫБРАТЬ
МАКСИМУМ(Диваны.Цена) КАК Цена
ПОМЕСТИТЬ ВТМинЦенаДиваны
ИЗ
Справочник.Диваны КАК Диваны
;
ВЫБРАТЬ
Диваны.Наименование КАК Наименование,
Диваны.Код,
Диваны.Цена КАК Цена
ИЗ
Справочник.Диваны КАК Диваны
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМинЦенаДиваны
ПО Диваны.Цена = ВТМинЦенаДиваны.Цена
Результат будет тот же:
Как видим мы использовали возможности пакетного запроса. Первый запрос в нашем тексте запроса, с помощью оператора ПОМЕСТИТЬ перед секцией ИЗ, создает временную таблицу с именем ВТМинЦенаДиваны (Использование префикса ВТ общепринято в среде разработчиков, так как сразу позволяет понять по тексту запроса, что это Временная Таблица).
Второй запрос пакета использует эту временную таблицу, обращаясь к ней по имени (ВТМинЦенаДиваны) в секции соединений как к любой другой таблице. Теперь мы имеем возможность наблюдать последовательность преобразования данных. При выполнении запроса в коде 1С, во множестве популярных консолей запросов, а так же в нашей академии вы можете просматривать результат выполнения временной таблицы в отдельной вкладке результата.
Созданные временные таблицы существуют в запросе до момента завершения его выполнения. Или до момента явного указания оператора УНИЧТОЖИТЬ. После этого они удаляются.
Пример:
ВЫБРАТЬ
Диваны.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТДиваны
ИЗ
Справочник.Диваны КАК Диваны
;
УНИЧТОЖИТЬ ВТДиваны
;
ВЫБРАТЬ
ВТДиваны.Ссылка КАК Ссылка
ИЗ
ВТДиваны КАК ВТДиваны
Такой запрос уже не сработает. Будет получена ошибка "Таблица не найдена ВТДиваны". Так как мы попытались использовать временную таблицу после того как явно ее уничтожили.
Уничтожение временных таблиц полезно когда данные, которые в ней содержатся уже не нужны для дальнейших вычислений в запросе (это основная причина использования, т.к. временные таблицы иногда могут содержать довольно большой объем данных, все зависит от того что вы туда поместите, который занимает место в оперативной памяти компьютера и может привести к замедлению работы приложения или критической ошибке). Или мы можем захотеть уничтожить временную таблицу, когда мы например решим удалить старую создать новую временную таблицу с таким же именем, но с другими данными.