Имя: Пароль:
1C
1С v8
Получение остатков за каждый день в СКД (с условием)
0 AlStorm
 
21.07.11
02:37
Всем привет!
Вобщем, есть такой код:



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





Он выводит динамику задолженностей по контрагентам в разрезе агентов за период. Причем считается только задолженность свыше 14 дней (это важно!)

В СКД сделал дополнение, все работает, но с одним НО.
Как я понял, работает СКД так:
Запрос выдает данные остатков только на те дни, где были движения. Например, я строю отчет с 1го по 10е января, движение было только 5го. Собственно, в запросе выдаст только остаток на 5е число, и на 10е - на конец периода.
СКД не дурак, берет и копирует остатки, полученные 5го числа на все даты в периоде с 1го по 4е января - и верно делает (движений-то не было!).
Но в моем случае это не прокатывает. Почему? Да потому, что мне нужны не просто остатки по долгам, мне нужны остатки по долгам свыше 14 дней! И когда СКД копирует данные с 5го числа на числа ранее - это неправильно, так как с 1го по 4е число долг по какому-нибудь документу выйдет за рамки 14ти дней, но общая задолженность не изменится.

Как обойти эту проблему? Может, как-то модифицировать запрос?
1 AlStorm
 
21.07.11
13:28
Победил:)
2 AlStorm
 
21.07.11
13:29
ВЫБРАТЬ
   ВерхнийЗапрос.Дата,
   СУММА(ВерхнийЗапрос.Сумма) КАК Сумма,
   ВерхнийЗапрос.Агент
ИЗ
   (ВЫБРАТЬ
       Даты.Дата КАК Дата,
       СУММА(ОсновнойЗапрос.СуммаВзаиморасчетов) КАК Сумма,
       ОсновнойЗапрос.Агент КАК Агент,
       ОсновнойЗапрос.ДокументРасчетовСКонтрагентом КАК ДокументРасчетовСКонтрагентом
   ИЗ
       (ВЫБРАТЬ
           КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Началопериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d), ДЕНЬ) КАК Дата,
           КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Началопериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d - &КоличествоДнейЗадолженности + 1), ДЕНЬ) КАК Минус14Дней
       ИЗ
           (ВЫБРАТЬ
               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 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)) КАК Даты
           ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               СУММА(ВЫБОР
                       КОГДА ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
                           ТОГДА ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.СуммаВзаиморасчетов
                       ИНАЧЕ -ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.СуммаВзаиморасчетов
                   КОНЕЦ) КАК СуммаВзаиморасчетов,
               ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДоговорКонтрагента.Агент КАК Агент,
               КОНЕЦПЕРИОДА(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Период, ДЕНЬ) КАК Период,
               КОНЕЦПЕРИОДА(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДокументРасчетовСКонтрагентом.Дата, ДЕНЬ) КАК ДеньДолга,
               ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДокументРасчетовСКонтрагентом КАК ДокументРасчетовСКонтрагентом
           ИЗ
               РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов
           ГДЕ
               (ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДокументРасчетовСКонтрагентом ССЫЛКА Документ.РеализацияТоваровУслуг
                       ИЛИ ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДокументРасчетовСКонтрагентом ССЫЛКА Документ.ДокументРасчетовСКонтрагентом
                       ИЛИ ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДокументРасчетовСКонтрагентом ССЫЛКА Документ.КорректировкаДолга)
               И ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДоговорКонтрагента.ВидДоговора = &ДоговорСПокупателем
               И ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ВидРасчетовСКонтрагентом = &ВидРасчетовСКонтрагентом
           
           СГРУППИРОВАТЬ ПО
               ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДоговорКонтрагента.Агент,
               ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДокументРасчетовСКонтрагентом,
               КОНЕЦПЕРИОДА(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Период, ДЕНЬ),
               КОНЕЦПЕРИОДА(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ДокументРасчетовСКонтрагентом.Дата, ДЕНЬ)) КАК ОсновнойЗапрос
           ПО Даты.Дата > ОсновнойЗапрос.Период
               И Даты.Минус14Дней > ОсновнойЗапрос.ДеньДолга
   
   СГРУППИРОВАТЬ ПО
       Даты.Дата,
       ОсновнойЗапрос.Агент,
       ОсновнойЗапрос.ДокументРасчетовСКонтрагентом) КАК ВерхнийЗапрос
ГДЕ
   ВерхнийЗапрос.Сумма >= 0

СГРУППИРОВАТЬ ПО
   ВерхнийЗапрос.Дата,
   ВерхнийЗапрос.Агент










Вобщем, вот такой запросик получился.
Виртуальные таблицы вообще не использовал, остатки считаю сам по таблице регистра.
Независимо от того, куда вы едете — это в гору и против ветра!