Не помню уже с какого релиза в запросах стало можно использовать временные таблицы. Для этого используется объект «Менеджер временных таблиц». Фактически менеджер временных таблиц описывает пространство имен временных таблиц и отвечает за их создание и уничтожение в базе данных.

Сами временные таблицы действительно физически создаются в базе, соответственно следует относиться к ним осторожно, так как дисковая подсистема на сегодняшний момент самая медленная часть техники, а скорость создания и уничтожения таблиц напрямую от нее зависит.

Перепишем запрос для использования временных таблиц. Во временные таблицы поместим сгруппированную табличную часть документа и список товаров для фильтра виртуальных таблиц:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

МВТ = Новый МенеджерВременныхТаблиц;

Запрос = Новый Запрос;

Запрос.МенеджерВременныхТаблиц = МВТ;

Запрос.Текст = "

|ВЫБРАТЬ

| Номенклатура, СУММА(Количество) КАК Количество

|ПОМЕСТИТЬ ДокТЧ

|ИЗ

| Документ.Расходная.Товары

|ГДЕ

| Ссылка = &Ссылка

|СГРУППИРОВАТЬ ПО Номенклатура";



Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить(); //Прим. 1



Запрос = Новый Запрос;

Запрос.МенеджерВременныхТаблиц = МВТ;

Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ

| Номенклатура

|ПОМЕСТИТЬ СписокТоваров

|ИЗ

| Документ.Расходная.Товары

|ГДЕ

| Ссылка = &Ссылка";



Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить(); //Прим. 2



Запрос = Новый Запрос;

Запрос.МенеджерВременныхТаблиц = МВТ;

Запрос.Текст = "

|ВЫБРАТЬ

| Док.Номенклатура,

| Док.Количество КАК Док_Количество,

| ЕСТЬNULL(Рег.КоличествоОстаток,0) КАК Рег_Количество

|ИЗ

| ДокТЧ КАК Док

| ЛЕВОЕ СОЕДИНЕНИЕ

|  РегистрНакопления.ОстаткиТоваров.Остатки(,

|  Номенклатура В(ВЫБРАТЬ РАЗЛИЧНЫЕ

|                           Номенклатура

|                          ИЗ

|                           СписокТоваров КАК СписокТоваров)) КАК Рег

| ПО

|  Док.Номенклатура = Рег.Номенклатура";



РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();



Пока Выборка.Следующий() Цикл

//Проверка отрицательных остатков

//Проведение по регистру

КонецЦикла;

КонецПроцедуры


При использовании временных таблиц в тексте запроса применяют инструкцию Поместить для создания новой временной таблицы, в этом случае в результат запроса система передает не содержимое этой таблицы (см прим 1 и прим 2 в коде выше), а количество записей помещенных во временную таблицу, по желанию можно не принимать это значение.

Также допускается использование инструкции Уничтожить в этом случае временная таблица уничтожается, в противном случае временные таблицы уничтожаются вместе с объектом менеджер временных таблиц.

В основном нашем запросе я использовал названия временных таблиц как указание на источник получения данных (им обязательно надо назначать синоним, что мы и видим в тексте). Использовать временные таблицы как источник можно не единожды, что при умелом их применении позволит и сократить текст запроса (улучшиться читабельность сложных запросов) и увеличить скорость (при использовании данных временной таблицы в нескольких местах запроса).

Автор: Павел Чистов

Временные таблицы, как проверить в отладчике?

 // Функция для просмотра Временных Таблиц в отладчике
Функция ЛукВТ(Запрос, ИмяВнутреннейТаблицы) Экспорт
Перем ЗапросТМП, Р;
//Получаем таблицу из менеджера временных таблиц запроса
ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ "+ИмяВнутреннейТаблицы);
ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц;
Р=ЗапросТМП.Выполнить().Выгрузить();
Возврат Р;
КонецФункции


Временные таблицы, как удалить?

 // Как удалить Временную Таблицу
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
// (Менеджер ВТ создан, в нем уже есть временная таблица ИмяВременнойТаблицы)
ТекстЗапpoca = "
| УНИЧТОЖИТЬ ИмяВременнойТаблицы
|";
Запрос.Текст = ТекстЗапроса;
Запрос.Выполнить();


Если временных таблиц много и они висят в памяти не удаленные не очищенные возникает эффект постоянной загруженности сервера 1С:Предприятие как будто этот процесс выполняет все время какой то тяжелый запрос или обработку что сказывается на производительности системы в целом. Временную таблицу нужно удалять как можно скорее после использования.