О чем эта статья
В статье рассказывается о механизме пакетных запросов, реализованных в платформе «1С:Предприятие». Прочитав статью, вы узнаете:
- Что такое пакетные запросы и для чего они нужны?
- Как создать пакет запросов при помощи конструктора запросов?
- Как вернуть массив результатов для каждого запроса из пакета?
Применимость
Материал актуален для текущих версий платформы «1С:Предприятие» редакции 8.3
Назначение пакета запросов
Платформа позволяет работать с пакетами запросов. Получаем возможность выполнить несколько запросов «за раз». В пакетном запросе тексты запросов разделяются символом «;» (точка с запятой).
Запросы исполняются последовательно, при этом временные таблицы, которые были созданы во время исполнения какого-либо запроса, будут существовать до окончания исполнения всего пакета запроса или до исполнения в пакете запроса, уничтожающего данную временную таблицу. Важное отличие от вложенного запроса заключается в том, что доступны результаты каждого запроса пакета отдельно.
Пакеты запросов позволяют достичь поэтапного выполнения запроса. Для этого в пакетном запросе сначала происходит создание временных таблиц, далее – их совместное использование (соединение, объединение, фильтры) для получения итогового результата запроса. Также важно отметить, что использование временных таблиц в пакетных запросах позволяет улучшить читаемость текста запроса.
Объемные запросы с завернутыми друг в друга вложенными запросами зачастую бывают достаточно сложными для восприятия. Но если переписать такой запрос с использованием временных таблиц, наглядность запроса может повыситься достаточно сильно. Применение пакета запросов с временными таблицами также может повысить производительность запроса.
Существуют методики оптимизации производительности запросов, основанные на замене вложенных запросов на временные таблицы.
Временная таблица может быть полезна, когда необходимо использовать одни и те же данные в большом запросе несколько раз, например, соединяя или объединяя с другими таблицами. При использовании вложенных запросов такие данные пришлось бы получать несколько раз при помощи одинаковых вложенных запросов, что, безусловно, сказалось бы и на читаемости текста, и на производительности.
Создание пакета запросов при помощи конструктора
Отдельные запросы, входящие в пакет, отделяются в тексте символом «;» (точка с запятой). Чтобы не разделять текст запроса вручную, можно использовать для этого конструктор запросов.
В конструкторе запросов есть отдельная закладка для пакетов запросов. Запросы в пакет можно добавлять при помощи соответствующей кнопки на командной панели, а также передвигать вверх или вниз.
Визуальное отображение отдельных запросов – закладки в правой части конструктора, при помощи которых можно перейти к редактированию текста отдельного запроса. На этих закладках для временных таблиц выводятся имена, для запросов на выборку данных – «Запрос пакета 2» и т.п., на уничтожение – «– ИмяВТ».
Также в списке таблиц базы данных появляются временные таблицы, созданные в рамках данного пакета. Однако это не означает, что временные таблицы хранятся в базе данных вместе со всеми остальными таблицами информационной базы.
Выполнение запросов пакета
Если объекту Запрос, исполняющему пакетный запрос, установлен менеджер временных таблиц, временные таблицы, которые не были уничтожены в рамках пакетного запроса, сохранятся в установленном менеджере.
В тексте пакетного запроса возможно использование и уничтожение временных таблиц, которые существовали в установленном менеджере временных таблиц на момент запуска пакета на исполнение.
Кроме метода Выполнить(), последовательно выполняющего все запросы пакета и возвращающего результат последнего запроса в пакете, в платформе существует еще один метод – ВыполнитьПакет().
Этот метод последовательно выполняет все запросы и возвращает массив результатов для каждого запроса из пакета в последовательности расположения запросов в тексте пакета.
Результатом выполнения запроса на уничтожение временной таблицы является значение Неопределено, которое также помещается в массив результатов.
PDF-версия статьи для участников группы ВКонтакте
Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.
Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.
Статья в PDF-формате
Вы можете скачать эту статью в формате PDF: Курсы-по-1С.рф – Материалы из курса по запросам – Использование пакетных запросов.pdf
P.S.
Понимать, как работают запросы и уметь их строить - обязательный навык для всех, кто дорабатывает и внедряет 1С.
После курса Вы сможете:
- Строить сложные запросы с несколькими источниками данных
- Уверенно задействовать вложенные запросы и временные таблицы
- Использовать встроенный язык для обработки результатов запроса
- Учитывать особенности соединений и объединений нескольких таблиц.
- Разрабатывать запросы на уровне задач Аттестации 1С:Специалист по платформе.
Интересует какие данные будут содержаться в наборе при использовании пакетных запросов
Здравствуйте! Ответ на данный вопрос уже есть в комментариях. Посмотрите, пожалуйста, все комментарии на текущей странице.
Хочу купить какие данные будут содержаться в наборе при использовании пакетных запросов
Здравствуйте, Иван! Ответ на Ваш вопрос есть в комментариях в самом низу страницы. Курс «Разработка и оптимизация запросов в 1С:Предприятие 8.2 и 8.3» снят с продаж, так как его материалы утратили актуальность. Но в ближайшее время ожидается старт продаж нового курса по Запросам. Следите за новостями на нашем сайте https://курсы-по-1с.рф/blog/
Где узнать про какие данные будут содержаться в наборе при использовании пакетных запросов
Добрый день!
Содержимое временных таблиц можно узнать при помощи консоли запросов. Например, в консоли с сайта ИТС есть кнопка Выполнить запрос с временными таблицами:
При нажатии будет выведено содержимое всех временных таблиц и запросов на выборку данных:
Если же Вы спрашиваете про систему компоновки данных, то в запросе набора данных можно использовать временные таблицы, но последним запросом пакета должен идти запрос на выборку данных. Это необходимо, чтобы можно было вывести данные (результат) в отчет.
Известно, что результатом запроса на создание временной таблицы является таблица с одной колонкой Количество и одной строкой, где будет указано количество записей, помещенных во временную таблицу. Поэтому последним запросом пакета должен быть именно запрос на выборку данных.
Интересует какие данные будут содержаться в наборе при использовании пакетных запросов
Добрый день!
Предполагаю, что идет речь о наборе данных в схеме компоновки.
В таком случае в пакете последний запрос должен быть на выборку данных (а не на создание или уничтожение временной таблицы):
Это обеспечит получение данных из базы, которые можно будет вывести в отчет на СКД.
Таким образом, в запросе создаем временные таблицы, используем их в запросе на выборку. При помощи консоли компоновок или консоли запросов можно посмотреть содержимое временных таблиц, использованных в пакетном запросе.
ни разу не встречал в запросах уничтожение временных таблиц
Вот буквально на днях видел конструкцию УНИЧТОЖИТЬ в запросе для заполнения декларации по налогу на имущество организаций. Также уничтожение временных таблиц встречается в многоэтажных запросах для расчета заработной платы. Еще встречал в правилах конвертации данных для переноса остатков по ОС из Бухгалтерии 1.6 в 2.0. А в конфигурации УПП 1.3 УНИЧТОЖИТЬ вообще встречается более 300 раз (при расчете себестоимости, зарплатных операциях, переоценке валютных средств, отчетных формах и т.д.).
“Убрать за собой” – это хорошая практика в принципе, меньше растут темплоги, меньше утечек памяти.
Важны случаи, когда нельзя обойтись без уничтожения временных таблиц. Это будет необходимо, если запрос с временными таблицами выполняется в цикле (о, ужас!). На самом деле, если мы итерациями хотим получить решение, на каждом витке проверяя, насколько мы приблизились к нему, то именно в этом случае мы будем использовать предыдущий результат выполнения запроса для получения следующего. То есть из ВремТаб1 получаем ВремТаб2, а из ВремТаб2 – снова ВремТаб1. И здесь надо уничтожить временную таблицу, прежде чем получать таблицу с тем же именем.
Дополню только, что на практике подобный способ выполнения запроса с временными таблицами в цикле можно увидеть, например, в типовой конфигурации УПП 1.3 при заполнении регламентированной формы РегламентированныйОтчетИмущество. Уничтожение временной таблицы производится, чтобы на следующем витке цикла не получилась временная таблица с таким же именем.