Существует регистр накопления "Остатки Номенклатуры" (структура ниже).
Наполнение регистра:
Период |
Регистратор |
Номенклатура |
Склад |
Количество |
31.01.2020 01:00:00 |
Приходная накладная ПН-0001 |
Лаваш |
Сочи |
100,000 |
01.01.2021 00:00:01 |
Приходная накладная ПН-0001 |
Хлеб |
Радужный |
100,000 |
03.01.2021 15:00:00 |
Расходная накладная РН-0001 |
Хлеб |
Радужный |
10,000 |
03.01.2021 16:00:00 |
Приходная накладная ПН-0002 |
Лаваш |
Радужный |
3,000 |
04.01.2021 17:00:00 |
Расходная накладная РН-0002 |
Хлеб |
Радужный |
90,000 |
06.01.2021 01:00:00 |
Приходная накладная ПН-0003 |
Хлеб |
Сочи |
50,000 |
07.01.2021 14:00:00 |
Приходная накладная ПН-0004 |
Хлеб |
Радужный |
90,000 |
07.01.2021 14:30:00 |
Расходная накладная РН-0003 |
Лаваш |
Радужный |
1,000 |
08.01.2021 17:00:00 |
Расходная накладная РН-0004 |
Хлеб |
Радужный |
90,000 |
10.01.2021 01:00:00 |
Расходная накладная РН-0005 |
Хлеб |
Сочи |
50,000 |
11.01.2021 14:00:00 |
Приходная накладная ПН-0005 |
Хлеб |
Радужный |
150,000 |
Суть задачи:
Требуется вычислить количество дней присутствия товаров на складах в разрезе склад/номенклатура за период с 01.01.2021 по 10.01.2021 (сколько дней каждый товар, присутствовавший за заданный интервал на складах, находился на них). Днем присутствия считается любой день из периода, в который товар находился на складе, без ограничения полный день или часть дня.
Выходные данные должны содержать склад, номенклатуру, количество дней присутствия на складе.
Ограничения:
1. Использование платформы 1С:Предприятие 8.3.20.1674 или старше. Каркасная база для выполнения прилагается.
2. Решение должно быть выполнено одним запросом, без циклов в коде. Допускается и приветствуется использование временных таблиц. Допускается использование дополнительных источников данных, указать в решении каких.
3. СКД в решении использоваться не должен
4. Оценка решения производится с точки зрения производительности на больших объемах данных.
Структура регистра «Остатки Номенклатуры»:
Регистраторы: Приходная накладная (вид движения приход), Расходная накладная (вид движения расход)
Измерения: Номенклатура (Справочник.Номенклатура), Склад (Справочник.Склады).
Ресурсы: Количество (Число(15,3)).
* варианты со срезом (детализацией) регистра по периоду менее 1 дня рассматриваться в качестве решения не будут, как нерабочие на больших объемах данных.
Основные пожелания, что нужно сделать одним запросом без циклов, полный день считается днем присутствия. Подсказка, что есть регистр Сведений в предложенной дт, называется диапазон дат, и его можно использовать.
Решение:
Вся фишка в том,что мы берем проверочный день,и если есть остаток на начало или конец этого дня, это в любом случае это =1 день хранения, поэтому нам лучше взять таблицу ОстаткиНоменклатуры.ОстаткиИОбороты , где можно взять ресурс Начальный остаток на день и конечный остаток, и если хотя бы один из них больше 0 то, это будет «1» день хранения на складе, периодичность в таблице выберем день.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ОстаткиНоменклатурыОстаткиИОбороты.Период, ДЕНЬ) КАК Период,
ОстаткиНоменклатурыОстаткиИОбороты.Склад КАК Склад,
ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура КАК Номенклатура,
ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(&ДатаН, &ДатаК, День, , ) КАК ОстаткиНоменклатурыОстаткиИОбороты
Получилась такая табличка, где видно остатки на день , причем где остатков не было, дни не вошли,что нам и нужно. Теперь добавим переменную «ХранениеДней» и сделаем условие,что если остатки есть,то она возвращает 1 ,и делаем итоги по ней ,все это добавим в запрос :
ВЫБОР
КОГДА ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток > 0
ИЛИ ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток > 0
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ КАК ХранениеДней
----
ИТОГИ
СУММА(ХранениеДней)
ПО
ОБЩИЕ
–
Теперь мы имеем общие цифры,
осталось сгруппировать и разделить по номенклатуре и складу :
СГРУППИРОВАТЬ ПО
ОстаткиНоменклатурыОстаткиИОбороты.Склад,
ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура,
ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток,
ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток,
НАЧАЛОПЕРИОДА(ОстаткиНоменклатурыОстаткиИОбороты.Период, ДЕНЬ)
ИТОГИ
СУММА(ХранениеДней)
ПО
ОБЩИЕ,
Склад,
Номенклатура
В итоге соединяем все и получаем наши цифры по хранению на складах в днях.