Имя: Пароль:
1C
 
Интервальное деление года запросом
, , ,
0 Tateossian
 
08.08.17
20:32
Всем привет!

Год нужно разбить на 4-часовые интервалы, т. е. в стуках 6 интервалов.
В году 2196 интервалов.

Пример работы запроса: указывается &НачалоПериода и &КонецПериода для виртуальной таблицы оборотного регистра. Предположим, первый параметр будет 01.01.2016, а второй - 31.12.2016 23:59:59.

Тогда разбивка по интервалам вернет таблицу такого содержания:

Тик 0    - 01.01.2016 00:00:00
Тик 1    - 01.01.2016 00:04:00
Тик 2    - 01.01.2016 00:08:00
Тик 2195 - 31.12.2016 23:59:59.

Если я сдвину на месяц вперед начало периода и, соответственно, конец, тогда должно получится вот так:

Тик 0    - 01.02.2016 00:00:00
Тик 1    - 01.02.2016 00:04:00
Тик 2    - 01.02.2016 00:08:00
Тик 2195 - 31.01.2017 23:59:59

Косяк в моем варианте реализации, что я "отбрасываю" год и у меня получается вот так:

Тик 0    - 01.01.2017 00:00:00
Тик 1    - 01.01.2017 00:04:00
Тик 2    - 01.01.2017 00:08:00
Тик 2195 - 31.12.2016 23:59:59

Как корректно произвести сдвиг?
1 Волшебник
 
модератор
08.08.17
20:33
Зачем всё это?
2 Tateossian
 
08.08.17
20:34
(1) Укрупнение данных для аналитических задач.
3 Волшебник
 
модератор
08.08.17
20:35
Сделай таблицу значений и закинь её в запрос.
4 Tateossian
 
08.08.17
20:38
(3) А запросом никак? Таблицей можно, конечно.
5 Волшебник
 
модератор
08.08.17
20:44
(4) религия не позволяет?
6 Волшебник
 
модератор
08.08.17
20:45
показал бы запрос что ли...
7 vadim777
 
08.08.17
20:51
(0) Запрос - для извлечения данных, а не для расчетов. Тут только ТЗ.
8 Tateossian
 
08.08.17
20:54
(5) Дело в том, что это интеграционное решение и таблицу я передать не смогу (простым способом). Вот пример запроса:

"
|ВЫБРАТЬ
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг) КАК Регистратор,
|    ПродажиПоАкциямОбороты.Период КАК Период,
|    СУММА(ПродажиПоАкциямОбороты.КоличествоОборот) КАК КоличествоРасход,
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг).Склад.ПлощадкаСклада КАК ПлощадкаСклада
|ПОМЕСТИТЬ ДвиженияПоРегистру
|ИЗ
|    РегистрНакопления.ПродажиПоАкциям.Обороты(
|            &НачалоПериода,
|            &КонецПериода,
|            Час,
|            Номенклатура = &Номенклатура
|                И Акция = ЗНАЧЕНИЕ(Документ.МаркетинговаяАкция.ПустаяСсылка)) КАК ПродажиПоАкциямОбороты
|
|СГРУППИРОВАТЬ ПО
|    ПродажиПоАкциямОбороты.Период,
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг).Склад.ПлощадкаСклада,
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг),
|    ПродажиПоАкциямОбороты.Период,
|    СУММА(-ПродажиПоАкциямОбороты.КоличествоОборот),
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг).Склад.ПлощадкаСклада
|ИЗ
|    РегистрНакопления.ПродажиПоАкциям.Обороты(
|            &НачалоПериода,
|            &КонецПериода,
|            Регистратор,
|            Номенклатура = &Номенклатура
|                И Акция = ЗНАЧЕНИЕ(Документ.МаркетинговаяАкция.ПустаяСсылка)) КАК ПродажиПоАкциямОбороты
|ГДЕ
|    ПродажиПоАкциямОбороты.Регистратор ССЫЛКА Документ.КорректировкаЗаписейРегистров
|
|СГРУППИРОВАТЬ ПО
|    ПродажиПоАкциямОбороты.Период,
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг).Склад.ПлощадкаСклада,
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг),
|    ПродажиПоАкциямОбороты.Период,
|    СУММА(-ПродажиПоАкциямОбороты.КоличествоОборот),
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг).Склад.ПлощадкаСклада
|ИЗ
|    РегистрНакопления.ПродажиПоАкциям.Обороты(
|            &НачалоПериода,
|            &КонецПериода,
|            Регистратор,
|            Номенклатура = &Номенклатура
|                И Акция = ЗНАЧЕНИЕ(Документ.МаркетинговаяАкция.ПустаяСсылка)) КАК ПродажиПоАкциямОбороты
|ГДЕ
|    ПродажиПоАкциямОбороты.Регистратор ССЫЛКА Документ.КорректировкаРеализации
|
|СГРУППИРОВАТЬ ПО
|    ПродажиПоАкциямОбороты.Период,
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг).Склад.ПлощадкаСклада,
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг),
|    ПродажиПоАкциямОбороты.ДокументПродажи.Дата,
|    СУММА(ПродажиПоАкциямОбороты.КоличествоОборот),
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг).Склад.ПлощадкаСклада
|ИЗ
|    РегистрНакопления.ПродажиПоАкциям.Обороты(
|            &НачалоПериода,
|            &КонецПериода,
|            Регистратор,
|            Номенклатура = &Номенклатура
|                И Акция = ЗНАЧЕНИЕ(Документ.МаркетинговаяАкция.ПустаяСсылка)) КАК ПродажиПоАкциямОбороты
|ГДЕ
|    ПродажиПоАкциямОбороты.Регистратор ССЫЛКА Документ.КорректировкаРеализации
|
|СГРУППИРОВАТЬ ПО
|    ПродажиПоАкциямОбороты.ДокументПродажи.Дата,
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг).Склад.ПлощадкаСклада,
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ДвиженияПоРегистру.Период КАК Период,
|    СУММА(ДвиженияПоРегистру.КоличествоРасход) КАК КоличествоРасход,
|    ДвиженияПоРегистру.ПлощадкаСклада,
|    ВЫБОР
|        КОГДА ЧАС(ДвиженияПоРегистру.Период) / 4 < 2
|            ТОГДА 1
|        КОГДА ЧАС(ДвиженияПоРегистру.Период) / 4 < 3
|            ТОГДА 2
|        КОГДА ЧАС(ДвиженияПоРегистру.Период) / 4 < 4
|            ТОГДА 3
|        КОГДА ЧАС(ДвиженияПоРегистру.Период) / 4 < 5
|            ТОГДА 4
|        КОГДА ЧАС(ДвиженияПоРегистру.Период) / 4 < 6
|            ТОГДА 5
|        КОГДА ЧАС(ДвиженияПоРегистру.Период) / 4 < 7
|            ТОГДА 6
|    КОНЕЦ КАК Тик,
|    ДЕНЬГОДА(ДвиженияПоРегистру.Период) КАК ДеньГода
|ПОМЕСТИТЬ ДвиженияПоТикам
|ИЗ
|    ДвиженияПоРегистру КАК ДвиженияПоРегистру
|
|СГРУППИРОВАТЬ ПО
|    ДвиженияПоРегистру.Период,
|    ДвиженияПоРегистру.ПлощадкаСклада
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    &ГУИД GUID,
|    ВЗ.Тик КАК Tick,
|    СУММА(ВЗ.КоличествоРасход) КАК Consumption
|ИЗ
|    (ВЫБРАТЬ
|        ДвиженияПоТикам.Период КАК Период,
|        ДвиженияПоТикам.КоличествоРасход КАК КоличествоРасход,
|        ДвиженияПоТикам.ПлощадкаСклада КАК ПлощадкаСклада,
|        ДвиженияПоТикам.ДеньГода * 6 + ДвиженияПоТикам.Тик - 5 КАК Тик,
|        ДвиженияПоТикам.ДеньГода КАК ДеньГода
|    ИЗ
|        ДвиженияПоТикам КАК ДвиженияПоТикам
|    ГДЕ
|        ДвиженияПоТикам.ПлощадкаСклада = &ПлощадкаСклада) КАК ВЗ
|
|СГРУППИРОВАТЬ ПО
|    ВЗ.Тик
|
|УПОРЯДОЧИТЬ ПО
|    Tick");
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("ГУИД", Строка(Номенклатура.УникальныйИдентификатор()));
Запрос.УстановитьПараметр("ПлощадкаСклада", ПлощадкаСклада);

Результат = Запрос.Выполнить().Выгрузить();
9 Tateossian
 
08.08.17
20:55
(7) Для расчетов используется совсем другое ПО, в этом проблема.
10 Волшебник
 
модератор
08.08.17
21:03
(9) Вот пусть это ПО и занимается интервализацией
11 Tateossian
 
08.08.17
21:13
(10) Это уже не по существу вопроса.
12 Tateossian
 
09.08.17
00:37
Вот решение данной задачи.

"
|ВЫБРАТЬ
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг) Регистратор,
|    СУММА(ПродажиПоАкциямОбороты.КоличествоОборот) КоличествоРасход,
|    ПродажиПоАкциямОбороты.Номенклатура,
|    НАЧАЛОПЕРИОДА(ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг).Дата, ЧАС) Период
|ПОМЕСТИТЬ ДвиженияПоРегистру
|ИЗ
|    РегистрНакопления.ПродажиПоАкциям.Обороты(
|            ,
|            ,
|            Авто,
|            Номенклатура = &Номенклатура
|                И Акция = ЗНАЧЕНИЕ(Документ.МаркетинговаяАкция.ПустаяСсылка)
|                И (ВЫРАЗИТЬ(ДокументПродажи КАК Документ.РеализацияТоваровУслуг).Дата МЕЖДУ &НачалоПериода И &КонецПериода)) КАК ПродажиПоАкциямОбороты
|
|СГРУППИРОВАТЬ ПО
|    ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг),
|    ПродажиПоАкциямОбороты.Номенклатура,
|    НАЧАЛОПЕРИОДА(ВЫРАЗИТЬ(ПродажиПоАкциямОбороты.ДокументПродажи КАК Документ.РеализацияТоваровУслуг).Дата, ЧАС)
|
|ИНДЕКСИРОВАТЬ ПО
|    Период,
|    Регистратор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ДОБАВИТЬКДАТЕ(&НачалоПериода, ЧАС, 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 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ЧАС)
|
|ИНДЕКСИРОВАТЬ ПО
|    Период
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ВЗ.Период,
|    ВЗ.НПП КАК НПП,
|    ВЗ.НПП * 4 КАК НППЧетыре
|ПОМЕСТИТЬ РасчетнаяКолонка
|ИЗ
|    (ВЫБРАТЬ
|        Периоды.Период КАК Период,
|        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Периоды1.Период) - 1 КАК НПП
|    ИЗ
|        Периоды КАК Периоды
|            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Периоды КАК Периоды1
|            ПО Периоды.Период >= Периоды1.Период
|    
|    СГРУППИРОВАТЬ ПО
|        Периоды.Период) КАК ВЗ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    РасчетнаяКолонка.Период КАК Период,
|    РасчетнаяКолонка.НПП / 4 КАК Тик,
|    ДОБАВИТЬКДАТЕ(РасчетнаяКолонка.Период, ЧАС, -4) КАК ПериодН
|ПОМЕСТИТЬ Тики
|ИЗ
|    РасчетнаяКолонка КАК РасчетнаяКолонка
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РасчетнаяКолонка КАК РасчетнаяКолонка1
|        ПО РасчетнаяКолонка.НПП = РасчетнаяКолонка1.НППЧетыре
|
|ИНДЕКСИРОВАТЬ ПО
|    Период,
|    ПериодН
|;
|
|////////////////////////////////////////////////////////////////////////////////
|УНИЧТОЖИТЬ Периоды
|;
|
|////////////////////////////////////////////////////////////////////////////////
|УНИЧТОЖИТЬ РасчетнаяКолонка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    СУММА(ДвиженияПоРегистру.КоличествоРасход) КАК Consumption,
|    ДвиженияПоРегистру.Номенклатура SKU,
|    Тики.Тик КАК Tick
|ИЗ
|    ДвиженияПоРегистру КАК ДвиженияПоРегистру
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Тики КАК Тики
|        ПО ДвиженияПоРегистру.Период >= Тики.ПериодН
|            И ДвиженияПоРегистру.Период < Тики.Период
|
|СГРУППИРОВАТЬ ПО
|    ДвиженияПоРегистру.Номенклатура,
|    Тики.Тик
|
|УПОРЯДОЧИТЬ ПО
|    Тик"