Имя: Пароль:
1C
1С v8
Как проще посчитать доли в запросе?
0 Liris
 
09.12.15
15:10
Приветствуется уважаемое сообщество!
Представьте себе регистр сведений Сезонность. Регистр периодический, период Год.
В регистре есть измерения: НоменклатурнаяГруппа, НомерНедели. Ресурс один - Значение.
На каждую неделю есть значение показателя.
Требуется вычислить долю показателя, если неделя нужна не полная.
Например, значение показателя на 7 неделю 20, это значит, что в 7ую неделю года показатель имеет значение 20.
Вопрос: как правильно составить запрос, чтобы выбрать несколько недель, например, 4, и начальная или конечная недели могут быть не полными?
Например, 5=7, 6=15, 7=20. 5неделя не полная, нужно долю за три дня. Результат: 3+15+20 = 38
Понятно написал?
1 Fragster
 
гуру
09.12.15
15:11
копейки проетеряешь!
2 Casey1984
 
09.12.15
15:12
не понятно :(
3 Fragster
 
гуру
09.12.15
15:14
Показатель / (7-РазностьДат(НачалоПериода(&Дата, Неделя), &Дата, День))
4 Fragster
 
гуру
09.12.15
15:14
но (1)
5 Fragster
 
гуру
09.12.15
15:14
а потом еще можно производственный календарь прикрутить
6 DTX 4th
 
09.12.15
15:18
Выбрать все дни за период, добавить колонку НеделяГода(Период) КАК Неделя, сгруппировать
Сумма(1)/7 по Неделя, получить в итоге

Неделя|Доля
5|0.5
6|1
7|1
8|0.2

А потом уже соединяй со своим регистром
7 Liris
 
09.12.15
16:22
(5) РПК прикрутил уже. С копейками не страшно, аналитика устраивает пропорциональная доля.
(6) Спасибо. Хороший способ :-) Попробую его.
8 Liris
 
11.12.15
06:46
Сделал такой запрос:

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

СГРУППИРОВАТЬ ПО
    НАЧАЛОПЕРИОДА(ПрК.ДатаКалендаря, НЕДЕЛЯ),
    КОНЕЦПЕРИОДА(ПрК.ДатаКалендаря, НЕДЕЛЯ)
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втКС.НоменклатурнаяГруппа,
    ДЕНЬНЕДЕЛИ(&ДатаНачала) КАК НомерДняДН,
    7 - ДЕНЬНЕДЕЛИ(&ДатаНачала) + 1 КАК ДоляСезонностиДН,
    КСНачало.Сезонность КАК СезонностьДН,
    СУММА(втКС.Сезонность) КАК Сезонность,
    ДЕНЬНЕДЕЛИ(&ДатаОкончания) КАК НомерДняДО,
    ДЕНЬНЕДЕЛИ(&ДатаОкончания) КАК ДоляСезонностиДО,
    КСОкончание.Сезонность КАК СезонностьДО
ИЗ
    втКС КАК втКС
        ЛЕВОЕ СОЕДИНЕНИЕ втКС КАК КСНачало
        ПО втКС.НоменклатурнаяГруппа = КСНачало.НоменклатурнаяГруппа
            И (КСНачало.ДатаНачала = НАЧАЛОПЕРИОДА(&ДатаНачала, НЕДЕЛЯ))
        ЛЕВОЕ СОЕДИНЕНИЕ втКС КАК КСОкончание
        ПО втКС.НоменклатурнаяГруппа = КСОкончание.НоменклатурнаяГруппа
            И (КСОкончание.ДатаОкончания = КОНЕЦПЕРИОДА(&ДатаОкончания, НЕДЕЛЯ))

СГРУППИРОВАТЬ ПО
    втКС.НоменклатурнаяГруппа,
    КСНачало.Сезонность,
    КСОкончание.Сезонность


Выбирает даты без ошибок, универсально.
Прикрутить к нему выборку показателя не составило труда.
Спасибо за подсказки.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.