Получить последнюю цену из двух типов цен

1. Shaldryn 10.09.19 11:23 Сейчас в теме
Добрый день, подскажите, чет туплю, не могу составить запрос. Такая задача, у товара есть два типа цен "Анонс" и "Опт", выводить последнюю цену на момент формирования отчета. То есть товар еще не пришел, у него стоит "Анонс", выводим "Анонс", после этого товар пришел, поставили "Опт", и когда формируем отчет должна выводится цена "Опт". Бывает что у товара была цена "Опт", после его перевыпускают с ценой "Анонс". Сделал такой запрос:
ВЫБРАТЬ
	ЦеныНоменклатурыСрезПоследних.Номенклатура,
	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
	ЦеныНоменклатурыСрезПоследних.Период,
	ЦеныНоменклатурыСрезПоследних.Регистратор
ПОМЕСТИТЬ ВТ_Цены
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
			,
			ТипЦен = &ТипЦенОпт
				И Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ЦеныНоменклатурыСрезПоследних

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

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

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

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

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


Вроде выводит норм, но мне кажется как то коряво. То есть в первом получаю последние цены по двум типам, во втором получаю последние документы, ну и в третьем вывожу цены, правильная ли логика или я чет запутался...
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. theifx 10.09.19 11:28 Сейчас в теме
ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
    ЦеныНоменклатурыСрезПоследних.Период,
    ЦеныНоменклатурыСрезПоследних.Регистратор
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних() КАК ЦеныНоменклатурыСрезПоследних
ГДЕ ЦеныНоменклатурыСрезПоследних.ТипЦен.Наименование = "Анонс" или ЦеныНоменклатурыСрезПоследних.ТипЦен.Наименование = "Опт"
4. VmvLer 10.09.19 11:33 Сейчас в теме
(2) так не пойдет, я написал почему
3. VmvLer 10.09.19 11:32 Сейчас в теме
чисто по логике запроса (не задачи)

первый пакет нормальный, можно вместо объединения создать условие
ТипЦен В (&мТипыЦен)
но в этом случае индексы перестанут работать и учитывая, что регистры цен огромны,
то объединение выглядит вполне логично.

второй пакет странный, что значит МАКСИМУМ(ЦеныНоменклатурыСрезПоследних.Регистратор)
вы так получаете последний учетный документ? если да, то решение хромает

третий пакет прост и придраться не к чему
Fox-trot; +1 Ответить
5. Shaldryn 10.09.19 11:42 Сейчас в теме
(3) а как мне тогда получить последний документ, чтобы после вытянуть последнюю цену из двух типов?
6. VmvLer 10.09.19 11:50 Сейчас в теме
(5) получите точный ответ на вопрос
"по какому критерию мы определяем, что документ последний" и тогда согласно этому критерию получайте.

часто(почти всегда) успешное решение задачи зависит от того, какие вопросы мы задаем сами себе.
7. Shaldryn 10.09.19 12:10 Сейчас в теме
(6) ну вообще изначально я определял по критерию период, потом просто где то в просторах инета увидел по регистратору, но там для того чтобы исключить ситуаций, когда дата одинаковая. Переделал второй пакет, максимум по периоду, теперь решение не храмает?
ВЫБРАТЬ
	ЦеныНоменклатурыСрезПоследних.Номенклатура,
	МАКСИМУМ(ВТ_Цены.Период) КАК Период
ПОМЕСТИТЬ ВТ_МаксДок
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ) КАК ЦеныНоменклатурыСрезПоследних
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Цены КАК ВТ_Цены
		ПО ЦеныНоменклатурыСрезПоследних.Период = ВТ_Цены.Период
			И ЦеныНоменклатурыСрезПоследних.Номенклатура = ВТ_Цены.Номенклатура

СГРУППИРОВАТЬ ПО
	ЦеныНоменклатурыСрезПоследних.Номенклатура
;
Показать
8. VmvLer 10.09.19 13:09 Сейчас в теме
(7) на обе ноги, причем может упасть
9. IChe 17.09.20 18:40 Сейчас в теме
ВЫБРАТЬ
	ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура КАК НоменклатураПоставщика,
	МАКСИМУМ(ЦеныНоменклатурыПоставщиковСрезПоследних.Период) КАК Период
ПОМЕСТИТЬ ВТ
ИЗ
	РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних(&ТекущаяДата, ) КАК ЦеныНоменклатурыПоставщиковСрезПоследних

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ.НоменклатураПоставщика КАК НоменклатураПоставщика,
	ЦеныНоменклатурыПоставщиков.Цена КАК Цена
ИЗ
	ВТ КАК ВТ
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыПоставщиков КАК ЦеныНоменклатурыПоставщиков
		ПО ВТ.НоменклатураПоставщика = ЦеныНоменклатурыПоставщиков.Номенклатура
			И ВТ.Период = ЦеныНоменклатурыПоставщиков.Период
Показать
Оставьте свое сообщение
Вакансии
1С-Программист (интегратор Битрикс24)
Санкт-Петербург
зарплата от 150 000 руб. до 250 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 100 000 руб.
Временный (на проект)

Разработчик 1С
Москва
зарплата от 150 000 руб.
Полный день

Программист
Санкт-Петербург
зарплата от 180 000 руб. до 240 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 150 000 руб. до 250 000 руб.
Полный день