Работа с пакетными запросами

Встроенный язык

Синтаксис и применение Работа с пакетными запросами в платформе 1С:Предприятие. Описание и примеры кода.

Полное описание, параметры и ограничения

Работа с пакетными запросами

Платформа 1С:Предприятие 8 позволяет работать с пакетами запросов. В пакетном запросе тексты запросов разделяются символом ";". Запросы исполняются последовательно, при этом временные таблицы, которые были созданы во время исполнения какого-либо запроса будут существовать до окончания исполнения всего пакета запроса или до исполнения в пакете запроса, уничтожающего данную временную таблицу. Например:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| УчетНоменклатурыОстаткиИОбороты.Номенклатура,
| УчетНоменклатурыОстаткиИОбороты.КоличествоПриход,
| УчетНоменклатурыОстаткиИОбороты.КоличествоРасход,
| УчетНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток
|ПОМЕСТИТЬ УчетНоменклатуры
|ИЗ
| РегистрНакопления.УчетНоменклатуры.ОстаткиИОбороты(, , Авто, , ) КАК УчетНоменклатурыОстаткиИОбороты
|;
|
|ВЫБРАТЬ
| УчетНоменклатуры.Номенклатура,
| УчетНоменклатуры.КоличествоРасход,
| УчетНоменклатуры.КоличествоКонечныйОстаток
|ИЗ
| УчетНоменклатуры КАК УчетНоменклатуры
|";

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

Первый запрос создает временную таблицу, данные из которой используются во втором запросе.

Если объекту Запрос, исполняющему пакетный запрос, установлен менеджер временных таблиц, временные таблицы, которые не были уничтожены в рамках пакетного запроса, сохранятся в установленном менеджере. В тексте пакетного запроса возможно использование и уничтожение временных таблиц, которые существовали в установленном менеджере временных таблиц на момент запуска пакета на исполнение.

Метод ВыполнитьПакет()

Кроме метода Выполнить(), последовательно выполняющего все запросы пакета и возвращающего результат последнего запроса в пакете, платформа 1С:Предприятие 8 предоставляет еще один метод – ВыполнитьПакет(). Этот метод последовательно выполняет все запросы и возвращает массив результатов для каждого запроса из пакета в последовательности расположения запросов в тексте пакета. Результатом выполнения запроса на уничтожение временной таблицы является значение Неопределено, которое также помещается в массив результатов.

Практические примеры

Выполнить пакет запросов и получить два результата

Два независимых запроса в одном тексте: объясняем массив результатов пакета.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Выполняйте на сервере.

  2. Первый запуск не требует метаданных конфигурации.

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ &Первое КАК Значение;
|ВЫБРАТЬ &Второе КАК Значение";
Запрос.УстановитьПараметр("Первое", "Книга");
Запрос.УстановитьПараметр("Второе", "Ручка");
Результаты = Запрос.ВыполнитьПакет();
Для Каждого Результат Из Результаты Цикл
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
        Сообщить(Выборка.Значение);
    КонецЦикла;
КонецЦикла;

Разбор по шагам

  1. Разделяем тексты запросов точкой с запятой.

  2. ВыполнитьПакет возвращает массив результатов.

  3. Обходим каждый результат отдельной выборкой.

Как проверить результат

  1. Вывод: Книга, затем Ручка.

  2. Результаты.Количество() равно 2.

Ожидаемый результат

Два результата с одной строкой каждый.

На что обратить внимание

  1. В пакетах с ПОМЕСТИТЬ не каждый элемент является обычной выборкой; учитывайте тип результата.

  2. Выполнить возвращает последний результат, а не массив всего пакета.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Сравнить пакет запросов с промежуточными данными и без них

В обычном пакете создание временной таблицы возвращает число помещённых строк; специальный метод возвращает сами строки.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Все три запроса образуют один пакет: создание, чтение, уничтожение только собственной ВТПакет.

  2. Отдельный МенеджерВременныхТаблиц здесь не нужен: таблица используется и уничтожается внутри одного пакета.


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

Разбор по шагам

  1. ВыполнитьПакет возвращает три позиции массива по порядку операторов, индексы 0–2.

  2. Для ПОМЕСТИТЬ обычный метод даёт технический результат с числом строк, а не товарные колонки.

  3. Для ВЫБРАТЬ обе версии дают обычный РезультатЗапроса; УНИЧТОЖИТЬ даёт Неопределено.

  4. Повторно выполняем независимый пакет специальным методом и видим колонки и значения созданной таблицы на позиции 0.

Как проверить результат

  1. Обычный пакет имеет длину 3; его первый результат сообщает одну помещённую строку.

  2. Специальный пакет на позиции 0 содержит Название=Книга и Количество=3.

  3. Обе позиции уничтожения равны Неопределено.

Ожидаемый результат

Различены технический счётчик ПОМЕСТИТЬ и промежуточные данные этого же оператора.

На что обратить внимание

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

  2. Перед Выгрузить проверяйте смысл позиции: Неопределено после УНИЧТОЖИТЬ не имеет такого метода.

  3. Это не транзакция записи объектов информационной базы.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.