Имя: Пароль:
1C
1С v8
Получение данных из периодического регистра сведений одним запросом
0 alexpaiko1
 
10.06.16
12:38
Необходимо реализовать получение одним запросом 2-х последних цен и
процента изменения из регистра сведений цены номенклатуры.
Записи регистра:
1.     01/10/2011 Номенклатура1 5.00
2.     02/10/2011 Номенклатура1 1.00
3.     12/10/2011 Номенклатура1 2.00
4.     04/10/2011 Номенклатура2 1.00
5.     07/10/2011 Номенклатура2 1.20
6.     13/10/2011 Номенклатура2 5.20
7.     01/01/2011 Номенклатура3 70.00
8.     05/05/2011 Номенклатура3 99.00
9.     01/07/2011 Номенклатура3 70.00


Конечная таблица:

№    Номенклатура    Цена предыдущая    Цена текущая    Процент изменения
1    Номенклатура1         1.00         2.00              100%
2    Номенклатура2         1.20         5.20             333.33%
3    Номенклатура3         99.00        70.00            -29.23%


Набрал запрос, но не получается вывести предпоследнюю цену.

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

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

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатуры.Цена,
    пос_цены.Номенклатура,
    пос_цены.Цена
1 asady
 
10.06.16
12:45
(0) используй таблицу РС а не ВТ СрезПоследних
2 alexpaiko1
 
10.06.16
12:53
Во втором запросе я использую таблицу РС. Но все равно не получается две последние цены получить
3 GROOVY
 
10.06.16
12:55
4 alexpaiko1
 
10.06.16
12:57
спасибо
5 Ёпрст
 
гуру
10.06.16
12:58
(0) во втором запросе делай левое соединение с подзапросом, в котором ищи ( максимум(Период), номенклатура, цена
где Период<пос_цены.Период)
6 alexpaiko1
 
10.06.16
14:23
спасибо
7 alexpaiko1
 
10.06.16
15:28
Попробовал. Все равно не получается.
Вот текст
ВЫБРАТЬ
    Товары.Ссылка КАК Ном,
    ЦеныНоменклатурыСрезПоследних.Период,
    ЦеныНоменклатурыСрезПоследних.Цена КАК Пос_Цена
ПОМЕСТИТЬ Пос_цены
ИЗ
    Справочник.Номенклатура КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыСрезПоследних
        ПО Товары.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Пос_цены.Ном,
    Пос_цены.Пос_Цена,
    ВложенныйЗапрос.Цена
ИЗ
    Пос_цены КАК Пос_цены
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период,
            ЦеныНоменклатуры.Цена КАК Цена
        ИЗ
            Пос_цены КАК Пос_цены
                ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                ПО Пос_цены.Ном = ЦеныНоменклатуры.Номенклатура
                    И Пос_цены.Период > ЦеныНоменклатуры.Период
        
        СГРУППИРОВАТЬ ПО
            ЦеныНоменклатуры.Цена) КАК ВложенныйЗапрос
        ПО Пос_цены.Период > ВложенныйЗапрос.Период
8 kittystark
 
10.06.16
16:11
на вскидку как-то так:

Т - твоя исходная таблица

поместить в ВТ1: Т как Т1 левое соединение Т как Т2 по т1.ном = т2.ном и т1.период >= т2.период
сгруппировав по всем полям, в полях добавить КОЛИЧЕСТВО(т2.номенклатура) - это поле будет номер по порядку (НПП) внутри одной номенклатуры

поместить в ВТ2: максимум по НПП, сгруппировав ВТ1 по номенклатуре

выбрать * из ВТ1 левое соед ВТ2 по вт1.номенклатура = вт2.номенклатура и(вт2.макс_нпп = вт1.нпп или вт2.макс_нпп-1 = вт1.нпп)
где не вт2.номенклатура есть null
9 Ёпрст
 
гуру
10.06.16
16:14
На вот, не совсем оптимально, но и хрен с ним.
ЗЫ: ну не сделали коррелированных подзапросов в селекте, приходится через жпо писать

ВЫБРАТЬ
    "Валенки" КАК Номенклатура,
    ДАТАВРЕМЯ(2011, 1, 1) КАК Период,
    5 КАК Цена
ПОМЕСТИТЬ Табличка

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Валенки",
    ДАТАВРЕМЯ(2011, 10, 2),
    10

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Валенки",
    ДАТАВРЕМЯ(2011, 10, 12),
    20

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Сапоги",
    ДАТАВРЕМЯ(2011, 10, 4),
    10

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Сапоги",
    ДАТАВРЕМЯ(2011, 10, 7),
    20

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Сапоги",
    ДАТАВРЕМЯ(2011, 10, 13),
    30

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Тапки",
    ДАТАВРЕМЯ(2011, 1, 1),
    70

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Тапки",
    ДАТАВРЕМЯ(2011, 5, 5),
    99

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Тапки",
    ДАТАВРЕМЯ(2011, 7, 1),
    80
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТАбличка.Номенклатура,
    ТАбличка.Период,
    ТАбличка.Цена
ПОМЕСТИТЬ ТабличкаПоследняяЦена
ИЗ
    Табличка КАК ТАбличка
ГДЕ
    (ТАбличка.Номенклатура, ТАбличка.Период) В
            (ВЫБРАТЬ
                ТАбличка.Номенклатура,
                МАКСИМУМ(ТАбличка.Период)
            ИЗ
                ТАбличка
            СГРУППИРОВАТЬ ПО
                ТАбличка.Номенклатура)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Табличка.Номенклатура,
    Табличка.Период,
    Табличка.Цена
    Поместить врТабличка
ИЗ
    Табличка КАК Табличка
ГДЕ
    (Табличка.Номенклатура, Табличка.Период) В
            (ВЫБРАТЬ
                Табличка.Номенклатура,
                МАКСИМУМ(Табличка.Период) КАК Период
            ИЗ
                Табличка КАК Табличка
                    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТабличкаПоследняяЦена КАК ТабличкаПоследняяЦена
                    ПО
                        Табличка.Номенклатура = ТабличкаПоследняяЦена.Номенклатура
                            И Табличка.Период < ТабличкаПоследняяЦена.Период
            СГРУППИРОВАТЬ ПО
                Табличка.Номенклатура)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТабличкаПоследняяЦена.Номенклатура,
    ТабличкаПоследняяЦена.Период,
    ТабличкаПоследняяЦена.Цена,
    врТабличка.Период КАК ПредПериод,
    врТабличка.Цена КАК ПредЦена
ИЗ
    ТабличкаПоследняяЦена КАК ТабличкаПоследняяЦена
        ЛЕВОЕ СОЕДИНЕНИЕ врТабличка КАК врТабличка
        ПО (врТабличка.Номенклатура = ТабличкаПоследняяЦена.Номенклатура)
Закон Брукера: Даже маленькая практика стоит большой теории.