0. tormozit 5663 26.09.07 14:38 Сейчас в теме

Запрос: количество дней наличия товара на складе за период

Есть много заковыристых задачек, которые часто встречаются в работе. Вот одна из таких задач:
Получить запросом общее количество дней наличия товара на складе в заданном периоде с группировками:
Номенклатура, ХарактеристикаНоменклатуры, Склад. Днем наличия товара считается день, на конец которого остаток положительный.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. d.snissarenko 26.09.07 14:38 Сейчас в теме
о нашел место где можно плюсик поставить ;)
2. Kino 29.09.07 01:42 Сейчас в теме
Как знал, что нужно! Очень вовремя!
3. Aleksey.Bochkov 09.10.07 06:25 Сейчас в теме
А если эту же задачу рассмотреть применительно к прямым запросам в 7.7 ?
4. Вадимко 202 12.10.07 01:45 Сейчас в теме
2(3) Что-то делал похожее, но не употреблял к сожалению, почему не помню, до конца не доделано возможно
Вот короче какой-то шматог:


ТекстЗапроса = "
	|SELECT Контрагенты.ID [Покупатель $Справочник.Контрагенты]
	|	, $ОтгрузкаТМЦ.Номенклатура [Номенклатура $Справочник.Номенклатура]
	|	, SUM($ОтгрузкаТМЦ.Количество) Количество
	|	, SUM($ОтгрузкаТМЦ.СуммаРуб) СуммаРуб
	|	, COUNT(DISTINCT CAST(LEFT(Журнал.DATE_TIME_IDDOC, 8) AS DateTime)) КолвоОтгрузок
	|	, COUNT(DISTINCT CAST(LEFT(Журнал.DATE_TIME_IDDOC, 8) AS DateTime))/:МесяцевВОтчете ОтгрузокВМесяц
	|	, MAX((CAST(LEFT(Журнал.DATE_TIME_IDDOC, 8) AS DateTime))) + ROUND(:ДнейВОтчете/COUNT(DISTINCT CAST(LEFT(Журнал.DATE_TIME_IDDOC, 8) AS DateTime)),0) ПланОтгрузка
	|FROM $Регистр.ОтгрузкаТМЦ AS ОтгрузкаТМЦ With (NOLOCK)
	|	INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ОтгрузкаТМЦ.IDDOC = Журнал.IDDOC
	|	LEFT JOIN $Справочник.Договоры AS Договоры With (NOLOCK) ON $ОтгрузкаТМЦ.ДоговорПокупателя = Договоры.ID
	|	LEFT JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON Договоры.PARENTEXT = Контрагенты.ID
	|WHERE (Журнал.DATE_TIME_IDDOC > :ДатаНачала)
	|	AND (Журнал.DATE_TIME_IDDOC < :ДатаКонца)
	|	AND (($ОтгрузкаТМЦ.ДоговорПокупателя = :ВыбДоговор) OR ($ОтгрузкаТМЦ.ДоговорПокупателя = :ВыбДоговор1))
	|GROUP BY Контрагенты.ID
	//|, $ОтгрузкаТМЦ.Номенклатура
	|ORDER BY Контрагенты.ID
	|, COUNT(DISTINCT CAST(LEFT(Журнал.DATE_TIME_IDDOC, 8) AS DateTime)) DESC
	|";
Показать
5. Вадимко 202 12.10.07 01:46 Сейчас в теме
Упс, это типа темп отгрузок
Ну ладно, мот кому пригодиццо :)
6. Вадимко 202 12.10.07 01:48 Сейчас в теме
Вспомнил, это полезный отчет "кому пора отгружать" :)
7. ValentinV 05.11.08 16:22 Сейчас в теме
>Проверочный набор данных №1
А почему должно быть 8
8. seducer 82 24.12.08 16:47 Сейчас в теме
У меня вот как раз такая же проблемка есть. В этом запросе все хорошо, кроме одного. Не может считать по производственному календарю. У меня вот выходные не должны учитываться. Пока просто приходится перебор делать и выкидывать выходные.
9. elizarovs 76 15.07.09 13:18 Сейчас в теме
А проверьте-ка при тех же данных на периоде с 5 августа по 1 сентября!
10. tormozit 5663 15.07.09 13:59 Сейчас в теме
(9) Думаешь нашел баг? Тогда опиши его
11. elizarovs 76 15.07.09 17:00 Сейчас в теме
(10) Пока не разобрался, но в запросе, построенном "по образу и подобию" для случая, когда на день начала периода не было записи в регистре, а остатки были, считаются дни не с начала периода, а только со следующего поступления товара.
Я так понимаю, ограничив выборку прошлых периодов датами начала и конца периода запроса, мы получаем хитрую ситуацию, когда запрос не видит остатков, из-за отсуствия предыдущей записи в регистре.
12. ZLENKO 12.03.12 12:17 Сейчас в теме
(11) Написал запрос для расчета количества дней на складе. Вложенный запрос получает периоды когда товар был на складе, а потом периоды "склеиваются" с производственным календарем. В отличие от тех запросов, которые я встречал в инете, мой запрос корректно рассчитывает если товара не было на начало или на конец анализируемого периода.

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

СГРУППИРОВАТЬ ПО
	ОстаткиПериоды.Номенклатура
Показать
SIMatveev@1cbit.ru; Paradise.87; ant8; ong1990; S_D_M; svilsa; TapeFiver; +7 Ответить
13. elizarovs 76 13.03.12 05:36 Сейчас в теме
(12) Посмотри здесь http://infostart.ru/public/21177/. При написании ставил целью уйти от производственного календаря. Имхо, теоретически, в него можно забыть воткнуть дату, или вообще забыть заполнить. Получилось гораздо более громоздко, но совсем не зависит от календарей. Теория: 1) составляем список товара, который был на складе на начало периода 2) или был на конец периода 3) или был оборот в периоде. 4) Для этого товара делается выборка на каждую запись в регистре остатков, сравнивается с предыдущей записью в этом же регистре, считается количество прошедших дней с этой предыдущей записи (если там остаток был больше нуля), или с начала периода, при отсутствии предыдущей записи, количество записывается для данного товара. 5) Во внешнем запросе группируем по товару с суммированием количества дней, получаем искомый результат.
SIMatveev@1cbit.ru; +1 Ответить
14. ZLENKO 13.03.12 08:33 Сейчас в теме
(13) Если внимательнее посмотриш на мой запрос, то увидиш он гораздо проще твоего, а делает по сути то же самое :-)
Календарь мне нужен чтобы учитывать праздники и выходные. По мой му не сложно раз в год заполнить календарь.
Если просто в календарных днях, то еще проще и календарь не нужен - можно просто взять РАЗНОСТЬДАТ(ОстаткиПериоды.ПериодНач, ОстаткиПериоды.ПериодКон).
Но
SIMatveev@1cbit.ru; Arthur_bear; elizarovs; +3 Ответить
15. elizarovs 76 13.03.12 12:19 Сейчас в теме
(14) Кстати, разность дат действительно лучше! На моих выкрутасах на периоде 3 месяца 1С умирает. А на разнице дат - работает, на порядок быстрее.
16. mxm2 1160 24.10.12 09:24 Сейчас в теме
Так вроде проще:

ВЫБРАТЬ
    ПартииТоваровНаСкладахОстаткиИОбороты.ПериодДень                 КАК Период
    ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура               КАК Номенклатура,
    ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    ПартииТоваровНаСкладахОстаткиИОбороты.Склад                      КАК Склад,
    ВЫБОР КОГДА ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток > 0 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ КАК ЕстьНаКО
    ВЫБОР КОГДА ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток > 0 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ КАК ЕстьНаНО
Поместить ДниНаличияНаОстатках
ИЗ  РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(&НачПериода, &КонПериода, Авто, , Номенклатура В ИЕРАРХИИ  (&Номенклатура)) КАК ПартииТоваровНаСкладахОстаткиИОбороты
;
ВЫБРАТЬ
    ДниНаличияНаОстатках.Номенклатура,
    ДниНаличияНаОстатках.ХарактеристикаНоменклатуры,
    ДниНаличияНаОстатках.Склад,
    ДниНаличияНаОстатках.Период,
    Минимум(ВЫБОР КОГДА ДниНаличияНаОстатках.Период = ДниНаличияНаОстаткахПеребор.Период) ТОГДА ДниНаличияНаОстатках.ЕстьНаКО ИНАЧЕ РазностьДат(ДниНаличияНаОстатках.Период - ДниНаличияНаОстаткахПеребор.Период, День) КАК Дни

ПОМЕСТИТЬ ИнтервалыНаличия
ИЗ ДниНаличияНаОстатках КАК ДниНаличияНаОстатках
Соединение ДниНаличияНаОстатках КАК ДниНаличияНаОстаткахПеребор
По ДниНаличияНаОстатках.Номенклатура = ДниНаличияНаОстаткахПеребор.Номенклатура
И ДниНаличияНаОстатках.ХарактеристикаНоменклатуры = ДниНаличияНаОстаткахПеребор.ХарактеристикаНоменклатуры
И ДниНаличияНаОстатках.Склад = ДниНаличияНаОстаткахПеребор.Склад
И ДниНаличияНаОстаткахПеребор.ЕстьНаНО = 1 И ДниНаличияНаОстатках.ЕстьНаКО = 1
И (ДниНаличияНаОстатках.Период < ДниНаличияНаОстаткахПеребор.Период И Не ДниНаличияНаОстаткахПеребор.Период = &НачПериода
ИЛИ ДниНаличияНаОстатках.Период = ДниНаличияНаОстаткахПеребор.Период И ДниНаличияНаОстаткахПеребор.Период = &КонПериода)

СГРУППИРОВАТЬ ПО
    ДниНаличияНаОстатках.Номенклатура,
    ДниНаличияНаОстатках.ХарактеристикаНоменклатуры,
    ДниНаличияНаОстатках.Склад,
    ДниНаличияНаОстатках.Период
;
Выбрать 
    ИнтервалыНаличия.Номенклатура,
    ИнтервалыНаличия.ХарактеристикаНоменклатуры,
    ИнтервалыНаличия.Склад,
    Сумма(ИнтервалыНаличия.Дни) КАК Дни
Из ИнтервалыНаличия КАК ИнтервалыНаличия
Сгруппировать По
    ИнтервалыНаличия.Номенклатура,
    ИнтервалыНаличия.ХарактеристикаНоменклатуры,
    ИнтервалыНаличия.Склад
Показать



Как то так, поскольку не имею в наличии УТ10.2/10.3, то за работоспособность не ручаюсь, но вроде должно работать.
17. mxm2 1160 24.10.12 09:39 Сейчас в теме
(16) mxm2, ... первый запрос - таблица по датам, второй - получает интервалы когда товар в наличии, третий - сворачивает эти интервалы. применяю подобную методу в УТ11, на регистре Свободные остатки, но тут перевел в объекты УТ10.Х.
18. Antoska 13 27.03.13 13:53 Сейчас в теме
19. Antoska 13 27.03.13 16:19 Сейчас в теме
Кхмм... Почему нет возможности скачать обработку? Или я совсем ослеп? Запрос это, конечно, хорошо, но хотелось бы и готовую обработку скачать...
20. Boudybuilder 60 07.06.14 21:14 Сейчас в теме
Ну с этого можно хороший показатель вывести. Получить день первого поступления товара на склад , и высчитать всего дней сколько мы уже знакомы с товаром. Ротом из этого запроса получить сколькод дней он был на складе , и высчитать процент. Как такой показатель назвать? Чтото как "% Обеспечнности склада" что ли... ? Кто знает , отпишитесь. Хотелось б грамотно в свои решения это засунуть.
21. more 03.12.14 17:25 Сейчас в теме
Мне вот такой запрос понравился из 1С розница 2,1
ВЫБРАТЬ
	РабочиеДниНоменклатуры.Номенклатура КАК Номенклатура,
	РабочиеДниНоменклатуры.Характеристика КАК Характеристика,
	РабочиеДниНоменклатуры.Магазин,
	СУММА(ВЫБОР
			КОГДА ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток - ТоварыНаСкладахОстаткиИОбороты.РезервКонечныйОстаток > 0
					ИЛИ КОНЕЦПЕРИОДА(РабочиеДниНоменклатуры.ДатаКалендаря, ДЕНЬ) = КОНЕЦПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ)
						И ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток <= ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход
						И НЕ ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход = 0
						И ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток > 0
				ТОГДА РабочиеДниНоменклатуры.РабочийДень
			ИНАЧЕ 0
		КОНЕЦ) КАК КоличествоДнейВПродаже
ИЗ
	(ВЫБРАТЬ
		ГрафикРаботы.ДатаКалендаря КАК ДатаКалендаря,
		ГрафикРаботы.РабочийДень КАК РабочийДень,
		МАКСИМУМ(ТоварыНаСкладахОстаткиИОбороты.Период) КАК Период,
		ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
		ТоварыНаСкладахОстаткиИОбороты.Характеристика КАК Характеристика,
		ГрафикРаботы.Магазин КАК Магазин
	ИЗ
		РегистрСведений.ГрафикиРаботыМагазинов КАК ГрафикРаботы
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
					&ДатаАнализаНачало {(&ДатаАнализаНачало)},
					&ДатаАнализаКонец {(&ДатаАнализаКонец)},
					День,
					ДвиженияИГраницыПериода,
					НЕ Склад.Магазин.МетодРасчетаПотребности = ЗНАЧЕНИЕ(Перечисление.МетодыРасчетаПотребности.ПоЗаказамПокупателей)
						И Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстаткиИОбороты
			ПО ГрафикРаботы.Магазин = ТоварыНаСкладахОстаткиИОбороты.Склад.Магазин
				И (НАЧАЛОПЕРИОДА(ГрафикРаботы.ДатаКалендаря, ДЕНЬ) >= НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ))
	ГДЕ
		ГрафикРаботы.ДатаКалендаря <= &ДатаАнализаКонец
		И ГрафикРаботы.ДатаКалендаря >= &ДатаАнализаНачало
		И НЕ ГрафикРаботы.Магазин.МетодРасчетаПотребности = ЗНАЧЕНИЕ(Перечисление.МетодыРасчетаПотребности.ПоЗаказамПокупателей)
		И ТоварыНаСкладахОстаткиИОбороты.Номенклатура = &Номенклатура
	
	СГРУППИРОВАТЬ ПО
		ГрафикРаботы.ДатаКалендаря,
		ГрафикРаботы.РабочийДень,
		ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
		ТоварыНаСкладахОстаткиИОбороты.Характеристика,
		ГрафикРаботы.Магазин) КАК РабочиеДниНоменклатуры
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
				&ДатаАнализаНачало {(&ДатаАнализаНачало)},
				&ДатаАнализаКонец {(&ДатаАнализаКонец)},
				День,
				ДвиженияИГраницыПериода,
				НЕ Склад.Магазин.МетодРасчетаПотребности = ЗНАЧЕНИЕ(Перечисление.МетодыРасчетаПотребности.ПоЗаказамПокупателей)
					И Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстаткиИОбороты
		ПО РабочиеДниНоменклатуры.Период = ТоварыНаСкладахОстаткиИОбороты.Период
			И РабочиеДниНоменклатуры.Номенклатура = ТоварыНаСкладахОстаткиИОбороты.Номенклатура
			И РабочиеДниНоменклатуры.Характеристика = ТоварыНаСкладахОстаткиИОбороты.Характеристика
ГДЕ
	РабочиеДниНоменклатуры.Номенклатура = &Номенклатура

СГРУППИРОВАТЬ ПО
	РабочиеДниНоменклатуры.Номенклатура,
	РабочиеДниНоменклатуры.Характеристика,
	РабочиеДниНоменклатуры.Магазин
Показать
22. more 23.07.16 17:31 Сейчас в теме
Еще можно так.

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

СГРУППИРОВАТЬ ПО
ДанныеПроизводственногоКалендаря.Дата
;

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

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

УПОРЯДОЧИТЬ ПО
Период
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

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

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

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

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

Консультант 1С
Москва
зарплата от 100 000 руб. до 140 000 руб.
Временный (на проект)