Пример запроса: Срез последних на каждый день в периоде.

Данная заметка больше как запись для себя, но вдруг кому то так же окажется полезной.

В сети нашел очень много примеров реализации данной выборки, но того что я искал не нашлось, да и работоспособность того что было найдено я не проверял. Все выборки в примерах были привязаны к каким то документам, а мне нужно было просто получать срез на каждый день в периоде.

ВЫБРАТЬ
	ЦИФРЫ.ПОЛЕ1 КАК ЦИФРА
ПОМЕСТИТЬ ЦИФРЫ
ИЗ
	(ВЫБРАТЬ
		1 КАК ПОЛЕ1
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		2
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		3
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		4
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		5
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		6
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		7) КАК ЦИФРЫ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	(ЦИФРЫ3.ЦИФРА - 1) * 343 + (ЦИФРЫ2.ЦИФРА - 1) * 49 + (ЦИФРЫ.ЦИФРА - 1) * 7 + ЦИФРЫ1.ЦИФРА КАК ЧИСЛО
ПОМЕСТИТЬ ЧИСЛА
ИЗ
	ЦИФРЫ КАК ЦИФРЫ,
	ЦИФРЫ КАК ЦИФРЫ1,
	ЦИФРЫ КАК ЦИФРЫ2,
	ЦИФРЫ КАК ЦИФРЫ3
;

////////////////////////////////////////////////////////////////////////////////
//  Тут получаем все даты из промежутка (данная часть запроса содрана из сети)
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(&ДАТАНАЧАЛА, ДЕНЬ, ЧИСЛА.ЧИСЛО - 1) КАК ДАТА
ПОМЕСТИТЬ ДАТЫ
ИЗ
	ЧИСЛА КАК ЧИСЛА
ГДЕ
	ДОБАВИТЬКДАТЕ(&ДАТАНАЧАЛА, ДЕНЬ, ЧИСЛА.ЧИСЛО - 1) <= &ДАТАОКОНЧАНИЯ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	КОНЕЦПЕРИОДА(ДАТЫ.ДАТА, ДЕНЬ) КАК ДАТА,
	ВЫБОР ДЕНЬНЕДЕЛИ(ДАТЫ.ДАТА)
		КОГДА 6
			ТОГДА 0
		КОГДА 7
			ТОГДА 0
		ИНАЧЕ 1
	КОНЕЦ КАК РАБОЧИЙДЕНЬ
ПОМЕСТИТЬ ВТ_Даты
ИЗ
	ДАТЫ КАК ДАТЫ
;

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

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

////////////////////////////////////////////////////////////////////////////////
//  Для получения таблицы каждый товар на каждую дату - сделаем произведение
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
	ВТ_Даты.ДАТА КАК ДАТА,
	ВТ_Товары.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ_ТоварыИДаты
ИЗ
	ВТ_Товары КАК ВТ_Товары,
	ВТ_Даты КАК ВТ_Даты

ИНДЕКСИРОВАТЬ ПО
	Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
// Вычислим на какие даты устанавливались цены по товарам
////////////////////////////////////////////////////////////////////////////////

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

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

////////////////////////////////////////////////////////////////////////////////
// Соединим ВТ_ТоварыИДаты и ВТ_ДатыНачалаДействия 
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
	ВТ_ТоварыИДаты.ДАТА КАК ДатаДни,
	ВТ_ТоварыИДаты.Номенклатура КАК Номенклатура,
	ВТ_ДатыНачалаДействия.Цена КАК Цена,
	ВТ_ДатыНачалаДействия.Дата КАК ДатаДействия
ПОМЕСТИТЬ ВТ_СоедиениеПромежуточных
ИЗ
	ВТ_ТоварыИДаты КАК ВТ_ТоварыИДаты
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДатыНачалаДействия КАК ВТ_ДатыНачалаДействия
		ПО ВТ_ТоварыИДаты.Номенклатура = ВТ_ДатыНачалаДействия.Номенклатура
			И ВТ_ТоварыИДаты.ДАТА >= ВТ_ДатыНачалаДействия.Дата
;

////////////////////////////////////////////////////////////////////////////////
// Из таблицы ВТ_СоедиениеПромежуточных отберем самые последние  
//  даты установки цен 
////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
		ВТ_1.ДатаДни КАК ДатаДни,
		ВТ_1.Номенклатура КАК Номенклатура,
		ВТ_1.Цена КАК Цена
ИЗ
		ВТ_СоедиениеПромежуточных КАК ВТ_1
ГДЕ
	(ВТ_1.ДатаДействия) В 
	(ВЫБРАТЬ ПЕРВЫЕ 1 ВТ_2.ДатаДействия ИЗ ВТ_СоедиениеПромежуточных КАК ВТ_2 ГДЕ ВТ_1.Номенклатура = ВТ_2.Номенклатура И ВТ_1.ДатаДни = ВТ_2.ДатаДни УПОРЯДОЧИТЬ ПО ВТ_2.ДатаДействия УБЫВ)	
Пример вывода таблицы «ДАТЫ»
Пример вывода таблицы «ВТ_Товары»
Пример вывода произведения таблиц «ВТ_ТоварыИДаты»
Пример вывода таблицы ВТ_ДатыНачалаДействия
(Данная таблицы содержит все записи на которые устанавливалась цена)
Данная таблица является результатом соединения таблиц ВТ_ТоварыИДаты и ВТ_ДатыНачалаДействия.
(Нужные записи выделены «Зеленым»)
Данная таблица является результатом отбора по «Зеленым» строкам предыдущей таблицы