Выборка из РегистраСведений

1. Tym1980 23.02.23 19:00 Сейчас в теме
Есть регистр сведений "ЦеныНоменклатуы" в котором: измерения (Номенклатура, Валюта), и Ресурс (Цена).
Кроме етого есть еще измерение ТипЦен, но єто сейчас не имеет значение.

У номенклатуры установлены цены в разных валютах.

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


По такому запросу я получаю все цены в всех валютах, а не последнюю цену.
Пробывал поставить Период в групировку полей что сумируються по "Максимум", но все равно получаю все цены.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. mkalimulin 1445 24.02.23 09:12 Сейчас в теме
(1) Нужна последняя цена в любой валюте?
12. mkalimulin 1445 24.02.23 12:33 Сейчас в теме
(1) Если нужно получить срез последних только по номенклатуре, тогда

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

Показать
19. пользователь 24.02.23 14:11
Сообщение было скрыто модератором.
...
20. mkalimulin 1445 24.02.23 14:21 Сейчас в теме
(19) Это работающий запрос. Не верите - спросите у более опытных товарищей. А еще лучше, проверьте на своих данных.
Этот запрос можно использовать как шаблон для получения среза последних в любых таблицах. У него есть аналог с использованием JOIN, но эта запись более компактна и наглядна
22. пользователь 24.02.23 14:27
Сообщение было скрыто модератором.
...
23. mkalimulin 1445 24.02.23 14:45 Сейчас в теме
(22) Выдаёт правильные данные. В списке полей, вы правы, надо поставить т1 вместо ценыноменклатурысрезпоследних
24. spacecraft 24.02.23 16:16 Сейчас в теме
(23) что будет, если в найденный Период были установлены цены на номенклатуру по всем валютам?
user1881120; +1 Ответить
26. пользователь 24.02.23 16:33
Сообщение было скрыто модератором.
...
28. RustamZz 24.02.23 17:11 Сейчас в теме
(24) Это же ChatGPT вместо Калимулина отвечает. А она даже не представляет, что у нас на один товар могут быть разные цены, в разных валютах да еще и в один день установлены. Вот нейросеть и наколбасила.
29. spacecraft 24.02.23 17:13 Сейчас в теме
(28) да я вот не уверен. Нейросеть хотя бы обучается. А "ошибки" все те же.
25. пользователь 24.02.23 16:33
Сообщение было скрыто модератором.
...
31. mkalimulin 1445 24.02.23 17:22 Сейчас в теме
(25) А что здесь нерабочего? Это все последние цены. Запрос отрабатывает правильно. А вот штатный срез последних действительно глючит. В дополнение к этим правильным записям он может добавить неправильные. Например, если у вас есть такой тип цен, который уже лет 10 как неактуален. В этом случае вы получите записи 10 летней давности.
33. пользователь 24.02.23 17:37
Сообщение было скрыто модератором.
...
36. mkalimulin 1445 24.02.23 19:32 Сейчас в теме
(33) Не стоит a priori считать других идиотами. Автор понимает, что если у него на одну дату придется две установки цен с разными валютами, то он получит две записи. Он недоумевает совсем по другому поводу. Почему он получает несколько записей там, где он ожидает увидеть одну. Его ожидания разумны и согласуются с тем, что он возможно прочел в синтакс-помощнике
37. пользователь 24.02.23 19:49
Сообщение было скрыто модератором.
...
38. mkalimulin 1445 24.02.23 20:17 Сейчас в теме
(37) Просто не считаю людей идиотами. И умею читать, в отличие от вас
35. пользователь 24.02.23 18:09
Сообщение было скрыто модератором.
...
32. mkalimulin 1445 24.02.23 17:35 Сейчас в теме
(25) Штатный срез последних не использует внеземную магию. Он использует аналог моего запроса. Только не нормальный аналог, а глючный. Там, где я пишу:
ГДЕ Т1.Номенклатура=Т2.Номенклатура

и останавливаюсь, потому что мне нужны последние записи только по одному измерению, штатный срез будет тупо перечислять все измерения и выводить паразитические записи.
Ваше опровержение было бы состоятельно, если бы штатный срез работал лучше, но он работает хуже. И вызывает постоянные вопросы типа того, что задан в начале ветки. По причине своей глючности и по причине того, что из синтакс-помощника люди делают вывод, что срез работает нормально, т.е. так, как показал я.
34. RustamZz 24.02.23 17:43 Сейчас в теме
(32) СрезПоследних иногда и физическая таблица
30. RustamZz 24.02.23 17:19 Сейчас в теме
(19) Это что-то вроде Exist на классическом SQL. Причем часто подобный код в exist и превращается при трансляция.
39. mkalimulin 1445 24.02.23 20:20 Сейчас в теме
(12) Правильный запрос

ВЫБРАТЬ
    Т1.Период КАК Период,
    Т1.Номенклатура КАК Номенклатура,
    Т1.Валюта КАК Валюта,
    Т1.Цена КАК Цена
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК Т1
ГДЕ Т1.Период В (
ВЫБРАТЬ МАКСИМУМ(период) ИЗ РегистрСведений.ЦеныНоменклатуры КАК Т2 ГДЕ 
Т1.Номенклатура=Т2.Номенклатура
) 
Показать
2. пользователь 23.02.23 20:31
Сообщение было скрыто модератором.
...
3. mkalimulin 1445 24.02.23 09:11 Сейчас в теме
(2) Исключены в параметрах виртуальной таблицы - это как?
5. пользователь 24.02.23 11:02
Сообщение было скрыто модератором.
...
6. mkalimulin 1445 24.02.23 11:06 Сейчас в теме
(5) Так это ЗНАЧЕНИЯ измерений, а не измерения
7. пользователь 24.02.23 11:09
Сообщение было скрыто модератором.
...
8. mkalimulin 1445 24.02.23 11:50 Сейчас в теме
(7) Вопрос в теме: как убрать измерения из среза последних
9. пользователь 24.02.23 12:17
Сообщение было скрыто модератором.
...
10. mkalimulin 1445 24.02.23 12:27 Сейчас в теме
11. пользователь 24.02.23 12:30
Сообщение было скрыто модератором.
...
13. mkalimulin 1445 24.02.23 12:36 Сейчас в теме
(11) Было бы лучше ответить на вопрос. Автор ведь ждет ответа, а не поучений. Тем более, что вы тоже не очень хорошо разбираетесь в механизме работы "срезов РС"
14. пользователь 24.02.23 12:38
Сообщение было скрыто модератором.
...
15. mkalimulin 1445 24.02.23 12:41 Сейчас в теме
(14) Так, как вы объяснили не натолкнет Почему срез последних возможен только по полному набору измерений?
16. пользователь 24.02.23 13:14
Сообщение было скрыто модератором.
...
17. mkalimulin 1445 24.02.23 13:27 Сейчас в теме
(16) Почему нельзя выдать срез не по ключу, а по одному измерению (или по произвольному подмножеству измерений)?
18. пользователь 24.02.23 14:05
Сообщение было скрыто модератором.
...
21. mkalimulin 1445 24.02.23 14:22 Сейчас в теме
(18) Как получить срез последних по одному измерению "Номенклатура" с помощью "неких условий"?
27. пользователь 24.02.23 16:38
Сообщение было скрыто модератором.
...
40. Tym1980 24.02.23 23:22 Сейчас в теме
(18)
у мене большой список номенклатур, и мне нужно ввывестисписок все номенклатур с последней ценой и валютой.
Если мне нужно будет вывести цену по конкретной номенклатуре, так это я уже в отборе укажу, а не в параметрах
41. Tym1980 24.02.23 23:26 Сейчас в теме
Пока что сделал очень криво, но работает. Хочется оптимизировать код, чтобы не выглядить идиотом.

Пока что в ресурсах отчетка СКД, "цену" указал брать из глобального модуля, где по каждой номенклатуре делаю повторно выборку, и возвращаю только последнюю запись (вернее первую запись, при сортировке периода по убыванию)
42. azmon 1 25.02.23 01:15 Сейчас в теме
ВЫБРАТЬ
	МАКСИМУМ(ЦеныНоменклатурыСрезПоследних.Период) КАК Период,
	ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ.Период КАК Период,
	ВТ.Номенклатура КАК Номенклатура,
	ЦеныНоменклатуры.Валюта КАК Валюта,
	ЦеныНоменклатуры.Цена КАК Цена
ИЗ
	ВТ КАК ВТ
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
		ПО ВТ.Период = ЦеныНоменклатуры.Период
			И ВТ.Номенклатура = ЦеныНоменклатуры.Номенклатура
Показать
43. Dr.HiHi 2 27.02.23 00:22 Сейчас в теме
(42) еще бы валюту учесть ;))
а то вдруг будет запись с 2-мя валютами в один период по одной и той же номенклаутре

p.s. я бы все записи выбрал бы в виртуальную таблицу и потом бы уже с ней работал

можно написать что-то типа такого

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

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

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

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ЦеныНоменклатуры.Период КАК Период,
	ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
	ЦеныНоменклатуры.Валюта КАК Валюта,
	ЦеныНоменклатуры.Цена КАК Цена
ИЗ
	ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
	ИСТИНА В
			(ВЫБРАТЬ ПЕРВЫЕ 1
				ИСТИНА
			ИЗ
				ЦеныНоменклатурыПериодВалюта
			ГДЕ
				ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатурыПериодВалюта.Номенклатура
				И ЦеныНоменклатуры.Валюта = ЦеныНоменклатурыПериодВалюта.Валюта
				И ЦеныНоменклатуры.Период = ЦеныНоменклатурыПериодВалюта.Период)
Показать


вариант #2 (нужно посмотреть что будет в номере записи... возможно нужно будет засунуть в виртуальную таблицу без автономера записи, а в следующей виртуальной таблице пронумеровать)
ВЫБРАТЬ ПЕРВЫЕ 999999
	АВТОНОМЕРЗАПИСИ() КАК НомерЗаписи,
	ЦеныНоменклатурыСрезПоследних.Период КАК Период,
	ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
	ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
ПОМЕСТИТЬ ЦеныНоменклатуры
ИЗ
	РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних

УПОРЯДОЧИТЬ ПО
	Период,
	Валюта
;

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

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