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