Пакет запросов 1с 8.3. Пакетные запросы для чайников. Методы Выполнить() и ВыполнитьПакет()

Блог компании 1С GOODWILL

Платформа «1С Предприятие» позволяет выполнить последовательно несколько запросов за один раз. В 1С это называется пакетом запросов. В рамках одного пакета каждый запрос разделяется «точкой с запятой».

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

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

Еще одна важная деталь в пользу пакетных запросов в 1С – это то, что в отличие от вложенных запросов, мы можем получить отдельно результат каждого запроса в пакете.

Пример создания пакета запросов на языке 1С

Что бы посмотреть на примере, как создать пакет запросов, будем использовать конструктор запросов, который вызовем, для наглядности, из консоли запросов. Таким образом, сможем сразу посмотреть результат выполнения пакета.

Создадим простенький пакетный запрос. Предлагаю сразу вставить текст запроса в консоль, а потом открыть конструктор и посмотреть, как формируется пакет запросов. Добавьте в консоль новый запрос и вставьте следующий текст:

Хозрасчетный.Родитель,

Хозрасчетный.Код,

Хозрасчетный.КодБыстрогоВыбора,

Хозрасчетный.Наименование,

Хозрасчетный.Вид,

Хозрасчетный.Забалансовый,

Хозрасчетный.Количественный,

ПланСчетов.Хозрасчетный КАК Хозрасчетный

////////////////////////////////////////////////////////////////////////////////

ХозрасчетныйВидыСубконто.НомерСтроки КАК НомерСтроки,

ХозрасчетныйВидыСубконто.ВидСубконто КАК ВидСубконто,

ХозрасчетныйВидыСубконто.ВидСубконто.Наименование КАК Наименование,

ХозрасчетныйВидыСубконто.ВидСубконто.ТипЗначения КАК ТипЗначения,

ХозрасчетныйВидыСубконто.ТолькоОбороты КАК ТолькоОбороты,

ХозрасчетныйВидыСубконто.Суммовой КАК Суммовой

ПланСчетов.Хозрасчетный.ВидыСубконто КАК ХозрасчетныйВидыСубконто

УПОРЯДОЧИТЬ ПО

ХозрасчетныйВидыСубконто.НомерСтроки

У меня это выглядит так:

Теперь перейдем в конструктор запросов. Здесь нас будет интересовать закладка «Пакет запросов»:

Как видим, у нас появился пакет из двух запросов. Кликнув два раза на любом из них, можно перейти к его редактированию:

Нажмем кнопку «Ок» и попробуем посмотреть результат выполнения пакетного запроса.

Установим параметр «Счет». Можно выбрать любой счет из плана счетов. Как вы уже, наверное, догадались, данный пакт запросов должен получить свойства счета. Нажимаем «Выполнить», и смотрим результат:

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

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

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

Выборка1 = МассивРезультатов.Выбрать();

Если Выборка1.Следующий() Тогда

//Действия с выборкой 1

КонецЕсли;

ВыборкаВидыСубконто = МассивРезультатов.Выбрать();

Запись Работа с пакетными запросами в 1С 8.3 и 8.2 впервые появилась Блог компании 1С GOODWILL.

Конструктор запросов в 1С 8.3 и 8.2 — мощнейший инструмент разработки. Он позволяет составить текст запроса при помощи специальной визуальной среды. Таким образом, чтобы создать запрос 1с не обязательно знать встроенный язык запросов, достаточно ориентироваться в не сложном и интуитивно понятном интерфейсе конструктора.

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

Описание конструктора запросов на официальном сайте 1С 8: v8.1c.ru

Таблицы и поля; ; ; ; ; ; Вложенные запросы (в разработке).

Для того чтобы вызвать конструктор запросов 1с 8 в программном коде необходимо:

  • Создать новый запрос
Запрос = Новый Запрос;
  • Задать пустую строку текста запроса
Запрос.Текст = "";
  • Поставить курсор мышки между кавычками, нажать правую кнопку мыши. В открывшемся контекстном меню выбрать пункт Конструктор запроса и ответить Да на вопрос о создании нового запроса. Если текст запроса уже записан, то необходимо щелкнуть на любом месте внутри него и вызвать конструктор;

Рассмотрим на небольших примерах с возрастающей сложностью все основные вкладки конструктора запросов. Такой подход позволит начинающему программисту 1с более эффективно изучить конструктор и все его возможности. Для примеров будем использовать конфигурацию Бухгалтерия 3.0.

Урок №1. Конструктор запросов — простейший пример использования.

Задача: написать запрос к справочнику номенклатура, выбрать всю номенклатуру справочника.

Новые вкладки: Таблицы и поля.

Новые механизмы: просмотр и редактирование текста запроса при помощи кнопки «Запрос».

Для начала создания запроса создадим новый запрос и вызовем конструктор (как это делается написано несколькими абзацами выше). После этого откроется окно конструктора на вкладке Таблицы и поля.

Теоретическая часть урока №1

Вкладка Таблицы и поля состоит из трех разделов:

База данных . В данном разделе представлены все таблицы базы данных, которые можно использовать для построения запроса;

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

  • Либо дважды щелкнуть по таблице;
  • Либо воспользоваться кнопками «>» или «>>».

Над разделом Таблицы присутствует ряд кнопок. Про большинство из них будет подробнее рассказано в следующих уроках. А пока дам только краткие пояснения.

  • Создать вложенный запрос (красная линия). Предназначена для создания нового вложенного запроса;
  • Создать описание временной таблицы (желтая линия). Позволяет задать имя временной таблицы, которая расположена вне данного запроса, также можно использовать для передачи в запрос таблицы значений;
  • Изменить текущий элемент (зеленая линия). Позволяет перейти в выделенный вложенный запрос, временную таблицу или описание временной таблицы;
  • Удалить текущий элемент (голубая линия). Удаляет выделенную таблицу из выбранных таблиц;
  • Заменить таблицу (синяя линия). Открывает диалог замены выделенной таблицы. Полезно, если вы неверно выбрали виртуальную таблицу регистра, так как происходит позиционирование на текущей выбранной таблице в списке.
  • Параметры виртуальной таблицы (фиолетовая линия). Открывает параметры виртуальной таблицы регистра.

Поля . В данный раздел выбираются поля таблиц из предыдущего раздела. Эти поля будут колонками таблицы или выборки полученной в результате выполнения запроса. Нужны они прежде всего, для того чтобы получить из выбранных таблиц только нужную в конкретном случае информацию. Для того чтобы переместить их из раздела Таблицы необходимо:

  • Либо дважды щелкнуть по полю;
  • Либо воспользоваться кнопками «>» или «>>»;
  • Также можно добавить новое поле самостоятельно, используя произвольное выражение из полей выбранных таблиц и функций языка запросов.

Над разделом Поля присутствует ряд кнопок. Про создание полей при помощи произвольных выражений будет подробнее рассказано в следующих уроках. А пока дам только краткие пояснения.

  • Добавить (зеленая линия). Предназначена для добавления нового поля при помощи редактора произвольных выражений;
  • Изменить текущий элемент (красная линия). Позволяет изменить выделенное поле при помощи редактора;
  • Удалить текущий (синяя линия). Удаляет выделенное поле из списка.

Практическая часть урока №1

Мы разобрались с теорией необходимой для выполнения задания, предусмотренного в данном уроке. Напомню как оно звучит: написать запрос к справочнику номенклатура, выбрать всю номенклатуру справочника.

Приступим к созданию запроса по номенклатуре:

  • Создадим новый запрос и откроем конструктор методом указанным в начале урока;
  • В разделе База данных , откроем ветку Справочники и найдем там справочник Номенклатура;
  • Выделим его и при помощи кнопки «>» перенесем в раздел Таблицы;
  • В разделе Таблицы раскроем справочник номенклатура при помощи значка «+»;
  • В раскрывшемся списке полей найдем поле Ссылка и перенесем его в раздел Поля при помощи кнопки «>»
  • Запрос по номенклатуре готов, нажимаем кнопку «ОК» в нижней части окна конструктора.

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

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

В тексте запроса, запросы пакета разделяются символом «;» (точка с запятой). Область имен виртуальных таблиц у одного пакетного запроса одна. Использование менеджера временных таблиц не требуется, но возможно если вы хотите передать временные таблицы из одного пакетного запроса в другой.
Код 1C v 8.х Процедура ОбработкаПроведения(Отказ, РежимПроведения)

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

Пока Выборка.Следующий() Цикл
//Проверка отрицательных остатков
//Проведение по регистру
КонецЦикла;
КонецПроцедуры

Фактически я убрал определение объекта запрос и использование менеджера временных таблиц, объединил тексты запросов (обратите внимание на разделитель «;» между текстами). В результате текст запроса стал читабельнее (а при использовании конструктора запросов намного увеличивается удобство чтения запроса).

После выполнения запроса в переменную МассивРезультатов у нас попадет 3 элемента. Первые два будут содержать число характеризующее количество записей помещенных во временные таблицы ДокТЧ и СписокТоваров, а третий будет содержать выборку с полями Номенклатура, Док_Количество и Рег_Количество.

В переменную РезультатЗапроса попадет только выборка.

Ну вот и все что касается пакетных запросов. Очень удобный механизм и с точки зрения написания запросов и с точки зрения чтения сложных запросов.

Информация взята с сайта

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

Кстати, пакетные варианты запросов стали доступны только в решении 8.1.11.67.4 – так что вы, возможно, ещё не знаете, как это работает на практике. Если рассказать примитивно, то достаточно создать ряд запросов и соединить их через символ «;». Например:

Результат возвращается через последний из них. Кстати, пакетные запросы имеют поддержку в каждой обычной консоли. Пример его выполнения через консоль запросов:

Почему нельзя обойтись без пакетных запросов?

Вкладываем во временную таблицу промежуточный результат, предполагаем использовать его в каких-то следующих запросах. Без наличия функционала временной таблицы, такой промежуточный запрос нужно было бы повторять ещё раз. Если нет знаний о том, как работает пакетный запрос и как им воспользоваться, то можно выполнять один за другим несколько запросов, используя данные вложенных таблиц – так было раньше, теперь не стоит тратить на это время, ведь у нас есть эффективный и простой пакетный запрос в 1С . С ним удобно, уже не надо помнить о том, где должна быть временная таблица. Для минимизации и быстродействия используйте возможности СКД. Система отберёт, отсортирует, разместит. Вот как позиционируют данное новшество сами разработчики популярного и надежного решения.

Анонс пакетных запросов от разработчиков 1С
  • Существенная оптимизация работы программы в целом;
  • Увеличение масштабируемости известного решения;
  • Эффективное быстродействие за счёт внедрения возможностей пакетного размещения;
  • Простое и понятное администрирование системы;
  • Лучшие возможности для интеграции с другими решениями.
Каковы же функциональные возможности запросов в 8.1.11?

Именно запросы существенно улучшают работу с временными таблицами. Функционал пакетных запросов подразумевает, что любая таблица, сформированная для конкретного запроса из пакета, работает пока пакетный запрос полностью не закончил своё действие или до достижения команды на его уничтожение. Сейчас можно получать как результат самого последнего запроса – это будет команда Выполнить(), так и целый массив результатов по методу ВыполнитьПакет().

Алгоритм грамотного создания пакетного запроса

Итак, мы теперь знаем, что пакетный запрос – это несколько запросов, которые описаны нами как один общий запрос. Выполняться они должны друг за другом. Любой промежуточный результат в ходе выполнения всей цепочки включённых запросов может быть помещён во временную таблицу. При такой структуре любой запрос может обратиться к этим промежуточным данным. Важно, результаты любого запроса, помещённые во временную таблицу, могут быть использованы неоднократно. При этом больше не нужно прописывать одно и тоже несколько раз.

Минусы метода

Говоря о преимуществах использования пакетных запросов, стоит упомянуть и о явном минусе. Дело в том, что при таком алгоритме действий система постоянно вынуждена создавать таблицы, в которых она и хранит всю базу данных. Уходит время как на создание каждой таблицы, так и на её последующее удаление. Вот такой пример:

В результате имеем таблицу:

Теперь используем пакетный запрос, помним, что нам для этого нужен символ точка с запятой, получаем:

Обратите внимание, 3-ий запрос объединил результаты работы первых двух, смотрим, что получилось:

Теперь постараемся добавить красоты и немного изменим текст для 3-его запроса, вот так:

Теперь у нас вот что получилось:

Осталось объединить столбцы с Номенклатурой, и проставить нули в пустых клетках.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: