Имя: Пароль:
1C
1С v8
Нужны мысли по составлению запроса
0 happysan
 
20.06.22
12:54
Существует регистр накопления "Остатки Номенклатуры" (структура ниже).

Наполнение регистра:


Период    Регистратор    Номенклатура    Склад    Количество
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 любого релиза
2. Решение должно быть выполнено одним запросом, без циклов в коде. Допускается и приветствуется использование временных таблиц. Допускается использование дополнительных источников данных, указать в решении каких.
3. СКД в решении использоваться не должен
4. Оценка решения производится с точки зрения производительности на больших объемах данных.



Структура регистра «Остатки Номенклатуры»:

Регистраторы: Приходная накладная (вид движения приход), Расходная накладная (вид движения расход)

Измерения: Номенклатура (Справочник.Номенклатура), Склад (Справочник.Склады).

Ресурсы: Количество (Число(15,3)).

* варианты со срезом (детализацией) регистра по периоду менее 1 дня рассматриваться в качестве решения не будут, как нерабочие на больших объемах данных.
1 DCKiller
 
20.06.22
13:14
2500 р.
2 Homer
 
20.06.22
14:12
(0) ВЫ же вроде программист с богатым отпитом работы и такую простую задачу. Ну как то не серьезно))
v8: OFF:Какой потолок зп в столице для программиста 1С с богатым опытом работы?
3 mikecool
 
20.06.22
14:36
(0) "* варианты со срезом (детализацией) регистра по периоду менее 1 дня рассматриваться в качестве решения не будут, как нерабочие на больших объемах данных."
ты еще и условия ставить будешь? ))
4 happysan
 
20.06.22
16:05
(0), (1) - у меня уже есть решение, интересны параллельные решения!
(3) - это не мои условия.
5 arsik
 
гуру
20.06.22
16:09
(0) Ну так через виртуальную таблицу ОстаткиИОбороты
6 arsik
 
гуру
20.06.22
16:12
(2) :) Да уж.
7 Мимохожий Однако
 
20.06.22
16:12
(4) Представь своё решение и сделай голосовалку.
8 Zapal
 
20.06.22
16:24
предлагаю скинуться товарищу из (1)
только подозреваю что за один час он не управится
9 happysan
 
20.06.22
16:24
(5) Само собой)
10 Галахад
 
гуру
20.06.22
16:24
Тестовое задание? Интересно на какую з\п.
11 happysan
 
20.06.22
16:24
(8) ))))
12 RomanYS
 
20.06.22
16:27
прикольная задачка
13 arsik
 
гуру
20.06.22
16:31
Да вроде все просто. Нужно найти отрезки времени когда товар в наличии - это 1 запрос, посчитать разницу - это второй.
14 happysan
 
20.06.22
16:42
(13) Этот вариант использовал.
15 RomanYS
 
20.06.22
16:51
ВЫБРАТЬ
    ОстаткиИОбороты.Склад,
    ОстаткиИОбороты.Номенклатура,
    МИНИМУМ(ЕСТЬNULL(Обороты.Период, &Д2)) КАК ПериодПо,
    ОстаткиИОбороты.Период КАК ПериодС,
    ОстаткиИОбороты.КоличествоКонечныйОстаток
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&Д1, &Д2, День, , ) КАК ОстаткиИОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&Д1, &Д2, День, ) КАК Обороты
        ПО ОстаткиИОбороты.Период < Обороты.Период
            И ОстаткиИОбороты.Номенклатура = Обороты.Номенклатура
            И ОстаткиИОбороты.Склад = Обороты.Склад

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Склад КАК Склад,
    ПРЕДСТАВЛЕНИЕ(ВТ.Склад),
    ВТ.Номенклатура КАК Номенклатура,
    ПРЕДСТАВЛЕНИЕ(ВТ.Номенклатура),
    ВТ.ПериодПо,
    ВТ.ПериодС,
    ВТ.КоличествоКонечныйОстаток,
    ВЫБОР
        КОГДА ВТ.КоличествоКонечныйОстаток = 0
                ИЛИ РАЗНОСТЬДАТ(ВТ.ПериодС, ВТ.ПериодПо, ДЕНЬ) = 0
            ТОГДА 1
        ИНАЧЕ РАЗНОСТЬДАТ(ВТ.ПериодС, ВТ.ПериодПо, ДЕНЬ)
    КОНЕЦ КАК Дней
ИЗ
    ВТ КАК ВТ
ИТОГИ
    СУММА(Дней)
ПО
    Склад,
    Номенклатура
16 happysan
 
20.06.22
17:14
(15) Спасибо. Удалось проверить?
17 RomanYS
 
20.06.22
18:01
(16) Да. Вот этот кусок " ИЛИ РАЗНОСТЬДАТ(ВТ.ПериодС, ВТ.ПериодПо, ДЕНЬ) = 0" костылем выглядит, его ты объяснить не можешь без понимания)
18 Маленький Вопросик
 
20.06.22
18:44
(18) Запрос твой - полная ерунда, не учитывает "отрицательные остатки", не видит остатки товара на складе, если остатки вне выбранного периода
19 Маленький Вопросик
 
20.06.22
18:47
тут можно обойтись одним регистром остатки
20 Immortal
 
20.06.22
18:50
Коллега открыл для себя запрос нарастающим итогом с условием и очень за себя рад=)
21 RomanYS
 
20.06.22
18:52
(18) про отрицательные - согласен, считает что остаток есть (и в это есть какая-то логика:))))
Период учтен строго.

(19) Так его два раза брать или в ВТ засовывать. Предполагаю, что мой вариант оптимальнее
22 php5
 
20.06.22
18:52
23 Маленький Вопросик
 
20.06.22
18:55
(21) ну как для гимнастики извилин - сойдет.
24 happysan
 
20.06.22
21:31
(22) Этот вариант я давно видел, только вот здесь: http://www.gilev.ru/количество-дней-когда-товар-был-на-скл/