Добрый день коллеги. Есть простенький отчет с дополнением периода, заказчик хочет, чтобы не было "проседаний" графика в 0 в некоторых месяцах - дублировать прошлый показатель, если он существует. Набросал простенький запрос с использованием куска из "минимализмов":

```1c
    ВЫБРАТЬ 0 КАК Х
    ПОМЕСТИТЬ Регистр1
    ОБЪЕДИНИТЬ
    ВЫБРАТЬ 1
    ;
    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ Младшие.Х + 2 * Старшие.Х КАК Х
    ПОМЕСТИТЬ Регистр2
    ИЗ Регистр1 КАК Младшие, Регистр1 КАК Старшие
    ;
    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ Младшие.Х + 4 * Старшие.Х КАК Х
    ПОМЕСТИТЬ Регистр4
    ИЗ Регистр2 КАК Младшие, Регистр2 КАК Старшие;

    ВЫБРАТЬ РАЗРЕШЕННЫЕ
    НомераМесяцев.Х КАК НомерМесяца,
    ДанныеРегистраОбороты.Подразделение

    ПОМЕСТИТЬ ВТПодразделения
    ИЗ
    Регистр4 КАК НомераМесяцев,
    РегистрНакопления.НекийРегистр.Обороты(НАЧАЛОПЕРИОДА(&НачалоПериода, МЕСЯЦ) {(&НачалоПериода)}, КОНЕЦПЕРИОДА(&КонецПериода, МЕСЯЦ) {(&КонецПериода)}, Месяц, {(Подразделение В (&ППодразделения))}) КАК ДанныеРегистраОбороты

    ГДЕ
    НомераМесяцев.Х >= МЕСЯЦ(&НачалоПериода) И НомераМесяцев.Х <= МЕСЯЦ(&КонецПериода)

    СГРУППИРОВАТЬ ПО
    НомераМесяцев.Х,
    ДанныеРегистраОбороты.Подразделение

    ИНДЕКСИРОВАТЬ ПО
    НомерМесяца,
    Подразделение;

    ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Подразделения.НомерМесяца КАК НомерМесяца,
    МЕСЯЦ(ДанныеРегистраОбороты.Период) КАК МесяцДокумента,
    ДанныеРегистраОбороты.Период,
    Подразделения.Подразделение,
    Подразделения.Подразделение.Код КАК НомерПодразделения,
    ВЫРАЗИТЬ(СУММА(ДанныеРегистраОбороты.ПоказательОборот) КАК ЧИСЛО(15,2)) КАК ПоказательОборот,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеРегистраОбороты.Сотрудник) КАК КоличествоЕдиниц
    ПОМЕСТИТЬ ВТДанные
    ИЗ
    ВТПодразделения КАК Подразделения
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.НекийРегистр.Обороты(НАЧАЛОПЕРИОДА(&НачалоПериода, МЕСЯЦ) {(&НачалоПериода)}, КОНЕЦПЕРИОДА(&КонецПериода, МЕСЯЦ) {(&КонецПериода)}, Месяц, {(Подразделение В (&ППодразделения))}) КАК ДанныеРегистраОбороты ПО
    Подразделения.НомерМесяца = МЕСЯЦ(ДанныеРегистраОбороты.Период)
    И Подразделения.Подразделение = ДанныеРегистраОбороты.Подразделение

    СГРУППИРОВАТЬ ПО
    Подразделения.НомерМесяца,
    ДанныеРегистраОбороты.Период,
    Подразделения.Подразделение

    ИНДЕКСИРОВАТЬ ПО
    НомерМесяца,
    Подразделения.Подразделение;

    ВЫБРАТЬ
    A.НомерМесяца КАК НомерМесяца,
    A.Подразделение КАК Подразделение,
    МАКСИМУМ(B.НомерМесяца) КАК НомерМесяцаПрошлогоЗначения
    ПОМЕСТИТЬ ВТСоответствиеЗначений
    ИЗ
    ВТДанные КАК A
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТДанные КАК B ПО
    A.НомерМесяца > B.НомерМесяца
    И A.Подразделение = B.Подразделение
    ГДЕ
    A.ПоказательОборот ЕСТЬ NULL
    И НЕ B.ПоказательОборот ЕСТЬ NULL

    СГРУППИРОВАТЬ ПО
    A.НомерМесяца,
    A.Подразделение

    ИНДЕКСИРОВАТЬ ПО
    НомерМесяца,
    Подразделение;

    ВЫБРАТЬ
    Т1.НомерМесяца КАК НомерМесяца,
    Т1.Подразделение КАК Подразделение,
    ЕСТЬNULL(Т3.ПоказательОборот, Т1.ПоказательОборот) КАК ПоказательОборот
    ИЗ
    ВТДанные КАК Т1
    ЛЕВОЕ СОЕДИНЕНИЕ ВТСоответствиеЗначений Т2 ПО
    Т1.НомерМесяца = Т2.НомерМесяца
    И Т1.Подразделение = Т2.Подразделение
    ЛЕВОЕ СОЕДИНЕНИЕ ВТДанные КАК Т3 ПО
    Т2.НомерМесяцаПрошлогоЗначения = Т3.НомерМесяца
    И Т2.Подразделение = Т3.Подразделение
```

Суть алгоритма. Создается временная таблица со списком номеров месяцев. Затем на каждый месяц присоединяется весь набор подразделений со значениями оборотов. Затем создается временная таблицы соответствий номеров месяцев с месяцем, который содержит прошлое значение. Ну и в итоге, если в каком-то месяце нет показания на подразделение, то берется прошлое значение, если существует.

И все работает за исключением нюанса - в пределах одного года. Если отчету задать период с 1 июня 2017 по 1 июня 2018, то логика ломается. Каким образом можно доработать запрос?
---
Вот такой метод нашел, спасибо комментарию Angeros, формирует все дни в заданном периоде:

```1c
    ВЫБРАТЬ
    0 КАК Цифра
    ПОМЕСТИТЬ ВсеЦифры

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    1

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    2

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    3

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    4

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    5

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    6

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    7

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    8

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    9
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, ВсеЦифры4.Цифра * 1000 + ВсеЦифры3.Цифра * 100 + ВсеЦифры2.Цифра * 10 + ВсеЦифры1.Цифра * 1) КАК ДатаДень
    ПОМЕСТИТЬ ВсеДни
    ИЗ
    ВсеЦифры КАК ВсеЦифры1
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеЦифры КАК ВсеЦифры2
    ПО (ВсеЦифры2.Цифра * 10 + ВсеЦифры1.Цифра * 1 <= РАЗНОСТЬДАТ(&НачалоПериода, КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ), ДЕНЬ))
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеЦифры КАК ВсеЦифры3
    ПО (ВсеЦифры3.Цифра * 100 + ВсеЦифры2.Цифра * 10 + ВсеЦифры1.Цифра * 1 <= РАЗНОСТЬДАТ(&НачалоПериода, КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ), ДЕНЬ))
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеЦифры КАК ВсеЦифры4
    ПО (ВсеЦифры4.Цифра * 1000 + ВсеЦифры3.Цифра * 100 + ВсеЦифры2.Цифра * 10 + ВсеЦифры1.Цифра * 1 <= РАЗНОСТЬДАТ(&НачалоПериода, КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ), ДЕНЬ));
    ВЫБРАТЬ
    *

    ИЗ ВсеДни

    УПОРЯДОЧИТЬ ПО ДатаДень
```

Осталось прикрутить к моему запросу вместо первой части.
----
UPDATE: Изменил "День" на "Месяц", прикрутил, все работает. Решение найдено.
---
Можно превратить месяц в годмесяц (было 1, стало 201701), но как это сделать комбинаторно в запросе из чисел от 0 до 9..
---
Думал об этом. Я могу получить год из параметра &НачалоПериода или &КонецПериода, но года могут быть разными, поэтому неясно как наполнить временную таблицу значениями заранее исходя из периода заданного в параметрах. Ведь сейчас таблица наполняется математическим методом и её размерность всегда одна и та же.
---
Год*100+Месяц?
---
Вопрос не в этом. Сейчас в моем запросе год никак не учитывается и предполагается, что он формируется в пределах одного года, т.е. в пределах 01.01.ТекущийГод - 31.12.ТекущийГод. Соответственно я привязался к этому и первыми строками запроса формирую табличку с обычными числами от 0 до 15:

```1c
    Х
    __
    0
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
```

Затем каждой цифре я присоединяю весь набор подразделений:

```1c
    1 Подразделение1
    1 Подразделение2
    1 Подразделение3
    1 Подразделение4
    2 Подразделение1
    2 Подразделение3
    2 Подразделение4
    и т.д.
```

Затем заполняю значения напротив каждого подразделения:

```1c
    1 Подразделение1 123.1
    1 Подразделение2 123.2
    1 Подразделение3 123.3
    1 Подразделение4 123.4
    2 Подразделение1 321.1
    2 Подразделение3 NULL
    2 Подразделение4 321.3
    и т.д.
```

Тут уже видно, что во втором месяце для Подразделения№3 данных нет. Возникает вопрос, а это второй месяц какого года? Если данных нет, то и нет информации о периоде. Есть только информация о диапазоне периода.
---
А если взять обороты за период, поместить во временную таблицу, потом соединить эту таблицу саму с собой по условию Таблица1.Период = ДобавитьКДате(Таблица2.Период, Месяц, -1)
---
И вы получите значение предыдущего месяца, в котором точно также могло значений и не быть. Отсюда у меня и появилась инструкция МАКСИМУМ.
---
Ну еще нужна таблица периодов, какой-нибудь календарь, это бы упростило задачу
---
Вот и я об этом думаю. Но эта таблица не может быть статичной, т.к. года идут. А динамически формировать таблицу в запросе тоже непонятно как.
---
Конфигурация какая? в БП, КА, УПП был регламентированный календарь, в УТ есть курсы валют

Ну еще как вариант костыля, создать РС с нужными измерениями, и заполнить его лет на 100 вперед
---
Проще сформировать ТЗ в модуле отчета и подсунуть его в качестве источника данных СКД.
---
Так пустые периоды при 7.7 "сами присоединялись где надо и не надо", а в 8ке что-то ну совсем непонятное.

А надо максимум периода меньше текущего с ненулевым значением оборота.
---
..и производственного календаря в конфигурации по прежнему нет.. Как нет и объекта метаданных и методов встроенного языка. Зато Планировщик есть!
---
Идея интересная, и можно было бы привязаться к нему, если бы речь шла о кадровой базе. У нас последняя запись в регистре сведений ДанныеПроизводственногоКалендаря - 2016 года. У нас не ведется кадровый учет в базе.
---
Курсы валют не подходят, они с дырками по выходным.
---
О! Так он таки есть. Но заполнить календарь - не наш метод.. А это еще и СКД? Какая прелесть. Можно туда вручную в параметры набить список месяцев и лет, букв получится меньше чем кода с запросом?
Хотя нет, конструкция вида выбрать * из &Параметр работать не будет.
---
Вот такой метод нашел, спасибо комментарию Angeros, формирует все дни в заданном периоде:

```1c
    ВЫБРАТЬ
    0 КАК Цифра
    ПОМЕСТИТЬ ВсеЦифры

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    1

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    2

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    3

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    4

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    5

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    6

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    7

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    8

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    9
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, ВсеЦифры4.Цифра * 1000 + ВсеЦифры3.Цифра * 100 + ВсеЦифры2.Цифра * 10 + ВсеЦифры1.Цифра * 1) КАК ДатаДень
    ПОМЕСТИТЬ ВсеДни
    ИЗ
    ВсеЦифры КАК ВсеЦифры1
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеЦифры КАК ВсеЦифры2
    ПО (ВсеЦифры2.Цифра * 10 + ВсеЦифры1.Цифра * 1 <= РАЗНОСТЬДАТ(&НачалоПериода, КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ), ДЕНЬ))
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеЦифры КАК ВсеЦифры3
    ПО (ВсеЦифры3.Цифра * 100 + ВсеЦифры2.Цифра * 10 + ВсеЦифры1.Цифра * 1 <= РАЗНОСТЬДАТ(&НачалоПериода, КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ), ДЕНЬ))
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеЦифры КАК ВсеЦифры4
    ПО (ВсеЦифры4.Цифра * 1000 + ВсеЦифры3.Цифра * 100 + ВсеЦифры2.Цифра * 10 + ВсеЦифры1.Цифра * 1 <= РАЗНОСТЬДАТ(&НачалоПериода, КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ), ДЕНЬ));
    ВЫБРАТЬ
    *

    ИЗ ВсеДни

    УПОРЯДОЧИТЬ ПО ДатаДень
```

Осталось прикрутить к моему запросу вместо первой части.
----
UPDATE: Изменил "День" на "Месяц", прикрутил, все работает. Решение найдено.