понедельник, 9 февраля 2015 г.

1с Запрос 8.2 Остатки на каждый день периода, без движений

Пример запроса 1с 8.2, когда не было движения за период,  а необходимо вывести остатки.

Где "ВремТз" - это таблица значений, заполненная датами за месяц:

Разница = (КонПериода-НачПериода)/86400;
   
    ВремТз = Новый ТаблицаЗначений;
    ВремТз.Колонки.Добавить("Период",Новый ОписаниеТипов("Дата"));      

    Для сч =0 по Разница Цикл       
        День_=НачПериода+сч*86400;
        ВремТз.Добавить().период = День_;       
    КонецЦикла;


Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1000
                          |    Дни.Период КАК Период
                          |ПОМЕСТИТЬ _Дни
                          |ИЗ
                          |    &Дни КАК Дни
                          |
                          |УПОРЯДОЧИТЬ ПО
                          |    Период
                          |;
                          |
                          |////////////////////////////////////////////////////////////////////////////////
                          |ВЫБРАТЬ
                          |    ДенежныеСредстваОстаткиИОбороты.БанковскийСчетКасса КАК КассаБс,
                          |    _Дни.Период КАК День,
                          |    СУММА(ВЫБОР
                          |            КОГДА КОНЕЦПЕРИОДА(ДенежныеСредстваОстаткиИОбороты.Период, ДЕНЬ) = КОНЕЦПЕРИОДА(&Нач, ДЕНЬ)
                          |                ТОГДА ДенежныеСредстваОстаткиИОбороты.СуммаКонечныйОстаток
                          |            ИНАЧЕ ВЫБОР
                          |                    КОГДА КОНЕЦПЕРИОДА(ДенежныеСредстваОстаткиИОбороты.Период, ДЕНЬ) <= КОНЕЦПЕРИОДА(_Дни.Период, ДЕНЬ)
                          |                        ТОГДА ДенежныеСредстваОстаткиИОбороты.СуммаОборот
                          |                    ИНАЧЕ 0
                          |                КОНЕЦ
                          |        КОНЕЦ) КАК Кон,
                          |    ДенежныеСредстваОстаткиИОбороты.БанковскийСчетКасса КАК КассаБсСсылка
                          |ИЗ
                          |    РегистрНакопления.ДенежныеСредства.ОстаткиИОбороты(&Нач, КОНЕЦПЕРИОДА(&Кон, ДЕНЬ), День, , ) КАК ДенежныеСредстваОстаткиИОбороты,
                          |    _Дни КАК _Дни
                          |
                          |СГРУППИРОВАТЬ ПО
                          |    ДенежныеСредстваОстаткиИОбороты.БанковскийСчетКасса,
                          |    _Дни.Период,
                          |    ДенежныеСредстваОстаткиИОбороты.БанковскийСчетКасса
                          |ИТОГИ ПО
                          |    КассаБс");

    Запрос.УстановитьПараметр("Кон", КонПериода);
    Запрос.УстановитьПараметр("Нач", НачПериода);   
    Запрос.УстановитьПараметр("Дни",ВремТз);
    ДеревоКонОст = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

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

СГРУППИРОВАТЬ ПО
    Движения.Склад,
    ДОБАВИТЬКДАТЕ(&Началопериода, ДЕНЬ, ДНИ.Период)

УПОРЯДОЧИТЬ ПО
    Движения.Склад.Наименование
ИТОГИ ПО
    Период