Использование отборов в запросах с виртуальными таблицами

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

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

измерение - Товар

ресурс - Количество

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

Копировать в буфер обмена
ВЫБРАТЬ 
    ОстатокСумма
ИЗ
        РегистрНакопления.Запасы.Остатки()
ГДЕ
        Товар = &Товар

2. Запрос с использованием отбора заданного параметром виртуальной таблицы

Копировать в буфер обмена
ВЫБРАТЬ 
    ОстатокСумма
ИЗ
        РегистрНакопления.Запасы.Остатки(, Товар = &Товар)

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

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

измерение - Валюта

реквизит - Источник

ресурс – Курс

Где реквизит Источник может принимать значения: интернет, печатные издания.

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

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

Копировать в буфер обмена
ВЫБРАТЬ
        Валюта, Курс
ИЗ
        РегистрСведений.КурсыВалют.СрезПоследних()
ГДЕ
        Источник = &Источник

2.Запрос с использованием отбора заданного параметром виртуальной таблицы

Копировать в буфер обмена
ВЫБРАТЬ
    Валюта, Курс
ИЗ
        РегистрСведений.КурсыВалют.СрезПоследних(, Источник = &Источник)

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

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

Период

Валюта

Курс

Источник

19.03.2003

USD

31.00

Печатные издания

19.03.2003

EUR

34.00

Печатные издания

20.03.2003

USD

31.10

Интернет

То первый запрос вернет:

Валюта

Курс

EUR

34.00

Второй запрос вернет:

Валюта

Курс

USD

31.00

EUR

34.00