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

0. 843 11.12.11 14:04 Сейчас в теме
Запрос для получения остатков (начальный, конечный, приход, расход) из регистров накопления. Одним запросом. Без вспомагательных регистров и пост-обрабтки запроса. В удобном и читаемом виде.

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. evgeniti 11.12.11 14:04 Сейчас в теме
декартово произведение вроде бы вполне обходится без конструкций ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПО ИСТИНА
select
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, 3*(a-1)+b-1 ) as megafunction
, c as nomenkrlatura
from
(select 1 as a union select 2 union select 3) as t1,
(select 1 as b union select 2 union select 3) as t2,
(select 'крокодил' as c union select 'красный') as t3
-------
да и если уж на то пошло почему бы не пихать вместо двух одинаковыйх строчек вида (select 1 as a union select 2 union select 3) - таблицу значений с цифрами, сформированную в коде, в качестве параметра
4. Angeros 12.12.11 04:22 Сейчас в теме
(1)Формировать в табличку в коде не самый быстрый и гибкий метод. Практика показывает делать это в запросе намного лучше и вообще если есть возможность избавится от параметра лучше это сделать, оно и отлаживать удобней.
2. Smaylukk 843 11.12.11 14:33 Сейчас в теме
Потому что изначально поставил себе цель сделать все одним запросом. Если делать табличку с цыферками - то ее перед запросом нужно сформировать, а при реализации на СКД - вообще такого сделать нельзя, только соединив два набора данных - объект (куда собственно таблица попадет) и запрос, но этот вариант уже реализован.
Что же к Декартовому произведению таблиц - я указал первоисточник, откуда его взял. Можете почитать, почему автор сделал так - просто он делает как раз то, что мне нужно, а далее я не копал
3. Angeros 12.12.11 04:19 Сейчас в теме
А почему было использовано 2 запроса к остаткам, а потом к движениям? Неужели нельзя было обойтись параметром виртуальной таблицы - метод дополнения.
5. Smaylukk 843 12.12.11 10:57 Сейчас в теме
(3), вполне возможно. Я просто делал этот запрос по аналогии с регистрами сведений, когда из них нужно было получить такую же табличку(курсы валют, цены номенклатуры, ...). Просто запрос работает да еще и не очень долго, а я этого и добивался. Если сделаете с методом дополнения с использованием 1 таблички - респект вам :)
6. al_zzz 214 12.02.12 22:15 Сейчас в теме
А запрос точно рабочий? Запускаю в демке по позиции "Петр I Легкие" за период май 2007. При этом получаю в результате, что был на остатки только в последний день периода, хотя по ведомости есть приход от 5 мая 2007.
7. Smaylukk 843 13.02.12 10:37 Сейчас в теме
Запрос точно рабочий. Текст запроса, при вставке в пост потерял несколько символов. Ну и плюс, таблица дата, которую я выложил имеет ограниченность в 36 символов. Попробуйте скачать сам отчет или поменять разрядность таблицы дат.
8. al_zzz 214 13.02.12 21:12 Сейчас в теме
(7) Проверил на самом отчете, количество выдает только на последний день периода, если был всего один приход за период.
9. Smaylukk 843 13.02.12 21:41 Сейчас в теме
(8) al_zzz, извините, не верно понял предыдущий комент. В тексте зпроса я выбираю НачальныйОстаток и соответственно, если был только один приход - в день прихода начальный остаток не изменится. Поменяйте его в тексте запроса на КонечныйОстаток(временная таблица Остатки) и все должно заработать верно.
Спасибо за выявленную неточность
10. akor77 209 13.05.12 21:08 Сейчас в теме
Запрос прекрасно работает. Нужно только добавить одно условие для соединения двух таблиц. Иначе даты с остатками будут "обрезаны" по всем товарам. Пошевелите мозгами сами. Я и так хорошо подсказал.
Автору огромный респект!!!
11. Smaylukk 843 14.05.12 11:47 Сейчас в теме
(10), спасибо, очень приятно :)
12. uri1978 130 15.06.12 01:04 Сейчас в теме
Отчет точно рабочий?
Привожу пример. Меняем дату начала и цифры в отчете разные:


и



По-моему опечатка в коде.
Нужно заменить КоличествоНачальныйОстаток на КоличествоКонечныйОстаток. И тогда отчет заработает, остатки совпадут с "Ведомость по товарам организаций". Т.е. нужно:
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ),
		ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
		ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
13. Smaylukk 843 15.06.12 11:40 Сейчас в теме
(12), как я уже говорил вот здесь (9), да - я там выбирал начальный остаток. Уже не помню зачем. Спасибо за внимательный анализ:)
Хотя вот такая заковыка помогает получше узнать структура и принцип запроса
14. uri1978 130 15.06.12 11:48 Сейчас в теме
Да, действительно не прочитал комментарии. Спасибо за обработку, натолкнула на правильное решение.
15. Smaylukk 843 15.06.12 11:51 Сейчас в теме
(14), очень рад, что вам пригодилось
16. Smaylukk 843 03.07.12 00:44 Сейчас в теме
Во второй временной таблице "ТаблицаДата" условие должно быть следующим:

ГДЕ

ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, t.n) <= &КонецПериода ;

Последнее убирается при вставке в публикацию.
Извините
17. petrov_al 10 03.07.12 13:11 Сейчас в теме
Обратите внимание!!! Запрос корректно отрабатывает не всех ситуациях, например попробуйте например сформировать за период 01.12.2011 по 06.01.2012
Вообщем нужно либо дорабатывать либо на помойку.
18. petrov_al 10 03.07.12 13:23 Сейчас в теме
Анализируйте что выдает конкретно этот подзапрос

ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, t.n) КАК Дата
ИЗ
(ВЫБРАТЬ
6 * (t1.a - 1) + t2.b - 1 КАК n
ИЗ
(ВЫБРАТЬ

1 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6) КАК t1

ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ

1 КАК b ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6) КАК t2

ПО (ИСТИНА)) КАК t
ГДЕ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, t.n) <= &КонецПериода

УПОРЯДОЧИТЬ ПО
Дата
19. Smaylukk 843 04.07.12 09:08 Сейчас в теме
(18) , если вы внимательно читали публикацию - то могли заметить, что в пунтке 2, где я описывал Декартово произведение таблиц - указано, что даный запрос возвращает 36 дней. Запрос вполне рабочий при определенных условиях. Выложен как вариант реализации данной задачи. Все расписано и указаны ссылки первоисточников, так что под свои нужды его очень быстро можно подстроить. Если же вы не в силах это сделать - обращайтесь к специалистам.
20. aspirator23 452 09.07.12 07:27 Сейчас в теме
Или я не понял, или эта задача решается с использованием СКД.
Получение остатков на каждую дату решается установкой периода День.
21. Smaylukk 843 09.07.12 09:45 Сейчас в теме
(20) , возможно и решается. Но основной идеей этой публикации была реализация задачи БЕЗ использования каких-то инструментов кроме запроса.
Если вам при проведении какого-то документа понадобится данная табличка - вы же не будете СКД туда цеплять :)
22. aspirator23 452 09.07.12 13:12 Сейчас в теме
(21) Согласен, если действительно не нужен отчет.
23. Созинов 10.07.12 15:22 Сейчас в теме
(20) aspirator23,
не решается, у вас будут остатки не на каждый день. Для этого и выдумывают виртуальную таблицу дат.

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


Еще дополнение - запрос не считает дни, когда товар пришел днем и в этот же день был продан. Я тупо подставил регистр продаж в подзапрос по остаткам 3 объединением. Может кто подскажет как по нормальному сделать подсчет таких дней (утром и вечером нет остатка по товару, остаток только днем)?
24. Smaylukk 843 10.07.12 16:49 Сейчас в теме
(23) , попробуйте брать НачальныйОстаток + Приход - по идее должно сработать.
25. Гость 04.10.12 14:48
Я выбираю остатки по контрагентам(задолженность), и у меня почему-то в таблице ОстаткиПериодами получаются нулевые периоды, за 1 апреля есть остаток, а за 2 нет....
26. AntonH851 81 04.10.12 14:52 Сейчас в теме
Потому что у меня считаются не сами остатки а разность дт и кр, причем только но документам дата которых удовлетворяет определенному условию, и в результате некоторые строки в таблице остатки получаются с нулевым остатком
27. wildwilduser 5 24.12.12 09:29 Сейчас в теме
подскажите пожалуйста, может чего недопонимаю
но вот эта строчка
МИНИМУМ(ДОБАВИТЬКДАТЕ(ЕСТЬNULL(ОстаткиКонец.НачалоПериода, ДОБАВИТЬКДАТЕ(&КонецПериода, СЕКУНДА, 1)), СЕКУНДА, -1)) КАК КонецПериода

получает конец дня перед ОстаткиКонец.НачалоПериода. это верно?
я полагаю что должен быть конец дня ОстаткиКонец.НачалоПериода.
ещё раз возможно что то недопонимаю.
28. Smaylukk 843 24.12.12 10:41 Сейчас в теме
(27), попробую объяснить:
  • В таблице ОстаткиКонец поле НачалоПериода всегда больше, чем в таблице Остатки.
  • Строка, что вы написали берет минимальную дату, которая больше НачалоПериода в таблице Остатки.
  • Далее, чтобы не было такого, что КонецПериода текущей строки и НачалоПериода следующей не были одинаковы (могут потом быть дублирования) нужно отнять 1 секунду.
  • Ну и последний штрих - для последней записи таблицы уже нет соответствия в таблице ОстаткиКонец, поэтому берем значение параметра &КонецПериода
Как-то так
29. wildwilduser 5 24.12.12 11:16 Сейчас в теме
т.е. в таблице ОстаткиПериодами получаем строки двежений, а ДатаНачала и ДатаКонца это даты между движениями по этим позициям?
30. Smaylukk 843 24.12.12 11:27 Сейчас в теме
(29), Да. И если остаток не менялся за этот период, то мы можем на каждый день в этот промежуток поставить определенное значение.
31. straus 27.12.12 17:39 Сейчас в теме
Касательно объединения в таблице остатков, это необходимо, только на мой взгляд параметр должен быть немного другим:
РегистрНакопления.ТоварыНаСкладах.Остатки(КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ), ) КАК ТоварыНаСкладахОстатки
32. Smaylukk 843 27.12.12 18:03 Сейчас в теме
(31), А разве послудеющее объединение
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК ТоварыНаСкладахОстаткиИОбороты
не подтянет эти изменения?
И вполне возможно, что для учета конечных остатков по дням ваш вариант лучше.
Но в примере я решил (на свою голову) выбрать начальные остатки по дням, поэтому ваш пример мне не покажет правильной картины, если было движение в в день
&НачалоПериода
.
Спасибо за отзыв
34. straus 27.12.12 18:32 Сейчас в теме
(32)
Я получил начальные остатки просто сместив дату в таблице остатков на день вверх, по другому у меня не получилось
33. straus 27.12.12 18:22 Сейчас в теме
простите за кучу правок, не ожидал, что так быстро ответят. Я пытался получить остатки на начало дня и активно испытывал Ваш запрос.
тогда нужно совсем удалить объединение с таблицей остатков иначе первой строкой будет остаток именно на начало дня
35. Smaylukk 843 27.12.12 18:48 Сейчас в теме
(33) , так ведь начальный остаток и нужен на начало дня :).
Но если у вас все получилось согласно вашим ожиданиям - тогда все ОК.
36. straus 27.12.12 19:00 Сейчас в теме
так конечный остаток предыдущего дня и есть начальный остаток текущего или я что то не понимаю?
плюс ко всему, максимум непредсказуемо выберет либо начальный остаток, либо конечный
37. kauksi 210 17.02.13 09:22 Сейчас в теме
полезная штука. но поправьте уже обработку согласно замечаниям тут
40. Smaylukk 843 19.02.13 00:02 Сейчас в теме
(37) ,что именно нужно поправить?
38. ildarovich 7247 17.02.13 16:43 Сейчас в теме
Не рекомендую эту статью к использованию. Ну не должна такая простая задача выливаться в запрос из более сотни строк! Более правильное в методологическом смысле решение (опирающееся на понимание устройства виртуального регистра остатков) можно найти в публикации Запрос по остаткам регистра накопления на каждый день, а еще более короткое - в моем комментарии к этой же статье.
ZOMI; rozhkovdmitriy; ErrorEd88; zqzq; +4 Ответить
39. Smaylukk 843 19.02.13 00:01 Сейчас в теме
Ну сколько нужно повторять? Запрос написан без использования вспомогательных регистров для получения таблицы дат. Наилучшее решение (даже лучше вашего "короткого") - использовать производственный календарь, там точно есть все даты.
А относительно количества строк - я расширенно показал, как сделать поставленную задачу. И заданием этой статьи было поделиться знаниями. И думаю это понятнее, чем "вот такой запрос, только даты берите там, где у вас каждый день регистр изменяется (не в обиду автора упомянутой публикации)".
И на своей базе я не могу посмотреть тем запросом остатки на каждый день. Нет у меня такого регистра.
После этого вы будете утверждать что мой вариант плохой?
41. ABudnikov 3 10.09.13 16:51 Сейчас в теме
Применил этот метод к данным по своим остаткам.
Ошибку, с которой пока так и не поборолся нашёл в том, что не корректно считает остатки в первый день изменения.
Пример:
Есть входящий остаток 50 шт. Период построения запроса с 01.09 по 10.09.
Остаток менялся 05.09 на 45 шт и 08.09 на 30 шт.
В результате таблица остатков выглядит следующим образом:

01.09 - 00:00 | 04.09 - 23:59 | 50 шт - верно
05.09 - 00:00 | 07.09 - 23:59 | 50 шт - не верно ведь остаток на 06.09 должен быть 45 шт
08.09 - 00:00 | 08.09 - 23:59 | 45 шт - верно
09.09 - 00:00 | 09.09 - 23:59 | 30 шт - верно
42. Smaylukk 843 10.09.13 16:59 Сейчас в теме
(41) ABudnikov, в запросе вы берете НачальныйОстаток или КонечныйОстаток? Если брали запрос из публикации - то там Начальный остаток, о чем указано в статье и что соответствует вашим данным.
43. ABudnikov 3 10.09.13 17:12 Сейчас в теме
(42) беру НачальныйОстаток - так же как и в статье.
да и данные я понимаю как получились технически. Но получатся что логически остаток не верный для первой записи из соединения с таблицей остатков по дням - о чем я и написал

Конечный остаток на 05.09 и соответственно начальный на 06.09 у меня 45 шт.
А в результате работы запроса показывает что на 06.09 50 шт а не 45 шт.
44. Smaylukk 843 10.09.13 20:25 Сейчас в теме
(43) ABudnikov, не согласен. Запрос в статье все верно показывает. Смотрим на ваш пример, но я немного расширю таблицу:
Начало периода |Конец периода |Нач. ост.| Оборот|КонОст | Что берет запрос
01.09 - 00:00 | 04.09 - 23:59 | 50 шт | 0 | 50 шт | 50 шт
05.09 - 00:00 | 07.09 - 23:59 | 50 шт | -5 | 45 шт | 50 шт
08.09 - 00:00 | 08.09 - 23:59 | 45 шт | -15 | 30 шт | 45 шт
09.09 - 00:00 | 09.09 - 23:59 | 30 шт | 0 | 30 шт | 30 шт
ABudnikov; +1 Ответить
45. ABudnikov 3 10.09.13 20:36 Сейчас в теме
(44) Хорошо а теперь если эту таблицу соединить с таблицей дат, то получается что на начало 06.09 остаток 50 шт, что не является правильным ответом, т.к. 05.09 произошло списание 5 шт
У Вас в статье написано: "Далее при соединении с таблицей дат, посмотрев в какой интервал остатков входит дата, получаем нужный остаток Главное правильно построить такую таблицу"
Так вот получается что таблица периодов не отражает всю действительность.
46. Smaylukk 843 10.09.13 22:40 Сейчас в теме
(45) ABudnikov, ну так выбирайте конечный остаток и будет вам счастье. Почему оно должно показать вам все правильно, если вы выбираете начальный остаток? Виртуальная таблица оборотов дает 4 даты - начало, конец и даты расходов. В день, когда был расход, начальный остаток не изменялся. Это касается 5 и 8 числа. Т.е. в вашей первоначальной таблице и 8 числа должно быть неправильно.
47. ABudnikov 3 11.09.13 10:44 Сейчас в теме
(46) :) так задача состоит в том, чтоб получить начальные остатки. Да и 8-го тоже не правильный начальный остаток.
Т.к. у Вас в описано получение начальных остатков, я просто хотел указать что приведенный запрос не корректно решает описанную задачу.
52. Smaylukk 843 24.03.14 19:26 Сейчас в теме
(47), да, вы были правы. Только сейчас до этого допер. Спасибо.
48. BTRVODKA 10 15.09.13 04:28 Сейчас в теме
Спасибо, за вашу публикацию!
49. Mails79 12 11.02.14 12:09 Сейчас в теме
Спасибо.
Весь фокус в формирование таблицы остатков по периодам.
Сам бы долго соображал что нужно:)
50. bulpi 184 07.03.14 17:25 Сейчас в теме
Имхо, ошибка в том, что Вы берете начальный остаток, а не конечный. Пример :
Товар1,
нач.остаток 01.01.14 - 5 шт, кон.остаток 3 шт.
нач.остаток 10.01.14 - 3 шт

У Вас получится, что с 02.01 по 09.01 нач.остаток 5. А на самом деле он 3!

51. Smaylukk 843 24.03.14 19:25 Сейчас в теме
(50), да, вы правы. С начальными остатками я перемудрил. Не работает. И если честно, то завис - не пойму как сделать :)
53. Aleksey81 1082 14.08.14 23:00 Сейчас в теме
Автор молодец. Очень полезный код выложил. Важно лишь отметить что в том виде, что он изложен можно использовать период не более 36 дней. Ограничение прямо выходит из способа формирования таблицы дат путем "комбинирования" двух массивов по 6 чисел.
54. JorjKrut 5 25.01.17 11:14 Сейчас в теме
Ребята, вопрос: а чем вам не нравится стандартный механизм дополнения по периоду в итога? А потом выборку из результата запроса обходить с параметрами: ЗапросРезультат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ПолеПериод", "ВСЕ");

Получаем остатки на каждый день таким образом без лишнего геморроя.)

56. Smaylukk 843 04.02.17 00:27 Сейчас в теме
(54) На момент написания публикации этот механизм давал пропуски, если не было движений по регистру. А здесь важно именно видеть остатки на каждый день.
Как сейчас обстоят дела - не знаю, не мониторил.
55. JorjKrut 5 25.01.17 13:29 Сейчас в теме
Кроме того, если дат не очень много, можно объединять таблицы с последовательным увеличением периода виртуальной таблицы остатков и оборотов на один день. См. пример ниже:

Функция ПолучитьДанныеОстатки(ПериодОтчета)
			
	МассивДатОтчета   = Новый Массив;
	ДатаВМассив = НачалоДня(ПериодОтчета.ДатаНачала);
	ДатаОкончания = НачалоДня(ПериодОтчета.ДатаОкончания);
		
	Пока ДатаВМассив <= ДатаОкончания Цикл
		МассивДатОтчета .Добавить(ДатаВМассив);
		ДатаВМассив = КонецДня(ДатаВМассив) + 1;
	КонецЦикла;
	РазмерМассиваДат  = МассивДатОтчета.ВГраница();
	ЗапросТекстНачало =    "ВЫБРАТЬ
				              |	ВЫБОР
				              |		КОГДА ТИПЗНАЧЕНИЯ(Добавлено_БанкиКассыПланОстаткиИОбороты.БанкКасса) ТИП(Справочник.Банки)
				              |			ТОГДА ""БАНК""
				              |		ИНАЧЕ ""КАССА""
				              |	КОНЕЦ КАК БанкИлиКасса,
				              |	Добавлено_БанкиКассыПланОстаткиИОбороты.Группа КАК Группа,
				              |	Добавлено_БанкиКассыПланОстаткиИОбороты.БанкКасса КАК БанкКасса,
				              |	Добавлено_БанкиКассыПланОстаткиИОбороты.РасчетныйСчет КАК РасчетныйСчет,
				              |	Добавлено_БанкиКассыПланОстаткиИОбороты.Огранизация КАК Огранизация,
				              |	Добавлено_БанкиКассыПланОстаткиИОбороты.Период КАК ДатаПоЗаявке,
				              |	Добавлено_БанкиКассыПланОстаткиИОбороты.СуммаНачальныйОстаток КАК СуммаОстатокНачало,
				              |	Добавлено_БанкиКассыПланОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаОстатокКонец
				              |ИЗ
				              |	РегистрНакопления.Добавлено_БанкиКассыПлан.ОстаткиИОбороты(&НачалоПериода, &НачалоПериода, День, , ) КАК Добавлено_БанкиКассыПланОстаткиИОбороты";
	ЗапросТекстОбъединить = Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС;
	ЗапросТекстИтоги = Символы.ПС + "ИТОГИ
							|	СУММА(СуммаОстатокНачало),
							|	СУММА(СуммаОстатокКонец)
							|ПО
							|	ОБЩИЕ,
						 	|	БанкИлиКасса,
							|	Группа,
							|	БанкКасса,
							|	РасчетныйСчет,
							|	Огранизация,
							|	ДатаПоЗаявке";
											
	ЗапросТекст = ЗапросТекстНачало;						
	Для Индекс = 1 По РазмерМассиваДат Цикл
			ЗапросТекстДляДобавления = СтрЗаменить(ЗапросТекстНачало, "&НачалоПериода", "ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, " + Строка(Индекс) + ")");
			ЗапросТекст = ЗапросТекст + ЗапросТекстОбъединить + ЗапросТекстДляДобавления;
	КонецЦикла;	
	ЗапросТекст = ЗапросТекст + ЗапросТекстИтоги;	
			
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("НачалоПериода", ПериодОтчета.ДатаНачала);
	Запрос.УстановитьПараметр("КонецПериода", КонецДня(ПериодОтчета.ДатаНачала)+1);
	Запрос.Текст = ЗапросТекст;
	ЗапросРезультат = Запрос.Выполнить();				
	Возврат ЗапросРезультат;
КонецФункции
Показать
57. AndiA 13.05.19 01:51 Сейчас в теме
Была в чем то аналогичная задача в УТ11: Посчитать средние продажи за день без учета дней, когда товара на складе не было. Причем нужно это было в отчете на СКД. На мой взгляд получилось проще (хотя для справедливости и пример я упростил).
Запрос выводит остатки товара на каждый день и расход (если он был)
Может кому интересно будет...

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

выбрать   
	к.Дата,
	ном.Ссылка КАК Номенклатура,
	МАКСИМУМ(ТоварыНаСкладах.Период) как Период
поместить табПериоды
из 
справочник.Номенклатура как ном
полное соединение
регистрсведений.ДанныеПроизводственногоКалендаря     как к
по ИСТИНА
левое соединение ОстаткиИОбороты как  ТоварыНаСкладах
по   к.дата >= ТоварыНаСкладах.Период
	и ном.Ссылка=ТоварыНаСкладах.Номенклатура
где 
к.дата>=&д1 и к.дата<=&д2
и Ном.ссылка в иерархии (&Группа)

сгруппировать по к.Дата,ном.Ссылка
;

выбрать 
	ном.Номенклатура КАК Номенклатура,
	СУММА(выбор когда isNull(ТоварыНаСкладах.Остаток,0)=0 
	 тогда 1 иначе 0 конец) как ДнейБезТовара
поместить НаличиеТовара	
из 
табПериоды как ном
левое соединение ОстаткиИОбороты как  ТоварыНаСкладах
по   ном.Период = ТоварыНаСкладах.Период
	и ном.Номенклатура=ТоварыНаСкладах.Номенклатура

сгруппировать по ном.Номенклатура
;

выбрать 
  ном.Дата,
  ном.Номенклатура,
  ТоварыНаСкладах.Остаток
поместить табОстатки
из   табПериоды как ном
левое соединение  ОстаткиИОбороты как  ТоварыНаСкладах
по   ном.Период = ТоварыНаСкладах.Период
	и ном.Номенклатура=ТоварыНаСкладах.Номенклатура
;

выбрать 
  ном.Дата,
  ном.Номенклатура,
  НаличиеТовара.ДнейБезТовара,
  ном.Остаток,
  isNull(ТоварыНаСкладах.Регистратор,НЕОПРЕДЕЛЕНО) как Регистратор,
  isNull(ТоварыНаСкладах.Расход,0)  как Расход
из   табОстатки как ном
внутреннее соединение   НаличиеТовара как НаличиеТовара
по ном.Номенклатура=НаличиеТовара.Номенклатура    
левое соединение  ОстаткиИОбороты как  ТоварыНаСкладах
по   ном.Дата = началопериода(ТоварыНаСкладах.Период,ДЕНЬ)
	и ном.Номенклатура=ТоварыНаСкладах.Номенклатура
упорядочить по ном.Дата
Показать
58. vis_tmp 30 21.05.19 15:20 Сейчас в теме
По-моему, за период в котором не было движений запрос не выбирает вообще ничего.
У вас так же?
Оставьте свое сообщение
Вопросы с вознаграждением