Книга знаний

1С:Предприятие / v8 / Приемы программирования / Запросы

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

Полные остатки по периоду во вложенном запросеАвтор статьи: IronDemon | Редакторы: Waz
Последняя редакция №3 от 29.12.07 | История
URL: http://kb.mista.ru/article.php?id=579

Ключевые слова: запрос,остатки,полные,день,период


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

Многие знают что остатки по периоду с дополнением можно получить таким запросом
ВЫБРАТЬ

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


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

ВЫБРАТЬ

   Дебиторка.СуммаВзаиморасчетовКонечныйОстаток КАК Долг,
   КурсыВалют.Период КАК Период,
   Дебиторка.ДоговорКонтрагента КАК ДоговорКонтрагента,
   Дебиторка.ДоговорКонтрагента.Владелец КАК Контрагент,
   ВЫБОР
       КОГДА Дебиторка.СуммаВзаиморасчетовКонечныйОстаток < 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 <= &КолДнейМеждуДатами) КАК РазностьДат
       ПО (ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, РазностьДат.НомерДняИзДиапазона) МЕЖДУ Дебиторка.ДатаС И Дебиторка.ДатаПо)
ИТОГИ
   СУММА(Долг),
   СУММА(КвоОтрицательных)
ПО
   ОБЩИЕ,
   Контрагент,
   ДоговорКонтрагента,
   Период
АВТОУПОРЯДОЧИВАНИЕ

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2024 | Mista.ru

Яндекс.Метрика