Цены.СрезПоследних

1. Stella_Vermilion 13.11.23 09:45 Сейчас в теме
Всем привет, делаю запрос, нужно для каждой позиции номенклатуры из документа Заказ Покупателя вывести Код,Ссылку на номенклатуру(Номенклаура),Количество, Цена закупа, цена продажи и упущенную прибыль(Количество * (ЦенаЗакупа - ЦенаПродажи)) с условием, что Упущенная прибыль >0. Проблема заключается в том, что при обращении к регистру Цены.СрезПоследних он выводит порядка 20 записей для каждой номенклатуры. Подскажите, пожалуйста, как сделать так, чтобы выводилась только 1 запись.
вот мой Запрос

ВЫБРАТЬ
	ЗаказПокупателя.Дата КАК ДатаСреза,
	ЗаказПокупателяТовары.Номенклатура.Код КАК Код,
	ЗаказПокупателяТовары.Номенклатура КАК Номенклатура,
	ЗаказПокупателяТовары.Количество КАК Количество,
	ЦеныСрезПоследних.Цена КАК ЦенаЗакупа,
	ЦеныСрезПоследних.Период КАК Период,
	ЗаказПокупателяТовары.Цена КАК ЦенаПродажи,
	ЗаказПокупателяТовары.Количество * (ЦеныСрезПоследних.Цена - ЗаказПокупателяТовары.Цена) КАК УпощеннаяВыгода,
	ЦеныСрезПоследних.ТипЦен КАК ТипЦен,
	ЦеныСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
ИЗ
	Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&КонецПериода, ) КАК ЦеныСрезПоследних
		ПО ЗаказПокупателяТовары.Номенклатура = ЦеныСрезПоследних.Номенклатура
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателя
		ПО ЗаказПокупателяТовары.Ссылка = ЗаказПокупателя.Ссылка
ГДЕ 
   НЕ  ЗаказПокупателяТовары.Цена = 0
	И ЗаказПокупателяТовары.Ссылка.Дата <= &КонецПериода
	И ЗаказПокупателяТовары.Ссылка.Дата <= &НачалоПериода
	И ЗаказПокупателяТовары.Количество * (ЦеныСрезПоследних.Цена - ЗаказПокупателяТовары.Цена) > 0
Показать
По теме из базы знаний
Найденные решения
6. Sashares 35 13.11.23 11:05 Сейчас в теме
(5)
Но есть проблема, в один и тот же момент времени по некоторым номенклатурам есть 2 записи.


Добавьте группировку в этот запрос.
Для цены - минимум или максимум, а по остальным группировку.:
ВЫБРАТЬ
ВТ_Цены.Номенклатура КАК Номенклатура,
ВТ_Цены.Цена КАК Цена,
ВТ_Цены.ТипЦен КАК ТипЦен,
ВТ_Цены.Период КАК Период
ПОМЕСТИТЬ ВТ_ПоследниеЦены
ИЗ
ВТ_Цены КАК ВТ_Цены
ПРАВОЕ СОЕДИНЕНИЕ ВТ_ДатыПоследнихЦен КАК ВТ_ДатыПоследнихЦен
ПО ВТ_Цены.Номенклатура = ВТ_ДатыПоследнихЦен.Номенклатура
И ВТ_Цены.Период = ВТ_ДатыПоследнихЦен.Период
ГДЕ
ВТ_Цены.ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦен.ОсновнойТипЦенЗакупки) 
Показать
Stella_Vermilion; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 76 13.11.23 10:11 Сейчас в теме
(1)Включить отбор по виду цены, например.
.....
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&КонецПериода, ВидЦены = &ВидЦены) КАК ЦеныСрезПоследних
....
3. Stella_Vermilion 13.11.23 10:13 Сейчас в теме
Пробовал, там много измерений по типу контрагента, подразделения и тд. Мне на это всё равно, мне нужно, чтобы из регистра просто выводилась последняя запись.
(2)
4. nomad_irk 76 13.11.23 10:49 Сейчас в теме
(3)В таком случае вам не подойдет типовой СрезПоследних, нужно выполнять срез "вручную"

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


И уже полученную ВТ соединять с данными заказа покупателя
5. Stella_Vermilion 13.11.23 10:53 Сейчас в теме
Я тут сидел и придумал такую схему.

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

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

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЗаказПокупателяТовары.Ссылка КАК Ссылка,
	ЗаказПокупателяТовары.Номенклатура.Код КАК НоменклатураКод,
	ЗаказПокупателяТовары.Номенклатура КАК Номенклатура,
	ЗаказПокупателяТовары.Количество КАК Количество,
	ВТ_ПоследниеЦены.Цена КАК ЦенаЗакупочная,
	ЗаказПокупателяТовары.Цена КАК ЦенаПродажи,
	ЗаказПокупателяТовары.Количество * (ВТ_ПоследниеЦены.Цена - ЗаказПокупателяТовары.Цена) КАК УпущеннаяВыгода
ИЗ
	Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПоследниеЦены КАК ВТ_ПоследниеЦены
		ПО ЗаказПокупателяТовары.Номенклатура = ВТ_ПоследниеЦены.Номенклатура
ГДЕ
	ЗаказПокупателяТовары.Ссылка.Дата <= &КонецПериода
	И ЗаказПокупателяТовары.Ссылка.Дата >= &НачалоПериода
	И НЕ ЗаказПокупателяТовары.Цена = 0
	И ЗаказПокупателяТовары.Количество * (ВТ_ПоследниеЦены.Цена - ЗаказПокупателяТовары.Цена) > 0
Показать




Но есть проблема, в один и тот же момент времени по некоторым номенклатурам есть 2 записи. И получается так, что в итоговом запросе строки дублируются
6. Sashares 35 13.11.23 11:05 Сейчас в теме
(5)
Но есть проблема, в один и тот же момент времени по некоторым номенклатурам есть 2 записи.


Добавьте группировку в этот запрос.
Для цены - минимум или максимум, а по остальным группировку.:
ВЫБРАТЬ
ВТ_Цены.Номенклатура КАК Номенклатура,
ВТ_Цены.Цена КАК Цена,
ВТ_Цены.ТипЦен КАК ТипЦен,
ВТ_Цены.Период КАК Период
ПОМЕСТИТЬ ВТ_ПоследниеЦены
ИЗ
ВТ_Цены КАК ВТ_Цены
ПРАВОЕ СОЕДИНЕНИЕ ВТ_ДатыПоследнихЦен КАК ВТ_ДатыПоследнихЦен
ПО ВТ_Цены.Номенклатура = ВТ_ДатыПоследнихЦен.Номенклатура
И ВТ_Цены.Период = ВТ_ДатыПоследнихЦен.Период
ГДЕ
ВТ_Цены.ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦен.ОсновнойТипЦенЗакупки) 
Показать
Stella_Vermilion; +1 Ответить
11. Stella_Vermilion 13.11.23 12:53 Сейчас в теме
(6) Спасибо большое, заработало как надо
7. starik-2005 3089 13.11.23 11:20 Сейчас в теме
(5)
в один и тот же момент времени по некоторым номенклатурам есть 2 записи
Ну в регистре сведений, который периодический, записи уникальны по ключам в пределах указанного периода. Т.е. нет на один период двух записей, равных по ключам (измерениям). Хотите уникальности - используйте все измерения в соединении + фильтре.
8. Sashares 35 13.11.23 11:26 Сейчас в теме
(7)
Т.е. нет на один период двух записей, равных по ключам (измерениям)

Если периодичность по позиции регистратора, то могут быть записи, у которых измерения и период одинаковые.
9. starik-2005 3089 13.11.23 12:24 Сейчас в теме
(8)
Если периодичность по позиции регистратора, то могут быть записи, у которых измерения и период одинаковые.
Просто период в данном случае - это момент времени. Он в любом случае уникален.
10. Sashares 35 13.11.23 12:51 Сейчас в теме
(9)Да, уникален будет Период + Регистратор.
12. Said-We 13.11.23 13:00 Сейчас в теме
(1) Решение задачи на SQL выглядит примерно так:
Прикрепленные файлы:
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот