Для упрощения написания типовых запросов система предоставляет набор виртуальных таблиц, которые можно рассматривать как параметризованные запросы. Язык запросов позволяет задать отбор двумя способами: в предложении запроса ГДЕ, и параметром виртуальной таблицы. В данном разделе описываются различия их использования.
Рассмотрим два запроса к одному и тому же регистру накопления, выбирающие остаток заданного товара на текущий момент.
Допустим, регистр имеет следующую структуру:
измерение - Товар
ресурс - Количество
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 |