v8: Полные остатки по периоду во вложенном запросе
Полные остатки по периоду во вложенном запросеАвтор статьи: IronDemon
Последняя редакция №1 от 15.08.07
Ключевые слова: запрос,остатки,полные,день,период
Как получить остатки по периоду когда не было движения?
Многие знают что остатки по периоду с дополнением можно получить таким запросом
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента.Владелец КАК Контрагент,
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток,
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Период
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&ДатаНач, &ДатаКон, День, , ) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты
ИТОГИ ПО
ОБЩИЕ,
Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНач, &ДатаКон),
Контрагент,
ДоговорКонтрагента
Но что делать когда необходимо их получить во вложенном запросе, или посчитать количество дней с отрицательными остатками?
Предлагаю следующий вариант. Регистр сведений КурсыВалют должен быть заполнен всеми днями.
ВЫБРАТЬ
Дебиторка.СуммаВзаиморасчетовКонечныйОстаток КАК Долг,
КурсыВалют.Период КАК Период,
Дебиторка.ДоговорКонтрагента КАК ДоговорКонтрагента,
Дебиторка.ДоговорКонтрагента.Владелец КАК Контрагент,
ВЫБОР
КОГДА Дебиторка.СуммаВзаиморасчетовКонечныйОстаток < 0
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ КАК КвоОтрицательных
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
Оборот1.Дата КАК ДатаС,
МИНИМУМ(ВЫБОР
КОГДА Оборот2.Дата ЕСТЬ NULL
ТОГДА КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)
ИНАЧЕ КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(Оборот2.Дата, ДЕНЬ, -1), ДЕНЬ)
КОНЕЦ) КАК ДатаПо,
Оборот1.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,
Оборот1.ДоговорКонтрагента КАК ДоговорКонтрагента
ИЗ
(ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Дата,
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода,
&КонецПериода, День, , {(ДоговорКонтрагента.Организация).* КАК Организация, (ДоговорКонтрагента.Владелец).* КАК Контрагент, (ДоговорКонтрагента).*})
КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты) КАК Оборот1
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Дата,
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , {(ДоговорКонтрагента.Организация).* КАК Организация, (ДоговорКонтрагента.Владелец).* КАК Контрагент, (ДоговорКонтрагента).*}) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты) КАК Оборот2
ПО Оборот1.Дата < Оборот2.Дата
И Оборот1.ДоговорКонтрагента = Оборот2.ДоговорКонтрагента
СГРУППИРОВАТЬ ПО
Оборот1.Дата,
Оборот1.СуммаВзаиморасчетовКонечныйОстаток,
Оборот1.ДоговорКонтрагента) КАК Дебиторка
ПО (КурсыВалют.Период МЕЖДУ Дебиторка.ДатаС И Дебиторка.ДатаПо)
ГДЕ
КурсыВалют.Период МЕЖДУ &НачалоПериода И &КонецПериода
И КурсыВалют.Валюта = &Валюта
ИТОГИ
СУММА(Долг),
СУММА(КвоОтрицательных)
ПО
ОБЩИЕ,
Контрагент,
ДоговорКонтрагента,
Период
АВТОУПОРЯДОЧИВАНИЕ
Заметьте, что в итогах для слова Период нет дополнения.
Последняя редакция №1 от 15.08.07
Ключевые слова: запрос,остатки,полные,день,период
Как получить остатки по периоду когда не было движения?
Многие знают что остатки по периоду с дополнением можно получить таким запросом
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента.Владелец КАК Контрагент,
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток,
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Период
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&ДатаНач, &ДатаКон, День, , ) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты
ИТОГИ ПО
ОБЩИЕ,
Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНач, &ДатаКон),
Контрагент,
ДоговорКонтрагента
Но что делать когда необходимо их получить во вложенном запросе, или посчитать количество дней с отрицательными остатками?
Предлагаю следующий вариант. Регистр сведений КурсыВалют должен быть заполнен всеми днями.
ВЫБРАТЬ
Дебиторка.СуммаВзаиморасчетовКонечныйОстаток КАК Долг,
КурсыВалют.Период КАК Период,
Дебиторка.ДоговорКонтрагента КАК ДоговорКонтрагента,
Дебиторка.ДоговорКонтрагента.Владелец КАК Контрагент,
ВЫБОР
КОГДА Дебиторка.СуммаВзаиморасчетовКонечныйОстаток < 0
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ КАК КвоОтрицательных
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
Оборот1.Дата КАК ДатаС,
МИНИМУМ(ВЫБОР
КОГДА Оборот2.Дата ЕСТЬ NULL
ТОГДА КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)
ИНАЧЕ КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(Оборот2.Дата, ДЕНЬ, -1), ДЕНЬ)
КОНЕЦ) КАК ДатаПо,
Оборот1.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,
Оборот1.ДоговорКонтрагента КАК ДоговорКонтрагента
ИЗ
(ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Дата,
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода,
&КонецПериода, День, , {(ДоговорКонтрагента.Организация).* КАК Организация, (ДоговорКонтрагента.Владелец).* КАК Контрагент, (ДоговорКонтрагента).*})
КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты) КАК Оборот1
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Дата,
ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , {(ДоговорКонтрагента.Организация).* КАК Организация, (ДоговорКонтрагента.Владелец).* КАК Контрагент, (ДоговорКонтрагента).*}) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты) КАК Оборот2
ПО Оборот1.Дата < Оборот2.Дата
И Оборот1.ДоговорКонтрагента = Оборот2.ДоговорКонтрагента
СГРУППИРОВАТЬ ПО
Оборот1.Дата,
Оборот1.СуммаВзаиморасчетовКонечныйОстаток,
Оборот1.ДоговорКонтрагента) КАК Дебиторка
ПО (КурсыВалют.Период МЕЖДУ Дебиторка.ДатаС И Дебиторка.ДатаПо)
ГДЕ
КурсыВалют.Период МЕЖДУ &НачалоПериода И &КонецПериода
И КурсыВалют.Валюта = &Валюта
ИТОГИ
СУММА(Долг),
СУММА(КвоОтрицательных)
ПО
ОБЩИЕ,
Контрагент,
ДоговорКонтрагента,
Период
АВТОУПОРЯДОЧИВАНИЕ
Заметьте, что в итогах для слова Период нет дополнения.