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