Иногда требуется запросом получить из периодического регистра сведений данные на несколько дат сразу. Типичный пример — работа с курсами валют. Рассмотрим алгоритм решение данной задачи на примере.
Постановка задачи
В базе создан документ «РеализацияТоваровУслуг», в шапке которого есть реквизит «Валюта». Запросом требуется для каждого документа получить актуальный курс валюты из шапки на дату документа. Хранение курсов валют осуществляется в периодическом регистре сведений «КурсыВалют«.
Решением «в лоб» этой задачи мог бы быть запрос в цикле: получение всех документов с их датами и валютой и в выборке обращение к виртуальной таблице среза последних регистра «КурсыВалют». Но т.к. запрос в цикле — это «плохо», попробуем реализовать задачу одним запросом.
Решение
Для решения задачи будем использовать факт, что таблицы в запросе можно соединять не только на равенство полей.
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка,
РеализацияТоваровУслуг.Валюта,
МАКСИМУМ(КурсыВалют.Период) КАК Период
ПОМЕСТИТЬ ВТПериодыУстановкиКурсов
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО РеализацияТоваровУслуг.Валюта = КурсыВалют.Валюта
И РеализацияТоваровУслуг.Дата >= КурсыВалют.Период
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслуг.Ссылка,
РеализацияТоваровУслуг.Валюта
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТПериодыУстановкиКурсов.Ссылка,
ВТПериодыУстановкиКурсов.Валюта,
КурсыВалют.Курс
ИЗ
ВТПериодыУстановкиКурсов КАК ВТПериодыУстановкиКурсов
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ВТПериодыУстановкиКурсов.Период = КурсыВалют.Период
И ВТПериодыУстановкиКурсов.Валюта = КурсыВалют.Валюта
Порядок действий в запросе:
- Получение для каждого документа периода установки курса валюты. Документы соединяются с ФИЗИЧЕСКОЙ таблицей «КурсыВалют». Здесь следует обратить внимание на условия соединения. Валюты должны быть равны, а дата документа >= периоду регистра сведений.
В результате такого соединения для каждого документа будет получено множество строк, удовлетворяющих условию: все записи курсов по валюте документа, установленные не позже даты документа.
Завершающим этапом будет группировка строк с получением максимального периода курса. В результате для каждого документа будет получен требуемый период установки курса для нужной валюты (максимальная дата установки курса валюты, но не больше даты документа). Результат помещается во временную таблицу ВТПериодыУстановкиКурсов. - Получение курса. Временная таблица ВТПериодыУстановкиКурсов соединяется с ФИЗИЧЕСКОЙ таблицей «КурсыВалют». Соединение происходит по Валюте документа и периоду установки курса, определенному во второй временной таблице.