Цитата из учебника: (подчёркивания мои)
Глава 5: Вывод остатков в форме спискаДля этой цели больше всего подходят параметризированные запросы(только для СКЛ!).
Выглядит такой запрос так:
ТекстЗапроса = "
|SELECT
| $Рег.Количество as Количество
|FROM
| $РегистрИтоги.ОстаткиТоваров as Рег
|WHERE
| Рег.Period = {d’2005-01-01’} AND
| $Рег.Склад = ? AND
| $Рег.Товар = ?";
Суть состоит в том, что запрос
компилируется только 1 раз, а в остальные разы меняются только параметры, помеченные знаком “?”. За счет этого достигается некоторый выигрыш в скорости.
Для того, чтобы воспользоваться этой хорошей штукой поступим следующим образом:
В модуле формы
заведем переменную RS. В процедуре
ПриОткрытии() проинициализируем ее:
Процедура ПриОткрытии()
RS = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = // … смотри выше
RS.Подготовить(ТекстЗапроса);
RS.ПостроитьПараметры();
RS.УстПараметр(1, ВыбСклад);
КонецПроцедуры
В качестве периода в запросе будем использовать начало текущего месяца.
Добавим текстовую колонку, в которой пропишем формулу
Функция ПолучитьОстаток()
RS.УстПараметр(2, ТекущийЭлемент());
Возврат RS.ВыполнитьСкалярный();
КонецФункции
Здесь нужно помнить, что запрос нужно писать такой, который вернет только одну позицию. Это можно всегда сделать
с помощью функции SUM(). Опять же для того чтобы это быстро бегало необходимо наиболее точно попасть в индекс, т.е указать все поля участвующие в индексе. В данном случае это все измерения.
В этом примере мы использовали метод ВыполнитьСкалярный() который возвращает не таблицу, а единственное значение или структуры, если выбирается несколько колонок.
Вы конечно спросите: А почему не использовали ВТ Остатки? Да, это единственное место где ее применять не очень хорошо, т.к. там присутствует метод GROUP BY, что несколько снижает скорость работы.