Остатки товара на каждый день запросом

1. M_A_D 184 05.03.20 13:07 Сейчас в теме
Тема скорее будет памяткой для меня лично, но вдруг кому пригодится.
Т.к. запросы начал писать, относительно не так давно, для меня было целым квестом вывести остатки на каждый день, без потери дней когда движения по товару не было....

 ВЫБРАТЬ
	0 КАК Поле1
ПОМЕСТИТЬ ВТЦифры

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	9
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	10 * ВТЦифры.Поле1 + ВТЦифры1.Поле1 КАК Поле1
ПОМЕСТИТЬ ВТДвузначные
ИЗ
	ВТЦифры КАК ВТЦифры,
	ВТЦифры КАК ВТЦифры1
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	100 * ВТДвузначные.Поле1 + ВТДвузначные1.Поле1 КАК Поле1
ПОМЕСТИТЬ ВТТрехзначные
ИЗ
	ВТДвузначные КАК ВТДвузначные,
	ВТДвузначные КАК ВТДвузначные1
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) КАК Поле1
ПОМЕСТИТЬ ВТНачальнаяДата
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(ВТНачальнаяДата.Поле1, ДЕНЬ, ВТТрехзначные.Поле1) КАК НачалоДня
ПОМЕСТИТЬ ВТДатыПериода
ИЗ
	ВТНачальнаяДата КАК ВТНачальнаяДата
		ПОЛНОЕ СОЕДИНЕНИЕ ВТТрехзначные КАК ВТТрехзначные
		ПО (ИСТИНА)
ГДЕ
	ДОБАВИТЬКДАТЕ(ВТНачальнаяДата.Поле1, ДЕНЬ, ВТТрехзначные.Поле1) МЕЖДУ &Дата1 И ВЫБОР
			КОГДА &Дата2 > &ТекДата
				ТОГДА &ТекДата
			ИНАЧЕ &Дата2
		КОНЕЦ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТоварыНаСкладахОбороты.Номенклатура,
	ТоварыНаСкладахОбороты.ВНаличииОборот,
	ТоварыНаСкладахОбороты.Период,
	ТоварыНаСкладахОбороты.Склад
ПОМЕСТИТЬ ВТДвижениеТовара
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Обороты(
			&Дата1,
			&Дата2,
			День,
			Склад В ИЕРАРХИИ (&Склад)
				И Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ТоварыНаСкладахОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТоварыНаСкладахОстатки.Номенклатура,
	ТоварыНаСкладахОстатки.ВНаличииОстаток,
	ДОБАВИТЬКДАТЕ(&Дата1, ДЕНЬ, -1),
	ТоварыНаСкладахОстатки.Склад
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(
			&Дата1,
			Склад В ИЕРАРХИИ (&Склад)
				И Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ТоварыНаСкладахОстатки
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТДатыПериода.НачалоДня,
	ВТДвижениеТовара.Номенклатура,
	СУММА(ЕСТЬNULL(ВТДвижениеТовара.ВНаличииОборот, 0)) КАК Поле1,
	ВТДвижениеТовара.Склад
ПОМЕСТИТЬ ВТОстаткиНаКаждыйДень
ИЗ
	ВТДатыПериода КАК ВТДатыПериода
		ЛЕВОЕ СОЕДИНЕНИЕ ВТДвижениеТовара КАК ВТДвижениеТовара
		ПО (КОНЕЦПЕРИОДА(ВТДатыПериода.НачалоДня, ДЕНЬ) >= ВТДвижениеТовара.Период)

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

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

СГРУППИРОВАТЬ ПО
	ВТОстаткиНаКаждыйДень.Номенклатура 
Показать


Говорят существует способ вывести остатки на каждый день через Производственный календарь, но я так и не осилил этот способ.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. succub1_5 89 05.03.20 13:20 Сейчас в теме
ВЫБРАТЬ
	КОНЕЦПЕРИОДА(ТоварыНаСкладах.Период, ДЕНЬ) КАК Период,
	ТоварыНаСкладах.Номенклатура КАК Номенклатура,
	СУММА(ТоварыНаСкладах.ВНаличии) КАК ВНаличии
ИЗ
	РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ГДЕ
	ТоварыНаСкладах.Номенклатура = &Номенклатура
	И ТоварыНаСкладах.Период МЕЖДУ &ПериодС И &ПериодПо

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

УПОРЯДОЧИТЬ ПО
	Период
Показать
4. M_A_D 184 05.03.20 14:26 Сейчас в теме
Должен заметить, что такой запрос не работает так как задумывалось в моем посте...

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

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

УПОРЯДОЧИТЬ ПО
Период
Показать

(2)
3. VmvLer 05.03.20 13:28 Сейчас в теме
Говорят существует способ вывести остатки на каждый день через Производственный календарь


это не способ получить остатки, а способ получения ВтПериоды для использования в пакетах получения остатков.

Метод нарастающего итога или баттерфляй красивы в реализации, но как по мне, эффективны только в песочницах.
Быстрее получим результат, сгенерив в тексте запроса пакет с объединеним результатов на каждый день.
5. M_A_D 184 05.03.20 14:33 Сейчас в теме
(3) хм... только в моем запросе нет намека на нарастающий итог.
В дальнейшем с помощью этого запроса я считаю количество дней в наличии, что бы расчитать скорость продаж, и уже далее вывести потребность в той или иной позиции)))

А если это:
(3)
Быстрее получим результат, сгенерив в тексте запроса пакет с объединеним результатов на каждый день.

Поможет быстрее формировать таблицу с остатком на каждый день в том формате в котором выводит мой запрос, то будет очень круто, если вы поделитесь методой тут, в комментарии)
6. VmvLer 05.03.20 14:48 Сейчас в теме
(5) тут ничего не нарастает?
////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ВТДатыПериода.НачалоДня,
    ВТДвижениеТовара.Номенклатура,
    СУММА(ЕСТЬNULL(ВТДвижениеТовара.ВНаличииОборот, 0)) КАК Поле1,
    ВТДвижениеТовара.Склад
ПОМЕСТИТЬ ВТОстаткиНаКаждыйДень
ИЗ
    ВТДатыПериода КАК ВТДатыПериода
        ЛЕВОЕ СОЕДИНЕНИЕ ВТДвижениеТовара КАК ВТДвижениеТовара
        ПО (КОНЕЦПЕРИОДА(ВТДатыПериода.НачалоДня, ДЕНЬ) >= ВТДвижениеТовара.Период)

СГРУППИРОВАТЬ ПО
    ВТДатыПериода.НачалоДня,
    ВТДвижениеТовара.Номенклатура,
    ВТДвижениеТовара.Склад
;
Показать
8. M_A_D 184 05.03.20 15:05 Сейчас в теме
(6) Не буду вступать в палемику.
Но нарастающих итогов в результатах нет.

Дело в том, что выводится остаток из регистра накоплений, в регистре нет понятия остаток на каждый день, и остаток вычисляется в обратную сторону, и вот если вдруг в ходе вычислений мы натыкаемся на день, когда движений по позиции небыло, то мы получаем остаток на этот день "0", а если еще точнее "NULL". но, остаток в этот день равен остатку на конец прошло дня, именно поэтому если остаток вычислился на конец дня, то и дату остатка мы получим из регистра и эта дата = дате из "ВТДатыПериода", а если остаток не вычислился, то и даты нет и остаток берется из даты меньше(предыдущей строки).

Примерно так я старался построить запрос.(скриншот результата в приложении).

P.S. поищу у вас в ЛК публикацию с запросом о котором вы пишете.
Прикрепленные файлы:
9. VmvLer 05.03.20 15:16 Сейчас в теме
(8) ок, кэп. вступать в полемику действительно глупо - оставим этот "хлеб" ток-шоу.
искать в моем ЛК публикации - пустая трата времени и вредно для неокрепших.

скоро выходные, вот вам кошерное чтиво

https://infostart.ru/public/201526/
https://habr.com/ru/post/474458/

Намомню, что сейчас уже есть возможность нумеровать строки запроса по АВТОНОМЕРЗАПИСИ(),
так что методику из первой ссылки можно причесать.
Но все равно с СтрСоединить(мПакеты) слонам будет комфортнее.
10. M_A_D 184 05.03.20 16:05 Сейчас в теме
(9)
Бегло посмотрел, с батерфляем действительно знаком и пользовался, в моей же публикации "АВС продаж для УТ 11.3".
Но не в этом запросе)

И если нужно просто вывести нарастающий итог, еще проще сделать это через СКД, через функцию вычислить(СУММА(Значение), "Первая", "Текущая"). Но знающие поймут все подводные камни такого решения))))
7. VmvLer 05.03.20 14:52 Сейчас в теме
(5)
- создайте шаблон запроса получение остатков за день
- в цикле создайте массив пакетов объединения
- затем СтрСоединить(мПакеты)

тут уже выкладывал, да там и же и просто все
можно использовать даже схему запроса
Оставьте свое сообщение

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