Пакет запросов 1с 8.2. Простые запросы. Схема работы с запросом

Блог компании 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

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

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

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

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

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

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

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

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

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

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

Получите 267 видеоуроков по 1С бесплатно:

Хозрасчетный.Ссылка,
Хозрасчетный.Родитель,
Хозрасчетный.Код,
Хозрасчетный.КодБыстрогоВыбора,
Хозрасчетный.Наименование,
Хозрасчетный.Вид,
Хозрасчетный.Забалансовый,
Хозрасчетный.Количественный,
ИЗ
ПланСчетов.Хозрасчетный КАК Хозрасчетный
ГДЕ
Хозрасчетный.Ссылка = &Счет
;
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
ХозрасчетныйВидыСубконто.НомерСтроки КАК НомерСтроки,
ХозрасчетныйВидыСубконто.ВидСубконто КАК ВидСубконто,
ХозрасчетныйВидыСубконто.ВидСубконто.Наименование КАК Наименование,
ХозрасчетныйВидыСубконто.ВидСубконто.ТипЗначения КАК ТипЗначения,
ХозрасчетныйВидыСубконто.ТолькоОбороты КАК ТолькоОбороты,
ХозрасчетныйВидыСубконто.Суммовой КАК Суммовой
ИЗ
ПланСчетов.Хозрасчетный.ВидыСубконто КАК ХозрасчетныйВидыСубконто
ГДЕ
ХозрасчетныйВидыСубконто.Ссылка = &Счет
УПОРЯДОЧИТЬ ПО
ХозрасчетныйВидыСубконто.НомерСтроки

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

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

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

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

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

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

Когда мой запрос стал таким сложным, что превысил пределы моего понимания, я решил использовать пакетные запросы.

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

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

Пакетные запросы появились только в версии 8.1.11.67.4.

Вот текст запроса:

ВЫБРАТЬ Т1.Зн ПОМЕСТИТЬ ВТБуквы ИЗ (ВЫБРАТЬ "А" КАК Зн ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Б") КАК Т1;

ВЫБРАТЬ Т1.Зн ПОМЕСТИТЬ ВТЦифры ИЗ (ВЫБРАТЬ "1" КАК Зн ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "2") КАК Т1;

ВЫБРАТЬ ТБ.Зн, ТЦ.Зн, ТБ.Зн+ТЦ.Зн ИЗ ВТБуквы КАК ТБ, ВТЦифры КАК ТЦ

Пакетные запросы поддерживаются в любой обычной консоли запросов.

На рисунке представлен образец выполнения запроса:

А теперь немного из опыта. Зачем нужны пакетные запросы.

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

Раньше, когда не было временных таблиц, пришлось бы дублировать текст запроса.

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

Кроме того, если используется система компоновки данных (СКД), она грамотно отбирает нужные поля и минимизирует весь пакет запросов.

Если у запросов был метод Запрос.Выполнить() то теперь появился метод Запрос.ВыполнитьПакет() , который возвращает все таблицы из пакета, в виде массива.

Анонс пакетных запросов на сайте 1с находится здесь: http://v8.1c.ru/overview/release_8_1_11/#Functional

История из жизни

Объясню, что меня подвигло на пакетные запросы.

Значит, представьте есть документ, у него табличная часть. В колонке «Ошибка » признак, есть ли ошибка при заполнении документа. В колонке «ТекстОшибки » может быть одно или несколько предложений с текстами ошибок. Виды ошибок, содержащиеся в предложениях известны заранее.

Так вот, мы заносим список всех ошибок в таблицу КодыОшибок - там содержится код ошибки и подстрока поиска.

Получаем для каждой строки одну, две или больше ошибок. Т.к. в одной строке может быть несколько ошибок.

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

Делаем левое соединение, там где код ошибки есть NULL, даем код ошибки «Прочие ошибки » .

Но проблема была в том, что кодов ошибок было около 200, поэтому левое соединение работало очень долго. Пришлось заменить его на внутреннее соединение, которое летало. Но при этом терялись строки, для которых ошибка была не найдена. Я так и не смог понять, как вытащить эти строки в результат.

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

Я просто еще раз соединил все строки с ошибками со всеми строками, для которых были найдены ошибки, и добавил все-таки вид ошибки «Прочие ошибки».

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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