Имя: Пароль:
1C
1С v8
Получить в запросе предыдущее и все значения
0 Barry
 
25.07.25
19:49
Доброго времени суток!
Столкнулся с такой проблемкой, в общем есть регистр сведений с ценами. Я пытаюсь получить в одной колонке все цены из регистра по указанной номенклатуре, а в другой колонке предыдущую цену.

Вот мой запрос, он позволяет мне получить предыдущую цену, но  саму цену дублирует по срезу последних. В чем может быть проблема?

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

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыПоставщиков.Номенклатура,
    ЦеныНоменклатурыПоставщиков.Цена,
    ВложенныйЗапрос.Цена
1 Волшебник
 
25.07.25
21:26
Добавьте ИТОГИ ПО
2 Волшебник
 
25.07.25
21:29
Когда от запроса требуют какую-то фигню, я понимаю, что это какая-то жертва СКД, которая пытается втиснуть бизнес-логику в запрос.

Освойте временные таблицы, уже сразу станет жить полегче.
А ещё лучше перестаньте делать всякую фигню!
3 mikecool
 
25.07.25
21:42
(0) не использовать срезы
4 Barry
 
25.07.25
22:56
(3) попробовал с объединением, но теперь нужно их как-то склеить по строчкам, а то расползлись):

ВЫБРАТЬ
    ЦеныНоменклатурыПоставщиков.Период КАК Период,
    ЦеныНоменклатурыПоставщиков.Номенклатура КАК Номенклатура,
    0 КАК ПредыдущаяЦена,
    ЦеныНоменклатурыПоставщиков.Цена КАК Цена
ИЗ
    РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков
ГДЕ
    ЦеныНоменклатурыПоставщиков.Номенклатура = &Номенклатура

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ЦеныНоменклатурыПоставщиков.Период,
    ЦеныНоменклатурыПоставщиков.Номенклатура,
    ЦеныНоменклатурыПоставщиков.Цена,
    0
ИЗ
    РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ЦеныНоменклатурыПоставщиковСрезПоследних.Период КАК Период,
            ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура КАК Номенклатура,
            ЦеныНоменклатурыПоставщиковСрезПоследних.Цена КАК Цена
        ИЗ
            РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних КАК ЦеныНоменклатурыПоставщиковСрезПоследних) КАК ВложенныйЗапрос
        ПО ЦеныНоменклатурыПоставщиков.Номенклатура = ВложенныйЗапрос.Номенклатура
            И ЦеныНоменклатурыПоставщиков.Период < ВложенныйЗапрос.Период
ГДЕ
    ЦеныНоменклатурыПоставщиков.Номенклатура = &Номенклатура
5 Волшебник
 
26.07.25
10:27
(4) чушь
6 TormozIT
 
гуру
26.07.25
11:10
Это частный случай задачи "Срез последних на каждую дату в запросе". В ИР решается нажатием одной кнопки после настройки связи таблиц https://www.hostedredmine.com/issues/1006018 . В твоем случае таблицы будут одинаковы и условие сравнения дат будет строго меньше/больше.