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

В статье рассказывается о механизме пакетных запросов, реализованных в платформе «1С:Предприятие». Прочитав статью, вы узнаете:

  • Что такое пакетные запросы и для чего они нужны?
  • Как создать пакет запросов при помощи конструктора запросов?
  • Как вернуть массив результатов для каждого запроса из пакета?

Применимость

Материал актуален для текущих версий платформы «1С:Предприятие» редакции 8.3

Назначение пакета запросов

Платформа позволяет работать с пакетами запросов. Получаем возможность выполнить несколько запросов «за раз». В пакетном запросе тексты запросов разделяются символом «;» (точка с запятой).

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

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

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

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

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

Создание пакета запросов при помощи конструктора

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

Визуальное отображение отдельных запросов – закладки в правой части конструктора, при помощи которых можно перейти к редактированию текста отдельного запроса. На этих закладках для временных таблиц выводятся имена, для запросов на выборку данных – «Запрос пакета 2» и т.п., на уничтожение – «– ИмяВТ».

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

Выполнение запросов пакета

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

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

Кроме метода Выполнить() , последовательно выполняющего все запросы пакета и возвращающего результат последнего запроса в пакете, в платформе существует еще один метод – ВыполнитьПакет() .

Этот метод последовательно выполняет все запросы и возвращает массив результатов для каждого запроса из пакета в последовательности расположения запросов в тексте пакета.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

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

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

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

Но столкнулся с фактом, что ничего о них не знаю. Оказалось, все очень просто. Через 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, поэтому левое соединение работало очень долго. Пришлось заменить его на внутреннее соединение, которое летало. Но при этом терялись строки, для которых ошибка была не найдена. Я так и не смог понять, как вытащить эти строки в результат.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Простые запросы

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

На рисунке показана структура конфигурации.

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

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


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

Временные таблицы

С некоторого времени в запросах появилась возможность использования временных таблицх, для чего служит объект «Менеджер временных таблиц». По сути дела, менеджер временных таблиц содержит описание пространства имен временных таблиц и обеспечивает их создание и удаление из базы данных.

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

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

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

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

В основном запросе названия временных таблиц использовалось в качестве указания на источник данных (им должен быть назначен синоним). Использовать временные таблицы в качестве источника можно неоднакратно, что при правильном их применении позволяет сократить текст запроса и повысить скорость (при использовании временной таблицы в различных местах запроса).

Пакетные запросы

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

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

Пакетные запросы в тексте запроса должны быть разделены символом «;». Пространство имен виртуальных таблиц у отдельного пакетного запроса одно. В использовании менеджера временных таблиц нет необходимости, но возможно если вам нужно передать временные таблицы в другой пакетный запрос.

Изменим процедуру с учетом пакетных запросов:

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

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

Переменная РезультатЗапроса содержит только выборку.

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

Похожие статьи

© 2024 knauf41.ru. Строительство, планирование, декор.