Пакетные запросы логично дополняют функционал временных таблиц и дают больше возможностей при работе с запросами.
В пакетном запросе фактически можно описать несколько запросов, как связанных между собой использованием временных таблиц, так и не связанных (можно, но не понятно зачем?). В итоге можно выполнить последовательно все запросы и принять в результате либо массив с результатами исполнения каждого запроса, либо результат последнего. Для получения массива с результатами запроса применяют метод ВыполнитьПакет() объекта запрос, а для получения результата последнего запроса ВыполнитьЗапрос().
В тексте запроса, запросы пакета разделяются символом «;» (точка с запятой). Область имен виртуальных таблиц у одного пакетного запроса одна. Использование менеджера временных таблиц не требуется, но возможно если вы хотите передать временные таблицы из одного пакетного запроса в другой.
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 |
Процедура ОбработкаПроведения(Отказ, РежимПроведения) Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | Номенклатура, СУММА(Количество) КАК Количество |ПОМЕСТИТЬ ДокТЧ |ИЗ | Документ.Расходная.Товары |ГДЕ | Ссылка = &Ссылка |СГРУППИРОВАТЬ ПО Номенклатура |; | |ВЫБРАТЬ РАЗЛИЧНЫЕ | Номенклатура |ПОМЕСТИТЬ СписокТоваров |ИЗ | Документ.Расходная.Товары |ГДЕ | Ссылка = &Ссылка |; | |ВЫБРАТЬ | Док.Номенклатура, | Док.Количество КАК Док_Количество, | ЕСТЬNULL(Рег.КоличествоОстаток,0) КАК Рег_Количество |ИЗ | ДокТЧ КАК Док | ЛЕВОЕ СОЕДИНЕНИЕ | РегистрНакопления.ОстаткиТоваров.Остатки(, | Номенклатура В(ВЫБРАТЬ РАЗЛИЧНЫЕ | Номенклатура | ИЗ | СписокТоваров КАК СписокТоваров)) КАК Рег | ПО | Док.Номенклатура = Рег.Номенклатура"; Запрос.УстановитьПараметр("Ссылка", Ссылка); МассивРезультаттов = Запрос.ВыполнитьПакет(); //Прим. 1 РезультатЗапроса = Запрос.Выполнить(); //Прим. 2 Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл //Проверка отрицательных остатков //Проведение по регистру КонецЦикла; КонецПроцедуры |
Фактически я убрал определение объекта запрос и использование менеджера временных таблиц, объединил тексты запросов (обратите внимание на разделитель «;» между текстами). В результате текст запроса стал читабельнее (а при использовании конструктора запросов намного увеличивается удобство чтения запроса).
После выполнения запроса в переменную МассивРезультатов у нас попадет 3 элемента. Первые два будут содержать число характеризующее количество записей помещенных во временные таблицы ДокТЧ и СписокТоваров, а третий будет содержать выборку с полями Номенклатура, Док_Количество и Рег_Количество.
В переменную РезультатЗапроса попадет только выборка.
Ну вот и все что касается пакетных запросов. Очень удобный механизм и с точки зрения написания запросов и с точки зрения чтения сложных запросов.
Автор: Павел Чистов