Один запрос, который довольно часто пригождался. Введение Довольно часто возникает задача в запросе получить актуальное значение ресурса на каждую дату выбранного периода. Вот несколько таких случаев: Курс валюты на дату каждого документа за выбранный период Цену товара на дату реализации по всем реализациям за период Должность сотрудника на каждую дату периода
//1)Традиционный подход
/// первый запрос - выбирает все даты документов
ВЫБРАТЬ РАЗЛИЧНЫЕ
НАЧАЛОПЕРИОДА(Товары.Ссылка.Дата, ДЕНЬ) КАК ДатаДокумента
ПОМЕСТИТЬ
ВТ_ДатыДокументов
ИЗ
Документ.Реализация.Товары КАК Товары
ГДЕ
Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
;
/// второй запрос - выбирает из нашего регистра сведений измерения и максимальный период на каждую дату
ВЫБРАТЬ
ВТ_ДатыДокументов.ДатаДокумента,
Цены.Номенклатура,
МАКСИМУМ(Цены.Период) КАК ДатаЦены
ПОМЕСТИТЬ
ВТ_ДатыНачалаДействия
ИЗ
ВТ_ДатыДокументов КАК ВТ_ДатыДокументов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК Цены
ПО Цены.Период <= ВТ_ДатыДокументов.ДатаДокумента
ГДЕ
Цены.ТипЦены = &ТипЦены // например, такой отбор, или какой-нибудь другой
СГРУППИРОВАТЬ ПО
ВТ_ДатыДокументов.ДатаДокумента,
Цены.Номенклатура
;
/// третий запрос - выбирает из нашего регистра актуальные значения ресурсов на каждую дату документа
ВЫБРАТЬ
ВТ_ДатыНачалаДействия.ДатаДокумента,
Цены.Номенклатура,
Цены.Цена
ПОМЕСТИТЬ
ВТ_ЗначенияРесурсов
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК Цены
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ДатыНачалаДействия КАК ВТ_ДатыНачалаДействия
ПО ВТ_ДатыНачалаДействия.Период = Цены.Период
И ВТ_ДатыНачалаДействия.Номенклатура = Цены.Номенклатура
ГДЕ
Цены.ТипЦены = &ТипЦены // не забываем еще раз указать тот же отбор
;
/// четвертый запрос - основной, который получает нужные данные из временной таблицы, полученной на предыдущем шаге
ВЫБРАТЬ
Товары.Ссылка КАК Документ,
Товары.Номенклатура,
ВТ_ЗначенияРесурсов.Цена * Товары.Количество КАК Сумма // тут делаем что-то нужное нам с полученными значениями
ИЗ
Документ.Реализация.Товары КАК Товары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ЗначенияРесурсов КАК ВТ_ЗначенияРесурсов
ПО Товары.Номенклатура = ВТ_ЗначенияРесурсов.Номенклатура
И НАЧАЛОПЕРИОДА(Товары.Ссылка.Дата, ДЕНЬ) = ВТ_ЗначенияРесурсов.ДатаДокумента
//2)Подход со слабой связностью
/// первый запрос - вытаскиваем из регистра сведений все что нужно за один раз
ВЫБРАТЬ
Период,
Номенклатура,
Цена
ПОМЕСТИТЬ ВТ_Срез
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК Движения
ГДЕ
Период > &НачалоПериода
И Период <= &КонецПериода
И ТипЦены = &ТипЦены // например, такой отбор, или какой-нибудь другой
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Период,
Номенклатура,
Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&НачалоПериода, ТипЦены = &ТипЦены // тут надо повторить отбор
) КАК Срез
ИНДЕКСИРОВАТЬ ПО
Движения.Номенклатура,
Движения.Период
;
/// второй запрос - собираем таблицу с периодами действия ресурса
ВЫБРАТЬ
НачалоПериода.Номенклатура,
НачалоПериода.Цена,
НачалоПериода.Период КАК НачалоПериода,
ЕСТЬNULL(ДОБАВИТЬКДАТЕ(МИНИМУМ(КонецПериода.Период), СЕКУНДА, -1), &КонецПериода) КАК КонецПериода
ПОМЕСТИТЬ ВТ_ЗначенияРесурсов
ИЗ
ВТ_Срез КАК НачалоПериода
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Срез КАК КонецПериода
ПО НачалоПериода.Номенклатура = КонецПериода.Номенклатура
И НачалоПериода.Период < КонецПериода.Период
СГРУППИРОВАТЬ ПО
НачалоПериода.Период,
НачалоПериода.Номенклатура,
НачалоПериода.Цена
;
/// третий запрос - основной, который получает нужные данные из временной таблицы, полученной на предыдущем шаге
ВЫБРАТЬ
Товары.Ссылка КАК Документ,
Товары.Номенклатура,
ВТ_ЗначенияРесурсов.Цена * Товары.Количество КАК Сумма // тут делаем что-то нужное нам с полученными значениями
ИЗ
Документ.Реализация.Товары КАК Товары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ЗначенияРесурсов КАК ВТ_ЗначенияРесурсов
ПО Товары.Номенклатура = ВТ_ЗначенияРесурсов.Номенклатура
И Товары.Ссылка.Дата МЕЖДУ ВТ_ЗначенияРесурсов.НачалоПериода И ВТ_ЗначенияРесурсов.КонецПериода
{6} Ожидается идентификатор Орфографическая ошибка в нибудь (найдено 2): нибудь
Получить даты за период в запросе
ШаблонТекстаЗапросаОпределенияБлижайшихДатПоГрафикуРаботы (БСП)
Нахождение интервалов в запросе
Плановая себестоимость продаж (цена на Дату документа)
ПодключитьТестовыйПериод (БСП)
ДатыОбъектаОдногоПериода (БСП)
УстановитьИнтервалДатДляПросмотра (БСП)