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 Сейчас в теме
чисто по логике запроса (не задачи)

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

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

третий пакет прост и придраться не к чему
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) на обе ноги, причем может упасть
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

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


Программисты 1С УТ / БУЗ/ЗУП / БИТ ФИНАНС
Москва
зарплата от 100 000 руб. до 180 000 руб.
Полный день

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

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству