Имя: Пароль:
1C
1С v8
Запрос. Временная таблица. Сделать "срез последних без среза последних"
0 ErrorEd88
 
15.01.13
12:23
Из регистра сведений ЦеныНоменклатуры пытаюсь выбрать одну "крайнюю" запись за период (срез последних не применяю не просто так).
Упорядочить запрос по дате с убыванием и выбрать первую запись во временной таблице нельзя.
Как оптимальней решить проблему?
Набросал вот это, но сомневаюсь, что работает как нужно:

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

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

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

ИМЕЮЩИЕ
   ЦеныНоменклатуры.Период = МАКСИМУМ(ВТ.Период)
1 mikecool
 
15.01.13
12:25
"Упорядочить запрос по дате с убыванием и выбрать первую запись во временной таблице нельзя. " а если в подзапросе?
2 х86
 
15.01.13
12:28
делай по аналогии срез последних на дату
3 DrShad
 
15.01.13
12:32
[(срез последних не применяю не просто так). ] а подробней
4 Reset
 
15.01.13
12:36
(0) Запрос не смотрел, но срез последних это просто Поля,максимум(период) из РС
Сгруппировать(список выбираемых полей кроме периода)
где (условия отбора)
5 Reset
 
15.01.13
12:56
Вот вариант по мотивам (0)

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

СГРУППИРОВАТЬ ПО
   ЦеныНоменклатуры.Номенклатура,
   ЦеныНоменклатуры.ТипЦен,
   ЦеныНоменклатуры.Валюта
;
   Выбрать
   СП.Период,
   СП.Номенклатура,
   СП.ТипЦен,
   СП.Валюта КАК Валюта,
   РС.Цена
   из СрезПоследнихИзмерений как СП левое соединение РегистрСведений.ЦеныНоменклатуры КАК РС
   ПО СП.Период=РС.Период И СП.Номенклатура=РС.Номенклатура И СП.ТипЦен=РС.ТипЦен И СП.Валюта=РС.Валюта
6 ErrorEd88
 
15.01.13
17:33
Всем спасибо за ранние ответы.
Мозги кипят, не могу понять в чем ошибка, кому не лень:
   
КОНЕЦПЕРИОДА(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря, МЕСЯЦ) КАК КонецМесяца
ПОМЕСТИТЬ Календарь
ИЗ
   РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоПериода И &КонецПериода
;

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

СГРУППИРОВАТЬ ПО
   УсловияПоставокПоДоговорамКонтрагентовПоНоменклатуре.ВалютаЦены,
   УсловияПоставокПоДоговорамКонтрагентовПоНоменклатуре.ДоговорКонтрагента,
   УсловияПоставокПоДоговорамКонтрагентовПоНоменклатуре.Номенклатура,
   Календарь.КонецМесяца,
   УсловияПоставокПоДоговорамКонтрагентовПоНоменклатуре.Цена
;

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

СГРУППИРОВАТЬ ПО
   Календарь.КонецМесяца,
   ЦеныНоменклатуры.Валюта,
   ЦеныНоменклатуры.Номенклатура,
   ЦеныНоменклатуры.Цена,
   ЦеныНоменклатуры.ТипЦен
;

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

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