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




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

Структура конфигурации представлена на рисунке.

(16.22 килобайт) Кол-во скачиваний: 64

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

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

//Проведение по регистру

КонецЦикла;

КонецПроцедуры

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

|ВЫБРАТЬ
| Док.Номенклатура,

|ИЗ
| (ВЫБРАТЬ

| ИЗ
| Документ.Расходная.Товары
| ГДЕ
| Ссылка = &Ссылка
| СГРУППИРОВАТЬ ПО Номенклатура) КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ
Номенклатура В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| Номенклатура
| ИЗ
| Документ.Расходная.Товары
| ГДЕ
| Ссылка = &Ссылка)) КАК Рег
| ПО

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

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

Не помню уже с какого релиза в запросах стало можно использовать временные таблицы. Для этого используется объект «Менеджер временных таблиц». Фактически менеджер временных таблиц описывает пространство имен временных таблиц и отвечает за их создание и уничтожение в базе данных.

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

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

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

МВТ = Новый МенеджерВременныхТаблиц;

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

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| Номенклатура
|ПОМЕСТИТЬ СписокТоваров
|ИЗ
| Документ.Расходная.Товары
|ГДЕ
| Ссылка = &Ссылка";

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

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

Пока Выборка.Следующий() Цикл

//Проверка отрицательных остатков

//Проведение по регистру

КонецЦикла;

КонецПроцедуры

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

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

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

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

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

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

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

Перепишем процедуру для использования пакетных запросов:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

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

Пока Выборка.Следующий() Цикл

//Проверка отрицательных остатков

//Проведение по регистру

КонецЦикла;

КонецПроцедуры

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Запросы предназначены для извлечения и обработки информации из базы данных для предоставления пользователю в требуемом виде. Под обработкой здесь подразумевается группировка полей, сортировка строк, расчет итогов и т.д. Изменять данные с помощью запросов в 1С нельзя!

Запрос выполняется в соответствии с заданными инструкциями — текстом запроса . Текст запроса составляется в соответствии с синтаксисом и правилами языка запросов . Язык запросов 1С:Предприятие 8 основан на базе стандартного SQL , но имеет некоторые отличия и расширения.

Схема работы с запросом

Общая схема работы с запросом состоит из нескольких последовательных этапов:

  1. Создание объекта Запрос и установка текста запроса;
  2. Установка параметров запроса;
  3. Выполнение запроса и получение результата;
  4. Обход результата запроса и обработка полученных данных.

1. Объект Запрос имеет свойство Текст , которому необходимо присвоить текст запроса.

// Вариант 1
Запрос = Новый Запрос;
Запрос. Текст =
«ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ

|ГДЕ
;

// Вариант 2
Запрос = Новый Запрос («ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
| КурсыВалют.Валюта = &Валюта» );

2. Установка значений параметров осуществляется методом УстановитьПараметр(< Имя>, < Значение>) . Параметры в тексте запроса обозначаются символом «& » и обычно используются в условиях отбора (секция ГДЕ) и в параметрах виртуальных таблиц.

Запрос);

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

  • получить выборку с помощью метода Выбрать(< ТипОбхода>, < Группировки>, < ГруппировкиДляЗначенийГруппировок>) ;
  • выгрузить значения в таблицу значений или дерево значений с помощью метода Выгрузить(< ТипОбхода>) .

// Получение выборки

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

// Получение таблицы значений
РезультатЗапроса = Запрос. Выполнить();
Таблица = РезультатЗапроса. Выгрузить ();

4. Обойти выборку результата запроса можно с помощью цикла:

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

Полный пример работы с запросом может выглядеть так:

// Этап 1. Создание запроса и установка текста запроса
Запрос = Новый Запрос;
Запрос. Текст =
«ВЫБРАТЬ
| КурсыВалют.Период,
| КурсыВалют.Валюта,
| КурсыВалют.Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
| КурсыВалют.Валюта = &Валюта» ;

// Этап 2. Установка параметров
Запрос. УстановитьПараметр(«Валюта» , ВыбраннаяВалюта );

// Этап 3. Выполнение запроса и получение выборки
РезультатЗапроса = Запрос. Выполнить();
Выборка = РезультатЗапроса. Выбрать ();

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

Состав текста запроса

Текст запроса состоит из нескольких секций:

  1. Описание запроса — перечень выбираемых полей и источников данных;
  2. Объединение запросов — выражения «ОБЪЕДИНИТЬ» и «ОБЪЕДИНИТЬ ВСЕ»;
  3. Упорядочивание результатов — выражение «УПОРЯДОЧИТЬ ПО …»;
  4. Автоупорядочивание — выражение «АВТОУПОРЯДОЧИВАНИЕ»;
  5. Описание итогов — выражение «ИТОГИ … ПО …».

Обязательной является только первая секция.

Временные таблицы и пакетные запросы

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

Часто можно столкнуться с ситуацией, когда в качестве источника запроса нужно использовать не таблицы базы данных, а результат выполнения другого запроса. Эту задачу можно решить с помощью вложенных запросов или временных таблиц . Применение временных таблиц позволяет упростить текст сложного запроса, разделив его на составные части, а также, в некоторых случаях, ускорить выполнение запроса и уменьшить количество блокировок. Для работы с временными таблицами используется объект МенеджерВременныхТаблиц . Создание временной таблицы производится при помощи ключевого слова ПОМЕСТИТЬ, за которым следует наименование временной таблицы.

МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос. МенеджерВременныхТаблиц = МенеджерВТ;

Запрос. Текст =
«ВЫБРАТЬ
| Валюты.Код,
| Валюты.Наименование
|ПОМЕСТИТЬ ВТВалюты
|ИЗ
| Справочник.Валюты КАК Валюты» ;

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

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

Пакетный запрос — это запрос, в котором содержится несколько запросов, разделенных символом «;». При выполнении пакетного запроса все входящие в него запросы выполняются последовательно, причем результаты всех временных таблиц доступны всем последующим запросам. Явное присвоение менеджера временных таблиц пакетным запросам не обязательно. Если менеджер временных таблиц не присвоен, то все временные таблицы удалятся сразу после выполнения запроса.

Для пакетных запросов доступен метод ВыполнитьПакет () , который выполняет все запросы и возвращает массив результатов. Временные таблицы в пакетном запросе будут представлены таблицей с одной строкой и одной колонкой «Количество», в которой хранится количество записей. Для отладки пакетных запросов можно использовать метод ВыполнитьПакетСПромежуточнымиДанными () : он возвращает реальное содержимое временных таблиц, а не количество записей.

// Пример работы с пакетным запросом
Запрос = Новый Запрос;
Запрос. Текст =
«ВЫБРАТЬ
| Валюты.Наименование
|ИЗ
| Справочник.Валюты КАК Валюты
|;
|ВЫБРАТЬ
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура» ;

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

ТЗВалюты = РезультатПакета[ 0 ]. Выгрузить();
ТЗНоменклатура = РезультатПакета[ 1 ]. Выгрузить();

// Пример использования временных таблиц в пакетном запросе
Запрос = Новый Запрос;
Запрос. Текст =
«ВЫБРАТЬ
| Товары.Ссылка КАК Товар
|ПОМЕСТИТЬ ВТТовары
|ИЗ
| Справочник.Номенклатура КАК Товары
|ГДЕ
| Товары.Производитель = &Производитель
|;
|ВЫБРАТЬ
| ВТТовары.Товар,
| ПТУ.Количество,
| ПТУ.Цена,
| ПТУ.Ссылка КАК ДокументПоступления
|ИЗ
| ВТТовары КАК ВТТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПТУ
| ПО ВТТовары.Товар = ПТУ.Номенклатура»
;

Запрос. УстановитьПараметр(«Производитель» , Производитель);

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

Пока Выборка .Следующий () Цикл

КонецЦикла;

Виртуальные таблицы

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

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

  • Для регистров сведений:
    • СрезПервых(<Период>, <Условие>) — наиболее ранние записи на указанную дату;
    • СрезПоследних(<Период>, <Условие>) — наиболее поздние записи на указанную дату;
  • Для регистров накопления:
    • Остатки(<Период>, <Условие>) — остатки на указанную дату;
    • Обороты(<НачалоПериода>, <КонецПериода>, <Периодичность>, <Условие>) — обороты за период;
    • ОстаткиИОбороты(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <Условие>) — остатки и обороты за период;
  • Для регистров бухгалтерии:
    • Остатки(<Период>, <УсловиеСчета>, <Субконто>, <Условие>) — остатки на указанную дату в разрезе счета, измерений и субконто;
    • Обороты(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчета>, <Субконто>, <Условие>, <УсловиеКорСчета>, <КорСубконто>) — обороты за период в разрезе счета, измерений, кор. счета, субконто, кор. субконто;
    • ОстатковИОборотов(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <УсловиеСчета>, <Субконто>, <Условие>) — остатки и оборотов в разрезе счета, измерений и субконто;
    • ОборотыДтКт(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчетаДт>, <СубконтоДт>, <УсловиеСчетаКт>, <СубконтоКт>, <Условие>) — обороты за период в разрезе счета Дт, счета Кт, Субконто Дт, Субконто Кт;
    • ДвиженияССубконто(<НачалоПериода>, <КонецПериода>, <Условие>, <Порядок>, <Первые>) — движения вместе со значениями субконто;
  • Для регистров расчета:
    • База(<ИзмеренияОсновногоРегистра>, <ИзмеренияБазовогоРегистра>, <Разрезы>, <Условие>) — базовые данные регистра расчета;
    • ДанныеГрафика(<Условие>) — данные графика;
    • ФактическийПериодДействия(<Условие>) — фактический период действия.

При работе с виртуальными таблицами следует накладывать отборы в параметрах виртуальных таблиц, а не в условии ГДЕ. От этого сильно зависит время выполнения запроса.

Конструктор запроса

Для ускорения ввода текстов запросов платформа имеет специальные инструменты: Конструктор запроса и Конструктор запроса с обработкой результата . Для вызова конструкторов необходимо щелкнуть правой кнопкой мыши и выбрать требуемый пункт:

Также конструкторы можно вызвать из главного меню Текст .

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

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

Объект СхемаЗапроса

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

  • УстановитьТекстЗапроса(< Текст>) — заполняет свойство ПакетЗапросов на основании переданного текста запроса;
  • ПолучитьТекстЗапроса () — возвращает сформированный на основании свойства ПакетЗапросов текст запроса;
  • НайтиПараметры () — возвращает параметры запроса.

Рассмотрим пример работы с объектом СхемаЗапроса. Для программного формирования текста запроса

УПОРЯДОЧИТЬ ПО
Валюты.Код

Код на встроенном языке может выглядеть так:

СхемаЗапроса = Новый СхемаЗапроса;
Пакет1 = СхемаЗапроса. ПакетЗапросов[ 0 ];
Оператор1 = Пакет1. Операторы[ 0 ];
// добавление источника
ТаблицаРегистра = Оператор1. Источники. Добавить(«Справочник.Валюты» , «Валюты» );
// добавление полей
ПолеСсылка = Оператор1. ВыбираемыеПоля. Добавить(«Валюты.Ссылка» , 0 );
ПолеКод = Оператор1. ВыбираемыеПоля. Добавить(«Валюты.Код» , 1 );
// указание псевдонимов полей
Пакет1. Колонки[ 0 ]. Псевдоним = «Валюта» ;
Пакет1. Колонки[ 1 ]. Псевдоним = «Код» ;
// добавление условия
Оператор1. Отбор. Добавить(«НЕ ПометкаУдаления» );
// добавление упорядочивания
Пакет1. Порядок. Добавить(ПолеКод);
ТекстЗапроса = СхемаЗапроса. ПолучитьТекстЗапроса ();