Имя: Пароль:
1C
1С v8
v8: Получение последних записей регистра вместе с предпоследними
0 Кондидат В
 
22.02.12
21:20
Всем привет.
Задача следующая: Вывести последние цены номенклатуры и предпоследние...

Кто нибудь решал такую задачу, и как???
1 XLife
 
22.02.12
21:22
кандидат куда?
2 Кондидат В
 
22.02.12
21:23
(1) А по существу вопроса???
3 XLife
 
22.02.12
21:23
запрос с обратной сортировкой по периоду?
4 Кондидат В
 
22.02.12
21:23
(3) а записей то там больше 2х может быть
5 aleks-id
 
22.02.12
21:23
>>пердпоследними
как тонко подмечено!
6 Кондидат В
 
22.02.12
21:28
Ну так что, мыслей больше нет?
7 КМ155
 
22.02.12
21:29
(6) да и пишется кандидат через а
8 Кондидат В
 
22.02.12
21:31
Ну да, ну да. Я знаю как пишется уже давно мой ник. Исправлять, т.е. заводить новый не хотелось. Есть что нибудь по вопросу
9 КМ155
 
22.02.12
21:32
(8) с таким ником нет шансов получить ответ
10 Кондидат В
 
22.02.12
21:34
Нет шансов получить ответ только тогда, когда ответа получать неукого
11 mikecool
 
22.02.12
21:34
выбрать номенкатура, цена как последняя, предпоследниецены.Цена как предпоследняя
из ценыноменклатуры
inner join ценыноменклатуры.срезпоследних
по Номенклатура, цена
left join ценыноменклатуры как предпоследниецены
по номенклатура, ценыноменклатуры.Период > предпоследниецены.период

с тебя 500р
12 aleks-id
 
22.02.12
21:36
(11) ты попал ибо щас начнутся крики "никуя не работает" )))
13 Кондидат В
 
22.02.12
21:36
ответ и 5р не стоит
left join может вернуть больше одной записи. Этот вариант рассматривался
14 mikecool
 
22.02.12
21:37
(13) если тебе не в кайф думать, то мне тоже
в условие лефта надо еще одно дописать и усе будет
но тут придется подумать тебе
15 mikecool
 
22.02.12
21:38
а написал - совсем не думая, так что - работать не будет )))
16 Кондидат В
 
22.02.12
21:38
+(12) Единственное, видимо, это делать итоги по срезу последних сортировать внутри и брать первую только запись.
17 Кондидат В
 
22.02.12
21:39
+(16) хотелось бы получить таблицу без вложений
18 КМ155
 
22.02.12
21:42
(15) упрости думательную задачу,
в 99% у 1С периодичность Рг Цены день
19 Кондидат В
 
22.02.12
21:44
(18) и что же это дает кроме необходимости получать итоговые записи?
20 DexterMorgan
 
22.02.12
21:49
(19) ну в одной таблице итоговые, в другой Период = ДобавитьКДате(НачалоПериода(&ТекущаяДата, День), Секунда, -1) ...мб....
21 DexterMorgan
 
22.02.12
21:51
уоу в (20) чушь сорри=)))
22 azernot
 
22.02.12
22:18
ВЫБРАТЬ
   ЦеныНоменклатуры.Период КАК Период,
   ЦеныНоменклатуры.Номенклатура,
   ЦеныНоменклатуры.Цена
ПОМЕСТИТЬ ПредыдущиеЦены
ИЗ
   РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
   ЦеныНоменклатуры.Номенклатура В ИЕРАРХИИ(&Номенклатура)
   И ЦеныНоменклатуры.ТипЦен = &ТипЦен
   И ЦеныНоменклатуры.Период < &ДатаЦен
;

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


Дарю...
23 azernot
 
22.02.12
22:25
+(22) Если нужны действующие цены даже если предыдущих не было, вместо внутреннего соединения использовать левое. Просто мне нужны были именно изменённые цены для "зачёркнутых" ценников.
24 Кондидат В
 
23.02.12
08:09
(22), (23) Спасибо!
25 Ткачев
 
24.02.12
10:05
Еще вариант:
ВЫБРАТЬ
   НовыеЦены.Номенклатура,
   МАКСИМУМ(НовыеЦены.Цена) КАК Цена,
   МАКСИМУМ(СтарыеЦены.Период) КАК Период
ПОМЕСТИТЬ НовыеЦены
ИЗ
   РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
           &Дата,
           Номенклатура В ИЕРАРХИИ (&Номенклатура)
               И ТипЦен = &ТипЦен) КАК НовыеЦены
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК СтарыеЦены
       ПО НовыеЦены.Номенклатура = СтарыеЦены.Номенклатура
           И (СтарыеЦены.ТипЦен = &ТипЦен)
           И (СтарыеЦены.Период < НовыеЦены.Период)

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   НовыеЦены.Номенклатура,
   НовыеЦены.Цена КАК НоваяЦена,
   ЦеныНоменклатуры.Цена КАК СтараяЦена
ИЗ
   НовыеЦены КАК НовыеЦены
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
       ПО НовыеЦены.Номенклатура = ЦеныНоменклатуры.Номенклатура
           И НовыеЦены.Период = ЦеныНоменклатуры.Период
           И (ЦеныНоменклатуры.ТипЦен = &ТипЦен)
           И НовыеЦены.Цена <> ЦеныНоменклатуры.Цена
26 Кондидат В
 
25.02.12
13:34
Ребят, зацените плиз :)

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
   ПоследниеЦены.Номенклатура,
   ПоследниеЦены.ХарактеристикаНоменклатуры,
   ПоследниеЦены.Цена,
   ПоследниеЦены.Период,
   ЦеныНоменклатуры.Цена КАК СтараяЦена,
   ЦеныНоменклатуры.Период КАК СтарыйПериод
ПОМЕСТИТЬ ВсеЦены
ИЗ
   ПоследниеЦены КАК ПоследниеЦены
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
       ПО ПоследниеЦены.Номенклатура = ЦеныНоменклатуры.Номенклатура
           И ПоследниеЦены.ХарактеристикаНоменклатуры = ЦеныНоменклатуры.ХарактеристикаНоменклатуры
           И ПоследниеЦены.Период > ЦеныНоменклатуры.Период
;

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ПоследниеЦены.Номенклатура,
   ПоследниеЦены.ХарактеристикаНоменклатуры,
   ПоследниеДаты.СтарыйПериод,
   ПоследниеЦены.Цена,
   ВсеЦены.СтараяЦена
ИЗ
   ПоследниеЦены КАК ПоследниеЦены
       ЛЕВОЕ СОЕДИНЕНИЕ ПоследниеДаты КАК ПоследниеДаты
           ЛЕВОЕ СОЕДИНЕНИЕ ВсеЦены КАК ВсеЦены
           ПО ПоследниеДаты.Номенклатура = ВсеЦены.Номенклатура
               И ПоследниеДаты.ХарактеристикаНоменклатуры = ВсеЦены.ХарактеристикаНоменклатуры
               И ПоследниеДаты.СтарыйПериод = ВсеЦены.СтарыйПериод
       ПО ПоследниеЦены.Номенклатура = ПоследниеДаты.Номенклатура
           И ПоследниеЦены.ХарактеристикаНоменклатуры = ПоследниеДаты.ХарактеристикаНоменклатуры
27 azernot
 
25.02.12
14:09
(26) Хреново. Нет необходимости в таком количестве временных таблиц, они нужны там, где ты к одному набору обращаешься несколько раз. Старые цены могут совпадать с текущими. В таблице ВсеЦены нет отбора по типу цен.

Добавь в мой запрос характеристики, в последний пакет добавь ТоварыНаСкладах.Остатки() внутренним соединением и сравни скорость формирования на достаточно большом наборе данных. Ещё можешь для временной таблице индекс по номенклатуре (и характеристике) добавить.
28 Ткачев
 
25.02.12
14:30
(26)Букв много, не люблю когда букв много.
А что (25) не работает, что не так ?
29 Кондидат В
 
25.02.12
14:58
Для (27) и (28)
На больших данных проверить не получается... Нету их просто.

Создал две последние установки цен с одинаковыми ценами

Все три запроса скормил консоли. Так же добавил условия на характеристики для (23) & (25)
Мой вариант вернул одинаковые текущие и предыдущие цены
вариант (25) вернул null в старых ценах. Убрав условие НовыеЦены.Цена <> ЦеныНоменклатуры.Цена получил старые цены равные текущим.
Вариант (23) вернул цены из 3й установки с конца.

Установил в последне цены самыми большими все три запроса вернули одинаковый результат.

Вопрос для azernot. В таблице ДействующиеЦеныСДатойПредыдущейЦены ты получаешь максимальный период и группируешь по цене. Как эта констуркция работает? Будет ли группировка по всем ценам, или будет взята лишь цена соответствующая периоду?
30 Ткачев
 
25.02.12
15:23
Какой смысл делать еще одну установку если цена не менялась, можно в первый временный запрос добавить в левое соединение "И НовыеЦены.Цена <> СтарыеЦены.Цена", тогда он тоже вернет цену отличную от текущей.
31 azernot
 
25.02.12
21:02
(29) Ты уж определись, если предпоследние цены были такими же как текущие, являются ли они предпоследними?
Таблица
НоменклатураА 25.02.2012 1000 01.02.2012
НоменклатураА 25.02.2012 1000 01.01.2012
НоменклатураА 25.02.2012 1000 01.12.2011
НоменклатураА 25.02.2012 1000 01.11.2011
Что вернёт после группировки по первым трём столбцам? Если тебя смущает группировка по цене (по третьему столбцу), поставь там максимум, минимум, среднее.. Разницы нет.
32 del12
 
02.03.12
08:54
какой же запрос правильный?
33 Ткачев
 
03.03.12
15:51
Мне мой нравиться:

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

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

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
   НовыеЦены.Номенклатура,
   НовыеЦены.Цена КАК НоваяЦена,
   СтарыеЦены.Цена КАК СтараяЦена
ИЗ
   НовыеЦены КАК НовыеЦены
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК СтарыеЦены
       ПО НовыеЦены.Номенклатура = СтарыеЦены.Номенклатура
           И НовыеЦены.Период = СтарыеЦены.Период
           И (СтарыеЦены.ТипЦен = &ТипЦен)
           И НовыеЦены.Цена <> СтарыеЦены.Цена
34 vmv
 
03.03.12
15:54
ВыбратьНаПосошок() смотри в СП