Полные остатки по периоду во вложенном запросе

Как получить остатки по периоду когда не было движения?

Многие знают что остатки по периоду с дополнением можно получить таким запросом:

ВЫБРАТЬ

    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента.Владелец КАК Контрагент,

    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,

    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК Сумма,

    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Период

ИЗ

    РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&ДатаНач, &ДатаКон, День, , ) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты

ИТОГИ 

    СУММА(Сумма)

ПО

    ОБЩИЕ,

    Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНач, &ДатаКон),

    Контрагент,

    ДоговорКонтрагента

Но что делать когда необходимо их получить во вложенном запросе, или посчитать количество дней с отрицательными остатками? Предлагаю следующий вариант. Регистр сведений КурсыВалют должен быть заполнен всеми днями.

ВЫБРАТЬ

    Дебиторка.СуммаВзаиморасчетовКонечныйОстаток КАК Долг,

    КурсыВалют.Период КАК Период,

    Дебиторка.ДоговорКонтрагента КАК ДоговорКонтрагента,

    Дебиторка.ДоговорКонтрагента.Владелец КАК Контрагент,

    ВЫБОР

        КОГДА Дебиторка.СуммаВзаиморасчетовКонечныйОстаток < 0

            ТОГДА 1

        ИНАЧЕ 0

    КОНЕЦ КАК КвоОтрицательных

ИЗ

    РегистрСведений.КурсыВалют КАК КурсыВалют

        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ

            Оборот1.Дата КАК ДатаС,

            МИНИМУМ(ВЫБОР

                    КОГДА Оборот2.Дата ЕСТЬ NULL 

                        ТОГДА КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)

                    ИНАЧЕ КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(Оборот2.Дата, ДЕНЬ, -1), ДЕНЬ)

                КОНЕЦ) КАК ДатаПо,

            Оборот1.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,

            Оборот1.ДоговорКонтрагента КАК ДоговорКонтрагента

        ИЗ

            (ВЫБРАТЬ

                ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Дата,

                ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,

                ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента

            ИЗ

                РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , {(ДоговорКонтрагента.Организация).* КАК Организация, (ДоговорКонтрагента.Владелец).* КАК Контрагент, (ДоговорКонтрагента).*}) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты) КАК Оборот1

                ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ

                    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Дата,

                    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента

                ИЗ

                    РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , {(ДоговорКонтрагента.Организация).* КАК Организация, (ДоговорКонтрагента.Владелец).* КАК Контрагент, (ДоговорКонтрагента).*}) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты) КАК Оборот2

                ПО Оборот1.Дата < Оборот2.Дата

                    И Оборот1.ДоговорКонтрагента = Оборот2.ДоговорКонтрагента

        

        СГРУППИРОВАТЬ ПО

            Оборот1.Дата,

            Оборот1.СуммаВзаиморасчетовКонечныйОстаток,

            Оборот1.ДоговорКонтрагента) КАК Дебиторка

        ПО (КурсыВалют.Период МЕЖДУ Дебиторка.ДатаС И Дебиторка.ДатаПо)

ГДЕ

    КурсыВалют.Период МЕЖДУ &НачалоПериода И &КонецПериода

    И КурсыВалют.Валюта = &Валюта

ИТОГИ

    СУММА(Долг),

    СУММА(КвоОтрицательных)

ПО

    ОБЩИЕ,

    Контрагент,

    ДоговорКонтрагента,

    Период

АВТОУПОРЯДОЧИВАНИЕ

Заметьте, что в итогах для слова Период нет дополнения.

А что делать когда нет возможности использовать дополнительный регистр? Можно построить таблицу с датами и в SQL. Вот так будет выглядеть запрос:

ВЫБРАТЬ

    Дебиторка.СуммаВзаиморасчетовКонечныйОстаток КАК Долг,

    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, РазностьДат.НомерДняИзДиапазона) КАК Период,

    Дебиторка.ДоговорКонтрагента КАК ДоговорКонтрагента,

    ПРЕДСТАВЛЕНИЕ(Дебиторка.ДоговорКонтрагента),

    Дебиторка.ДоговорКонтрагента.Владелец КАК Контрагент,

    ПРЕДСТАВЛЕНИЕ(Дебиторка.ДоговорКонтрагента.Владелец) КАК КонтрагентПредставление,

    ВЫБОР

        КОГДА Дебиторка.СуммаВзаиморасчетовКонечныйОстаток < 0

            ТОГДА 1

        ИНАЧЕ 0

    КОНЕЦ КАК КвоОтрицательных

ИЗ

    (ВЫБРАТЬ

        Оборот1.Дата КАК ДатаС,

        МИНИМУМ(ВЫБОР

                КОГДА Оборот2.Дата ЕСТЬ NULL 

                    ТОГДА КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)

                ИНАЧЕ КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(Оборот2.Дата, ДЕНЬ, -1), ДЕНЬ)

            КОНЕЦ) КАК ДатаПо,

        Оборот1.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,

        Оборот1.ДоговорКонтрагента КАК ДоговорКонтрагента

    ИЗ

        (ВЫБРАТЬ

            ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Дата,

            ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,

            ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента

        ИЗ

            РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , {(ДоговорКонтрагента.Организация).* КАК Организация, (ДоговорКонтрагента.Владелец).* КАК Контрагент, (ДоговорКонтрагента).*}) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты) КАК Оборот1

            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ

                ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Дата,

                ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента

            ИЗ

                РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , {(ДоговорКонтрагента.Организация).* КАК Организация, (ДоговорКонтрагента.Владелец).* КАК Контрагент, (ДоговорКонтрагента).*}) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты) КАК Оборот2

            ПО Оборот1.Дата < Оборот2.Дата

                И Оборот1.ДоговорКонтрагента = Оборот2.ДоговорКонтрагента

    

    СГРУППИРОВАТЬ ПО

        Оборот1.Дата,

        Оборот1.СуммаВзаиморасчетовКонечныйОстаток,

        Оборот1.ДоговорКонтрагента) КАК Дебиторка

        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ

            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 <= &КолДнейМеждуДатами) КАК РазностьДат

        ПО (ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, РазностьДат.НомерДняИзДиапазона) МЕЖДУ Дебиторка.ДатаС И Дебиторка.ДатаПо)

ИТОГИ

    СУММА(Долг),

    СУММА(КвоОтрицательных)

ПО

    ОБЩИЕ,

    Контрагент,

    ДоговорКонтрагента,

    Период

АВТОУПОРЯДОЧИВАНИЕ