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

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 210 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 210 19.06.19 12:10 Сейчас в теме
(14)Что то про вложенный запрос я не подумал. В таком случае можно ограничить запрос с помощью Имеющие(блин ни как не могу запомнить синтаксис всегда пишу HAVING)
17. vladis222 19.06.19 12:33 Сейчас в теме
на выбранную дату вывести список всех номенклатур (оприходованных товаров) с последней и предпоследней ценой для каждой и изменением в процентах - то есть здесь,я так понял запрос вычисляющий как раз предпоследнюю и последнюю даты можно оставить как есть, там в конструкторе запросов по умолчанию высвечивается период, его получается,просто включить в пользовательских настройках и дальше она на дату будет смотреть последние изменения цены,ведь так?
8. tusv 210 19.06.19 11:01 Сейчас в теме
(4)
после появления АВТОНОМЕРЗАПИСИ() такие задачи решаются проще

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

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

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

УПОРЯДОЧИТЬ ПО
	ВременнаяТаблица.Ссылка.Наименование
Показать
9. mrx2012 19.06.19 11:10 Сейчас в теме
(8)Не работает у меня такая конструкция..
Через годик поставим платформу 13) попробую))
12. tusv 210 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 210 19.06.19 11:56 Сейчас в теме
(10)Интересно было бы посмотреть, как с помощью АВТОНОМЕРЗАПИСИ() Без соединений получить Последние и предпоследние цены
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

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

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

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

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)