Имя: Пароль:
1C
1С v8
Отчет СКД поиск предыдущей записи регистра сведений
,
0 Ly_Alena
 
28.01.15
13:41
Из регистра цены номенклатуры нужно выбрать последнюю и предыдущую запись, чтобы посчитать рост или снижение цены.

Запрос СКД:

ВЫБРАТЬ
    ВложенныйЗапрос.ПлановаяПредыдущая,
    ВложенныйЗапрос1.Приходная,
    ВложенныйЗапрос2.ПлановаяПоследняя,
    ВЫБОР
        КОГДА ВложенныйЗапрос.ПлановаяПредыдущая <> 0
            ТОГДА (ВложенныйЗапрос2.ПлановаяПоследняя / ВложенныйЗапрос.ПлановаяПредыдущая - 1) * 100
    КОНЕЦ КАК Рост,
    ВложенныйЗапрос.Номенклатура
ИЗ
    (ВЫБРАТЬ
        ЦеныНоменклатуры.Цена КАК ПлановаяПредыдущая,
        ЦеныНоменклатуры.Номенклатура.Наименование КАК Номенклатура,
        ЦеныНоменклатуры.Номенклатура.Ссылка КАК НоменклатураСсылка,
        МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
    ИЗ
        РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ГДЕ
        ЦеныНоменклатуры.ТипЦен.Код = "000000008"
        И ЦеныНоменклатуры.Номенклатура.ВидНоменклатуры.Код = "000000004"
    
    СГРУППИРОВАТЬ ПО
        ЦеныНоменклатуры.Цена,
        ЦеныНоменклатуры.Номенклатура.Наименование,
        ЦеныНоменклатуры.Номенклатура.Ссылка) КАК ВложенныйЗапрос
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ЦеныНоменклатурыСрезПоследних.Цена КАК Приходная,
            ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка КАК НоменклатураСсылка
        ИЗ
            РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ) КАК ЦеныНоменклатурыСрезПоследних
        ГДЕ
            ЦеныНоменклатурыСрезПоследних.ТипЦен.Код = "000000001"
        
        СГРУППИРОВАТЬ ПО
            ЦеныНоменклатурыСрезПоследних.Цена,
            ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка) КАК ВложенныйЗапрос1
        ПО ВложенныйЗапрос.НоменклатураСсылка = ВложенныйЗапрос1.НоменклатураСсылка
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка КАК НоменклатураСсылка,
            ЦеныНоменклатурыСрезПоследних.Цена КАК ПлановаяПоследняя,
            ЦеныНоменклатурыСрезПоследних.Период КАК Период
        ИЗ
            РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
        ГДЕ
            ЦеныНоменклатурыСрезПоследних.ТипЦен.Код = "000000008") КАК ВложенныйЗапрос2
        ПО ВложенныйЗапрос.НоменклатураСсылка = ВложенныйЗапрос2.НоменклатураСсылка
ГДЕ
    ВложенныйЗапрос2.Период > ВложенныйЗапрос.Период

Выдает две записи - первая правильно отбирает. Вторая нет.

Что не так?
1 Ly_Alena
 
28.01.15
13:41
Добрый вечер!
2 Ly_Alena
 
28.01.15
13:49
ТО есть мне нужна только одна запись - первая
3 Ly_Alena
 
29.01.15
05:04
Я что в черном списке?
4 VladZ
 
29.01.15
05:45
(0) Ух, намутила...  Неспешный поиск в инете всяко бы привел тебя, как минимум, сюда:  infostart.ru/public/77568/

Посмотри внимательно на второй подзапрос.
5 Ly_Alena
 
29.01.15
06:19
(4) спасибо, инэт весь перерыла - этот пример не попадался. Сейчас буду разбираться!
6 Ly_Alena
 
29.01.15
06:50
(4) Как мне кажется моя сложность (в данном случае) в том, что все берется из одного регистра сведений ЦеныНоменклатуры, а именно берется "Приходная", "Плановая предпоследняя", "Плановая последняя". Все выводится в РАЗНЫХ столбцах.
7 Ly_Alena
 
29.01.15
07:14
Берутся три цены, но с разным ТипЦены
8 вовочка
 
29.01.15
07:34
поиск на мисте по срез предпоследних
v8: Срез последних и предпоследних
9 Ly_Alena
 
29.01.15
08:00
(8) Вовочка!!! Спасибо! То что надо!
10 Ly_Alena
 
29.01.15
10:49
Вот что получилось:

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатуры.Период,
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Цена КАК ПлановаяПредыдущая,
    ВложенныйЗапрос.ПриходнаяПоследняя,
    ВложенныйЗапрос1.ПлановаяПоследняя,
    ВЫБОР
        КОГДА ЦеныНоменклатуры.Цена > 0
            ТОГДА (ВложенныйЗапрос1.ПлановаяПоследняя / ЦеныНоменклатуры.Цена - 1) * 100
    КОНЕЦ КАК Рост
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период,
            ЦеныНоменклатуры.Номенклатура КАК Номенклатура
        ИЗ
            РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СрезПоследних КАК ВТ_СрезПоследних
                ПО ЦеныНоменклатуры.Период < ВТ_СрезПоследних.Период
                    И ЦеныНоменклатуры.Номенклатура = ВТ_СрезПоследних.Номенклатура
        ГДЕ
            ЦеныНоменклатуры.ТипЦен.Код = "000000008"
        
        СГРУППИРОВАТЬ ПО
            ЦеныНоменклатуры.Номенклатура) КАК ПредпоследниеДвижения
        ПО ЦеныНоменклатуры.Период = ПредпоследниеДвижения.Период
            И ЦеныНоменклатуры.Номенклатура = ПредпоследниеДвижения.Номенклатура
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
            ЦеныНоменклатурыСрезПоследних.Цена КАК ПриходнаяПоследняя
        ИЗ
            РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
        ГДЕ
            ЦеныНоменклатурыСрезПоследних.ТипЦен.Код = "000000001") КАК ВложенныйЗапрос
        ПО ЦеныНоменклатуры.Номенклатура = ВложенныйЗапрос.Номенклатура
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
            ЦеныНоменклатурыСрезПоследних.Цена КАК ПлановаяПоследняя
        ИЗ
            РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
        ГДЕ
            ЦеныНоменклатурыСрезПоследних.ТипЦен.Код = "000000008") КАК ВложенныйЗапрос1
        ПО ЦеныНоменклатуры.Номенклатура = ВложенныйЗапрос1.Номенклатура
11 Ly_Alena
 
29.01.15
10:51
НО (!) - выводит только ту номенклатуру, у которой в регистре заполнены все три цены. если хоть одна цена не заполнена - то в отчет не попадает. Подскажите пожалуйста, как сделать чтобы выводил всю номенклатуру?
12 chelentano
 
29.01.15
10:56
(11) вместо внутреннего соединения левое
13 echo77
 
29.01.15
11:00
http://infostart.ru/public/267055/
Посчитать разницу с предыдущей записью
14 Ly_Alena
 
29.01.15
11:00
(12) Точно! Спасибо!
15 Ly_Alena
 
02.02.15
08:24
Доброе утро!
Та же задача, с небольшим изменением в части дат. Даты указывает пользователь - начальную и конечную. Загвоздка в том что выводит две записи и к начальнойдате почему-то заданную дату не привязывает. Что не так?

ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Период КАК ПериодНач,
    NULL КАК ПериодКон,
    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена КАК ПлановаяСебестоимостьНач,
    NULL КАК ПлановаяСебестоимостьКон
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&НачальнаяДата, ТипЦен.Код = "000000007") КАК ЦеныНоменклатурыСрезПоследних

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыСрезПоследних.Период,
    ЦеныНоменклатурыСрезПоследних.Цена,
    ЦеныНоменклатурыСрезПоследних.Номенклатура

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

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

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Период,
    ЦеныНоменклатурыСрезПоследних.Цена
16 Ly_Alena
 
02.02.15
09:04
Никто не хочет помогать?
17 Ly_Alena
 
02.02.15
13:05
На счет почему к датам не привязывает - разобралась - в учет еще время идет. А вот как сделать чтобы в одну строчку выводить...
18 Ly_Alena
 
02.02.15
13:30
В Последнем запросе в группировках - номенклатуру вниз (максимум).
19 Ly_Alena
 
03.02.15
05:48
НО теперь другой косяк вылез - при такой группировке - рост попадает вниз и неправильно считается.

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

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

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

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

СГРУППИРОВАТЬ ПО
    Цены.Номенклатура
20 Ly_Alena
 
03.02.15
07:09
Решила - сгруппировала в первой временной без роста. выгрузила во вторую временную и там уже посчитала рост.
21 ИС-2
 
naïve
03.02.15
07:18
(17) самое простое на закладке выбранные объединить поля в группу, с условием вместе
22 Ly_Alena
 
03.02.15
13:20
В итоге решение было такое:

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

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

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

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

СГРУППИРОВАТЬ ПО
    Цены.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныГруппированные.ПлановаяСебестоимостьНач,
    ЦеныГруппированные.ПлановаяСебестоимостьКон,
    ЦеныГруппированные.Номенклатура,
    (ЦеныГруппированные.ПлановаяСебестоимостьКон / ЦеныГруппированные.ПлановаяСебестоимостьНач - 1) * 100 КАК Рост
ИЗ
    ЦеныГруппированные КАК ЦеныГруппированные
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн