Имя: Пароль:
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

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










Вобщем, вот такой запросик получился.
Виртуальные таблицы вообще не использовал, остатки считаю сам по таблице регистра.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн