Не помню уже с какого релиза в запросах стало можно использовать временные таблицы. Для этого используется объект «Менеджер временных таблиц». Фактически менеджер временных таблиц описывает пространство имен временных таблиц и отвечает за их создание и уничтожение в базе данных.
Сами временные таблицы действительно физически создаются в базе, соответственно следует относиться к ним осторожно, так как дисковая подсистема на сегодняшний момент самая медленная часть техники, а скорость создания и уничтожения таблиц напрямую от нее зависит.
Перепишем запрос для использования временных таблиц. Во временные таблицы поместим сгруппированную табличную часть документа и список товаров для фильтра виртуальных таблиц:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
Процедура ОбработкаПроведения(Отказ, РежимПроведения) МВТ = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МВТ; Запрос.Текст = " |ВЫБРАТЬ | Номенклатура, СУММА(Количество) КАК Количество |ПОМЕСТИТЬ ДокТЧ |ИЗ | Документ.Расходная.Товары |ГДЕ | Ссылка = &Ссылка |СГРУППИРОВАТЬ ПО Номенклатура"; Запрос.УстановитьПараметр("Ссылка", Ссылка); РезультатЗапроса = Запрос.Выполнить(); //Прим. 1 Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МВТ; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | Номенклатура |ПОМЕСТИТЬ СписокТоваров |ИЗ | Документ.Расходная.Товары |ГДЕ | Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); РезультатЗапроса = Запрос.Выполнить(); //Прим. 2 Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МВТ; Запрос.Текст = " |ВЫБРАТЬ | Док.Номенклатура, | Док.Количество КАК Док_Количество, | ЕСТЬNULL(Рег.КоличествоОстаток,0) КАК Рег_Количество |ИЗ | ДокТЧ КАК Док | ЛЕВОЕ СОЕДИНЕНИЕ | РегистрНакопления.ОстаткиТоваров.Остатки(, | Номенклатура В(ВЫБРАТЬ РАЗЛИЧНЫЕ | Номенклатура | ИЗ | СписокТоваров КАК СписокТоваров)) КАК Рег | ПО | Док.Номенклатура = Рег.Номенклатура"; РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл //Проверка отрицательных остатков //Проведение по регистру КонецЦикла; КонецПроцедуры |
При использовании временных таблиц в тексте запроса применяют инструкцию Поместить для создания новой временной таблицы, в этом случае в результат запроса система передает не содержимое этой таблицы (см прим 1 и прим 2 в коде выше), а количество записей помещенных во временную таблицу, по желанию можно не принимать это значение.
Также допускается использование инструкции Уничтожить в этом случае временная таблица уничтожается, в противном случае временные таблицы уничтожаются вместе с объектом менеджер временных таблиц.
В основном нашем запросе я использовал названия временных таблиц как указание на источник получения данных (им обязательно надо назначать синоним, что мы и видим в тексте). Использовать временные таблицы как источник можно не единожды, что при умелом их применении позволит и сократить текст запроса (улучшиться читабельность сложных запросов) и увеличить скорость (при использовании данных временной таблицы в нескольких местах запроса).
Автор: Павел Чистов