gifts2017

Остатки на каждый день

Опубликовал Гайк Аракелян (arakelyan) в раздел Программирование - Практика программирования

Запрос формирует остатки товаров на каждый день в пределах выбранного периода.

Цель статьи - представить простой и удобочитаемый запрос формирующий остатки на каждый день в пределах выбранного периода, Вначале для этой цели предполагалось использовать запрос на основе генерации числовой последовательности и последовательности дат (подробнее здесь), однако благодаря трудам пользователя lidarovich был найден более оптимальный способ получения остатков. 

Обращаю внимание на то, что для работы данного запроса должен использоваться регистр сведений РегламентированныйПроизводственныйКалендарь. Даже если он не используется в организации, в нём должна быть хотя бы одна запись. Если записей нет, то их можно создать.

Полный код запроса:

ВЫБРАТЬ РАЗЛИЧНЫЕ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
ПОМЕСТИТЬ Дни
ИЗ
	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоПериода И &КонецПериода
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Движения.Номенклатура,
	ДНИ.ДатаКалендаря КАК ДатаКалендаря,
	СУММА(ВЫБОР
			КОГДА Движения.Период = &НачалоПериода
				ТОГДА Движения.КоличествоКонечныйОстаток
			ИНАЧЕ ВЫБОР
					КОГДА Движения.Период <= ДНИ.ДатаКалендаря
						ТОГДА Движения.КоличествоОборот
					ИНАЧЕ 0
				КОНЕЦ
		КОНЕЦ) КАК КоличествоКонечныйОстаток
ИЗ
	Дни КАК ДНИ
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК Движения
		ПО (Движения.Период <= ДНИ.ДатаКалендаря)
ГДЕ
	Движения.Номенклатура.ОсновнойПоставщик = &ОсновнойПоставщик
	И Движения.Номенклатура.Код = &Код

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

Еще раз следует подчеркнуть что особенностью данного запроса, на взгляд автора, является его простота и ненагруженность в сравнении со схожими запросами (к примеру из следующей статьи).

Буду рад конструктивной критике в комментариях, а также предложениям по улучшению запроса.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ОстаткиНаКаждыйДень
.epf 7,82Kb
05.08.16
3
.epf 7,82Kb 3 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Руслан (lrs) 27.04.16 16:15
Указанный запрос не работает!
Виртуальную таблицу Остатков и оборотов Вы дополняете отсутствующими датами, но остатки на эти даты не дополняете!! Переделывайте)
2. Гайк Аракелян (arakelyan) 27.04.16 23:39
(1) lrs, Благодарю за комментарий. Скажите пожалуйста в какой конфигурации Вы использовали запрос? Мне очень интересна причина, по которой запрос у Вас не работает, но у меня пока недостаточно информации чтобы её понять. За прикрепленные снимки экрана тройная благодарность.
3. Руслан (lrs) 28.04.16 11:02
Все очевидно, вы соединяете таблицы по дате, но за даты, за которые не было движений остаток отсутствует, поэтому в итоговой таблице у вас дырки (т.е. по сути нулевые остатки, которые на самом деле не нулевые)
Для примера смотрите картинку, где слева ведомомсть по товарам на складах с разворотом по дням, а справа итог выполнения вашего запроса. (например, 2,3го числа конечный остаток соответствует остатку за 1е число, но ваша таблица показывает 0 за эти дни...)
PS. Чтоб быстрее разобраться, сделайте отбор по одной номенклатуре, по одному складу. И выберите ту позицию для анализа, по которой хотябы один день не было движений.
Прикрепленные файлы:
4. Гайк Аракелян (arakelyan) 28.04.16 12:31
(3) lrs, понял что Вы имели в виду. Когда тестировал у себя такой проблемы не возникало. В приложении снимок моей ведомости и консоли, в запросе разумеется ничего не менял. Движение товаров также отсутствует за некоторые даты, но строк со значением NULL не появляется. Благодарю Вас за обратную связь, постараюсь разобраться с данной проблемой.
Прикрепленные файлы:
5. Руслан (lrs) 28.04.16 14:55
(4) arakelyan, В итоге вы уже пришли ни к остаткам на каждый день, а просто к виртуальной таблице остатков и оборотов. Вы все дальше от решения поставленной задачи))
Даже на титульной картинке у вас пропущены даты (в основном это выходные), когда не было движений)))
Пропущенных дат в итоговой таблице Вы не видите, потому что делаете отбор по основному поставщику, обращаясь а элементам, которые отсутствуют в построенной таблице, либо перенесите отбор в условия таблицы остатков и оборотов (Вот сюда: РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(КОНЕЦПЕРИОДА(&Дата1), КОНЕЦПЕРИОДА(&Дата2), День, , Номенклатура.ОсновнойПоставщик = &ОсновнойПоставщик)), или уберите его на момент проверки..
6. Гайк Аракелян (arakelyan) 28.04.16 18:49
(5) lrs, запрос был переосмыслен. Новый запрос возвращает остатки на каждый день даже если не было движений.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа