Срезы последних (интерполяция периодических сведений)

FastCode 1518 12 22 67

"Срезы последних" - одна из первых задач, на которой спотыкается начинающий программист 1С. Хорошо поняв идею виртуального регистра "Срез последних", мы ожидаем такой же простоты, если задана не одна дата, на которую нужно выбрать сведения, а несколько. Но, увы, приходится использовать два запроса. В первом мы выбираем ближайшие в прошлом даты, на которые были установлены значения, а во втором по датам определяем сами значения.

Оказывается, при большом желании можно уложиться в один запрос. Вот этот запрос для примера решения задачи "Продажи с выводом цены заданного типа, действующей на момент отгрузки".

ВЫБРАТЬ 
    Продажи.Период,
    Продажи.Контрагент, 
    Продажи.Номенклатура, 
    СУММА(Продажи.КоличествоОборот) КАК Количество, 
    СУММА(Продажи.СтоимостьОборот) КАК Стоимость, 
    МИНИМУМ(РАЗНОСТЬДАТ(ЦеныНоменклатуры.Период, Продажи.Период, ДЕНЬ) * &Много + ЦеныНоменклатуры.Цена) 
    - МИНИМУМ(РАЗНОСТЬДАТ(ЦеныНоменклатуры.Период, Продажи.Период, ДЕНЬ) * &Много) КАК Цена 
ИЗ 
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи 
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры 
            ПО Продажи.Номенклатура = ЦеныНоменклатуры.Номенклатура 
            И (ЦеныНоменклатуры.ТипЦен = &ТипЦен) 
            И (ЦеныНоменклатуры.Период < = Продажи.Период)
СГРУППИРОВАТЬ ПО 
    Продажи.Период, 
    Продажи.Контрагент, 
    Продажи.Номенклатура

Идея в том, чтобы вместо поиска периода, на котором начинается актуальная цена, искать саму цену. Для этого подобрана функция, которая "отправляет" цену прошлого периода на свой "эшелон", высота которого зависит от древности цены. Ширина "эшелона" задается параметром "Много" - это величина, гарантированно перекрывающая диапазон изменения цены (1000000, 10000000 и т.п.). После нахождения ближайшей (нижайшей) "летящей" цены, высота соответствующего "эшелона" вычитается и цена "опускается на землю".

Можно подобрать функцию для дат, булевых и строковых значений.

Кроме краткости записи, других достоинств у запроса нет. Минусы - некоторый проигрыш по времени "классическому" запросу из-за большего объема вычислений в группировках, необходимость думать над значением "Много", работа только с простыми типами.

Вообще, вместе с этим, известно четыре способа интерполяции. Интересно было бы провести вычислительный эксперимент по сравнению их эффективности. Пока всегда выигрывал классический способ.

Автор: ildarovich

0

См. также

Создать временную таблицу по имени регистра СрезПоследних

Запись в регистр сведений (периодический, независимый)

Плановая себестоимость продаж (цена на Дату документа)

ПоследняяПроверкаВерсииДействующихДатЗапрета (БСП)

Движения периодического регистра сведений без повторов

СрезРазрешений (БСП)

ОписаниеПоследнейЗагрузки (БСП)

ПриВыполненииСтандартныхПериодическихПроверокНаКлиенте (БСП)

ПриВыполненииСтандартныхПериодическихПроверокНаСервере (БСП)

Модератору