Выбор последней,предпоследней цены товара по заданной дате

1. vladis222 19.06.19 10:06 Сейчас в теме
Здравствуйте,сдал тестовое задание руководителю, но руководитель хотел бы на любую выбранную дату,которую ему захочется, вывести отчет по всем различным номенклатурам в регистре (последняя,предпоследняя цены и изменение цены в процентах), реализовать одним запросом,можно использовать подзапросы и конструкцию поместить, если есть параметр дата, то запрос пишется сложнее или легче?
По теме из базы знаний
Найденные решения
4. VmvLer 19.06.19 10:36 Сейчас в теме
после появления АВТОНОМЕРЗАПИСИ() такие задачи решаются проще, ведь когда критерием "последнего" является не одно поле "Дата", а сложная сортировка по ряду полей, то соединения
становятся сложными и неповоротливыми.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alex-l19041 8 19.06.19 10:14 Сейчас в теме
(1)
...есть параметр дата, то запрос пишется...
- не сложнее и не легче....
11. Vitaly1C8 19.06.19 11:47 Сейчас в теме
3. tusv 211 19.06.19 10:21 Сейчас в теме
Что то тема популярная с предыдущими ценами.
Отвечал уже многократно
Вот примерчег
К тому шаблону, Во временную таблицу добавить Максимум по текущему периоду
В результирующем запросе 2 соединения, по Текущему и Прошлому
4. VmvLer 19.06.19 10:36 Сейчас в теме
после появления АВТОНОМЕРЗАПИСИ() такие задачи решаются проще, ведь когда критерием "последнего" является не одно поле "Дата", а сложная сортировка по ряду полей, то соединения
становятся сложными и неповоротливыми.
5. vladis222 19.06.19 10:44 Сейчас в теме
(4) А где можно найти Автономер записи?
6. mrx2012 19.06.19 10:47 Сейчас в теме
(4)Поделитесь информацией?
7. alex-l19041 8 19.06.19 11:01 Сейчас в теме
14. VmvLer 19.06.19 11:59 Сейчас в теме
(6) (8)
Задача: "Получить 5 последних продаж по всем партнерам" в ИБ с тысячами документов в день.
Алгоритмы обхода и пакеты с кучей соединений приводили к неприемлемому времени
получения результата, но АВТОНОМЕРЗАПИСИ() как раз помог. Ниже инструкция как использовать АВТОНОМЕРЗАПИСИ() и критерий "последних" при сложной сортировке.

Идею получения последних 5 документов по каждому Партнеру реализуем на новой
функции запросов АВТОНОМЕРЗАПИСИ().
сначала идет описание логики решения, в внизу готовый запрос для консоли или СКД.

Даны такие ограничения системы и постановки задачи:

1. АВТОНОМЕРЗАПИСИ() работает только для временных таблиц;
2. Временные таблицы нельзя сортировать;
3. Нумеровать необходимо уже отсортированные документы;
4. Во вложенных запросах нельзя применять операцию УПОРЯДОЧИТЬ ПО без использования конструкции ПЕРВЫЕ.

Согласно условиям выше, чтобы пролучить пронумерованную по порядку таблицу документов используем
вложенный запрос для сортировки и АВТОНОМЕРЗАПИСИ() во внешнем запросе.
Причем, во вложенном ставим очень большое число, которое заведомо больше количества документов в БД.


1.
ВАЖНО1: Если установить значение парметра запроса "ДатаНачала", то будут выбираться документы
только после этой даты, а что было в прошлом нам не интересно.
ВАЖНО2: Во вложенном запросе необходимо сортировать только в таком порядке "Партнер, Дата"
Тогда в первой временной таблице "ВтДокументыПоПорядкуВсе" получим примерно такой состав данных:

Партнер | Документ | Порядок
..................................................
Партнер1 | Док.. | 1
Партнер1 | Док.. | 2
Партнер1 | Док.. | 3
Партнер1 | Док.. | 4
Партнер1 | Док.. | 5
Партнер1 | Док.. | 6
Партнер1 | Док.. | 7
Партнер1 | Док.. | 8 <- ДокументПорядокМакс по Партнер1
.............................................................................
ПартнерN | Док.. | 120 001
ПартнерN | Док.. | 120 002
ПартнерN | Док.. | 120 003
ПартнерN | Док.. | 120 004
ПартнерN | Док.. | 120 005
ПартнерN | Док.. | 120 006
ПартнерN | Док.. | 120 007
ПартнерN | Док.. | 120 008 <- ДокументПорядокМакс по ПартнерN

2.
Далее получаем "ВтПорядокМаксПоПартнеру"

Партнер | ПорядокМакс
.........................................
Партнер1 | 8
.........................................
ПартнерN | 120 008

3.
Далее получаем "ВтДокументыПоПартнеруПоследние"
Если пареметр запроса "КоличествоПоследних" = 5, то будут выбраны
только последние 5 документов по каждому партнеру и получим такую вт:

Партнер | Документ | Порядок
...................................................
Партнер1 | Док.. | 4
Партнер1 | Док.. | 5
Партнер1 | Док.. | 6
Партнер1 | Док.. | 7
Партнер1 | Док.. | 8
....................................................
ПартнерN | Док.. | 120 004
ПартнерN | Док.. | 120 005
ПартнерN | Док.. | 120 006
ПартнерN | Док.. | 120 007
ПартнерN | Док.. | 120 008
.....................................................

Собственно на этом все и "ВтДокументыПоПартнеруПоследние"
можно использовать в результирующем запросе.
Если это запрос в коде, то результирующий запрос группируем или Итоги по для наглядности.
Если это запрос в СКД, то результирующий запрос НЕ группируем - СКД все сделает сама по настройкам.

Готовый запрос для консоли
(секция в последнем пакете ВЫБРАТЬ ПЕРВЫЕ 100 только для того чтобы быстро понять, что все работает):

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

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

СГРУППИРОВАТЬ ПО
	ВтДокументыПоПорядкуВсе.Партнер
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВтДокументыПоПорядкуВсе.Партнер КАК Партнер,
	ВтДокументыПоПорядкуВсе.Документ КАК Документ
ПОМЕСТИТЬ ВтДокументыПоПартнеруПоследние
ИЗ
	ВтДокументыПоПорядкуВсе КАК ВтДокументыПоПорядкуВсе
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтПорядокМаксПоПартнеру КАК ВтПорядокМаксПоПартнеру
		ПО ВтДокументыПоПорядкуВсе.Партнер = ВтПорядокМаксПоПартнеру.Партнер
ГДЕ
	ВтДокументыПоПорядкуВсе.Порядок > ВтПорядокМаксПоПартнеру.ПорядокМакс - &КоличествоПоследних
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 100
	ВтДокументыПоПартнеруПоследние.Партнер КАК Партнер,
	ВтДокументыПоПартнеруПоследние.Документ КАК Документ,
	РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента
ИЗ
	ВтДокументыПоПартнеруПоследние КАК ВтДокументыПоПартнеруПоследние
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
		ПО ВтДокументыПоПартнеруПоследние.Документ = РеализацияТоваровУслуг.Ссылка
ИТОГИ
	СУММА(СуммаДокумента)
ПО
	Партнер
Показать
tusv; mrx2012; +2 Ответить
16. tusv 211 19.06.19 12:10 Сейчас в теме
(14)Что то про вложенный запрос я не подумал. В таком случае можно ограничить запрос с помощью Имеющие(блин ни как не могу запомнить синтаксис всегда пишу HAVING)
17. vladis222 19.06.19 12:33 Сейчас в теме
на выбранную дату вывести список всех номенклатур (оприходованных товаров) с последней и предпоследней ценой для каждой и изменением в процентах - то есть здесь,я так понял запрос вычисляющий как раз предпоследнюю и последнюю даты можно оставить как есть, там в конструкторе запросов по умолчанию высвечивается период, его получается,просто включить в пользовательских настройках и дальше она на дату будет смотреть последние изменения цены,ведь так?
8. tusv 211 19.06.19 11:01 Сейчас в теме
(4)
после появления АВТОНОМЕРЗАПИСИ() такие задачи решаются проще

Увы работает только во временной таблице, а там сортировки нет, Агрегатные функции использовать нельзя
Такой запрос выдаст бред
ВЫБРАТЬ
	Номенклатура.Ссылка КАК Ссылка,
	АВТОНОМЕРЗАПИСИ() КАК НомерСтроки
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
	Справочник.Номенклатура КАК Номенклатура

ИНДЕКСИРОВАТЬ ПО
	НомерСтроки,
	Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВременнаяТаблица.НомерСтроки КАК НомерСтроки,
	ВременнаяТаблица.Ссылка КАК Ссылка
ИЗ
	ВременнаяТаблица КАК ВременнаяТаблица

УПОРЯДОЧИТЬ ПО
	ВременнаяТаблица.Ссылка.Наименование
Показать
9. mrx2012 19.06.19 11:10 Сейчас в теме
(8)Не работает у меня такая конструкция..
Через годик поставим платформу 13) попробую))
12. tusv 211 19.06.19 11:54 Сейчас в теме
(9)Смотри ссылку в (3) Там все написано. Только подправить шаблон
15. mrx2012 19.06.19 11:59 Сейчас в теме
(12)Да не, я про автономерзаписи . у меня не работает т.к. платформа 12-я
10. VmvLer 19.06.19 11:46 Сейчас в теме
(8) а если подумать, то все работает
13. tusv 211 19.06.19 11:56 Сейчас в теме
(10)Интересно было бы посмотреть, как с помощью АВТОНОМЕРЗАПИСИ() Без соединений получить Последние и предпоследние цены
Оставьте свое сообщение

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