Имя: Пароль:
1C
 
1C СКД Получить среднее по месяцам с учетом нулевых значений
0 evorle145
 
24.03.23
12:15
В простейшем запросе:
ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.ПериодМесяц,
    ПродажиОбороты.КоличествоОборот,
    ПродажиОбороты.СтоимостьОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(, , Авто, ) КАК ПродажиОбороты

в СКД поставил считать Среднее по итогу:
https://ibb.co/MsLHwk9

Но среднее считает верно только если в месяцах продаж больше 0:
https://ibb.co/dtgXZFs

если пишут там:
Сумма(КоличествоОборот)/Количество(ПериодМесяц)

то результат тот же..
1 Гена
 
гуру
24.03.23
12:28
Во всех знаменателях я бы поставил условие ненулёвости
2 lEvGl
 
гуру
24.03.23
12:31
та не 0 а нул наверно
3 lEvGl
 
гуру
24.03.23
12:31
там
4 lEvGl
 
гуру
24.03.23
12:44
поэтому что там можно... периодичность месяц или сначала из календаря взять даты, к ним лепить обороты с заменой нулов
5 lEvGl
 
гуру
24.03.23
12:50
+ в запросе как бы даже не нулы, а просто записей нет, в ячейках скд рисует неопределено, поэтому нужно самому создать "временную сетку"
6 evorle145
 
24.03.23
12:51
(4) так и делаю, но вот порадокс:

Если я создаю таблицу периодов и к ней левым соединением присоединяю таблицу продаж, то в итоговой таблице получаю только одну строку!
То есть пероиды где не было продаж исчезают.

Но исчезают они только если в левом соединении я вытаскиваю хотя бы одно поле из присоединяемой таблицы.
Вот такой результат запроса будет после левого соединения:
ПериодМесяц
01.09.2019 0:00:00
01.05.2021 0:00:00
01.03.2020 0:00:00
01.12.2021 0:00:00
01.08.2020 0:00:00
01.01.2022 0:00:00
01.03.2023 0:00:00

А вот сам запрос:
ВЫБРАТЬ
    ПродажиОбороты.ПериодМесяц
ПОМЕСТИТЬ ПродажиПериод
ИЗ
    РегистрНакопления.Продажи.Обороты({(&НачПериода)}, {(&КонПериода)}, Авто, ) КАК ПродажиОбороты

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.ПериодМесяц
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК КоличествоОборот,
    ПродажиОбороты.ПериодМесяц
ПОМЕСТИТЬ ТаблицаПродаж
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачПериода {(&НачПериода)}, &КонПериода {(&КонПериода)}, Авто, ) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПродажиПериод.ПериодМесяц
ИЗ
    ПродажиПериод КАК ПродажиПериод
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаПродаж КАК ТаблицаПродаж
        ПО ПродажиПериод.ПериодМесяц = ТаблицаПродаж.ПериодМесяц
7 evorle145
 
24.03.23
12:52
но стоит мне в запросе хотя бы номенклатуру вытащить:
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПродажиПериод.ПериодМесяц,
    ТаблицаПродаж.Номенклатура
ИЗ
    ПродажиПериод КАК ПродажиПериод
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаПродаж КАК ТаблицаПродаж
        ПО ПродажиПериод.ПериодМесяц = ТаблицаПродаж.ПериодМесяц

то все..... таблица итоговая сразу имеет вид:
ПериодМесяц    Номенклатура
01.03.2023 0:00:00    Амортизатор 2217 (газовый) "Белкарл"
8 toypaul
 
гуру
24.03.23
12:55
сделай объединение основной таблицы, с пустой таблицей (номенклатура + месяц и ресурс = 0)
9 magicSan
 
24.03.23
12:56
(0) ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.ПериодМесяц,
    ПродажиОбороты.КоличествоОборот,
    ПродажиОбороты.СтоимостьОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(, , Авто, ) КАК ПродажиОбороты
ИТОГИ
    СУММА(КоличествоОборот)
ПО
    Период ПЕРИОДАМИ(ДЕНЬ, , ),
    Номенклатура
10 toypaul
 
гуру
24.03.23
12:57
(9) в СКД?
11 evorle145
 
24.03.23
14:02
(8) Спасибо большое! именно так и сделал... Что-то для меня стало открытием , что если в СКД делать левое соединение по null полям, и не оборачивать в есть null, то левая таблица целиком не будет выводиться...

В итоге запрос принят вид:
ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ВложенныйЗапрос.Период, МЕСЯЦ) КАК ПериодМесяц
ПОМЕСТИТЬ ПродажиПериод
ИЗ
    (ВЫБРАТЬ
        ДОБАВИТЬКДАТЕ(&НачПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Период
    ИЗ
        (ВЫБРАТЬ
            0 КАК a
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            1
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            3
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            4
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            5
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            6
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            7
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            8
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            9) КАК aa
            ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                0 КАК b
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                1
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                2
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                3
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                4
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                5
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                6
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                7
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                8
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                9) КАК bb
            ПО (ИСТИНА)
            ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                0 КАК c
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                1
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                2
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                3
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                4
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                5
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                6
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                7
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                8
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                9) КАК cc
            ПО (ИСТИНА)
            ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                0 КАК d
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                1
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                2
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                3
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                4
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                5
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                6
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                7
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                8
            
            ОБЪЕДИНИТЬ
            
            ВЫБРАТЬ
                9) КАК dd
            ПО (ИСТИНА)
    ГДЕ
        aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачПериода, &КонПериода, ДЕНЬ)) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
    НАЧАЛОПЕРИОДА(ВложенныйЗапрос.Период, МЕСЯЦ)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЕСТЬNULL(ПродажиОбороты.Номенклатура, ЗНАЧЕНИЕ(Справочник.Номенклатура.Пустаяссылка)) КАК Номенклатура,
    ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК КоличествоОборот,
    ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) КАК СтоимостьОборот,
    ПродажиОбороты.ПериодМесяц КАК ПериодМесяцОборот
ПОМЕСТИТЬ Продажи
ИЗ
    РегистрНакопления.Продажи.Обороты({(&НачПериода)}, {(&КонПериода)}, Авто, ) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Продажи.Номенклатура
ПОМЕСТИТЬ ТаблицаНоменклатура
ИЗ
    Продажи КАК Продажи

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПродажиПериод.ПериодМесяц,
    ТаблицаНоменклатура.Номенклатура
ПОМЕСТИТЬ ТаблицаПериодМесяцИНоменклатура
ИЗ
    ПродажиПериод КАК ПродажиПериод
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаНоменклатура КАК ТаблицаНоменклатура
        ПО (ИСТИНА)
;

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

СГРУППИРОВАТЬ ПО
    ВЛ_ОстаткиЦены.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаПериодМесяцИНоменклатура.ПериодМесяц,
    ТаблицаПериодМесяцИНоменклатура.Номенклатура,
    ЕСТЬNULL(Продажи.КоличествоОборот, 0) КАК Количество,
    ТаблицаОстаткиИЦены.Остаток,
    ТаблицаОстаткиИЦены.ЦенаЗакупочная,
    ТаблицаПериодМесяцИНоменклатура.Номенклатура.Артикул КАК Артикул
ИЗ
    ТаблицаПериодМесяцИНоменклатура КАК ТаблицаПериодМесяцИНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Продажи КАК Продажи
        ПО ТаблицаПериодМесяцИНоменклатура.ПериодМесяц = Продажи.ПериодМесяцОборот
            И ТаблицаПериодМесяцИНоменклатура.Номенклатура = Продажи.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаОстаткиИЦены КАК ТаблицаОстаткиИЦены
        ПО ТаблицаПериодМесяцИНоменклатура.Номенклатура = ТаблицаОстаткиИЦены.Номенклатура
12 evorle145
 
24.03.23
14:03
(9) наверное тоже вариант, но я уже забубенил через левое соединение с таблицой Пероидмесяц + номенклатура левое соединение с продажами