Имя: Пароль:
1C
1С v8
Помогите с запросом - очередные остатки на каждую дату
0 D_Sergeevich
 
17.03.15
15:27
Есть справочник Договора в нем есть ТЧ с графиком погашения, такой вот запрос выбирает суммы погашений по графику (ПогашениеПлан)

ВЫБРАТЬ
    СУММА(ДоговорыГрафикПогашения.СуммаПлатежа) КАК ПогашениеПлан,
    НАЧАЛОПЕРИОДА(ДоговорыГрафикПогашения.ДатаПлатежа, МЕСЯЦ) КАК Период,
    ДоговорыГрафикПогашения.Ссылка.ИсточникКредитования КАК Группа
ИЗ
    Справочник.Договоры.ГрафикПогашения КАК ДоговорыГрафикПогашения
ГДЕ
    ДоговорыГрафикПогашения.ДатаПлатежа МЕЖДУ &НачПериода И &КонПериода
    И ДоговорыГрафикПогашения.Ссылка.ПометкаУдаления = ЛОЖЬ

СГРУППИРОВАТЬ ПО
    ДоговорыГрафикПогашения.Ссылка.ИсточникКредитования,
    НАЧАЛОПЕРИОДА(ДоговорыГрафикПогашения.ДатаПлатежа, МЕСЯЦ)

ДоговорыГрафикПогашения.Ссылка - это сам договор. Мне нужно чтобы на каждый Период делалась проверка задолженности в регистре накопления.

Например: если формировать этот запрос за год, то нужно чтобы каждый месяц (январь, февраль и т.д.) проверялось есть задолженность по данному договору в этом месяце, если она есть то ПогашениеПлан добавлять если нет то нет.
Я не знаю как добавить условие к ПогашениеПлан Условие должно делать запрос в регистр накопления.

Надеюсь вы хоть немножко уловили суть задачи. Если есть вопросы задавайте.
Благодарю за помощь.
1 Адский плющ
 
17.03.15
15:30
"Если есть вопросы задавайте."

А какой вопрос?
2 D_Sergeevich
 
17.03.15
15:33
(1) Как сделать проверку на задолженность по каждому договору между &НачПериода И &КонПериода помесячно?
3 Nuobu
 
17.03.15
15:36
(2) Погугли Остатки на дату из запроса.
4 D_Sergeevich
 
17.03.15
15:40
(3) А хоть какой то пример рабочий есть?
5 Nuobu
 
17.03.15
15:46
6 DirecTwiX
 
17.03.15
15:48
Что-нибудь вроде этого?
Выбрать
   ОстаткиОбороты.Период,
   ОстаткиОбороты.Контрагент,
   ОстаткиОбороты.Договор
ИЗ
  ОстаткиОбороты
  Внутреннее соединение ПланПогашение
     По (Период,Контрагент,Договор)
Где
   ОстаткиОбороты.СуммаКонечныйОстаток < 0

И сгруппировать
7 D_Sergeevich
 
17.03.15
15:52
(5) А зачем мне нарастающие итоги?
Ладно щас буду пробовать что то на подобие (6)
8 fishb1
 
17.03.15
16:22
Если дискретность 1 месяц, что если так:
...
ЛЕВОЕ СОЕДИНЕНИЕ
    ВЫБРАТЬ
    ОстаткиЗадолженности.СуммаКонечныйОстаток,
    ОстаткиЗадолженности.Период
    ИЗ
        ОстаткиЗадолженности.ОстаткиИОбороты(&НачПериода, &КопПериода, Месяц,,) КАК ОстаткиЗадолженности
ГДЕ
    ОстаткиЗадолженности.СуммаКонечныйОстаток <> 0
    ПО
НАЧАЛОПЕРИОДА(ДоговорыГрафикПогашения.ДатаПлатежа, МЕСЯЦ) = ОстаткиЗадолженности.Период
9 D_Sergeevich
 
17.03.15
16:29
(8) А если в каком то периоде движений не было, оно проверит остаток?
10 fishb1
 
17.03.15
16:50
(9) Проверит, конечно. Ну если не было движений, то просто СуммаНачальныйОстаток = СуммаКонечныйОстаток. Это виртуальные ресурсы Суммы, которые доступны для запроса при использовании периодичности.
11 alle68
 
17.03.15
17:02
(10) Ошибаешься...
12 D_E_S_131
 
17.03.15
17:08
(10) Ничего не выйдет. Придется выбирать нач.остаток, потом движения с периодами, потом соединять по условию "ДатаДвижения <= ДатаГрафика" с суммированием и вычислением конечного остатка как НачОст + Приход - Расход. "Остаток товара по дням" - вечная тема.
13 fishb1
 
17.03.15
19:26
Видимо я не совсем понял суть.

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

УПОРЯДОЧИТЬ ПО
    ИсточникКредитования,
    Период

Выбранных полей достаточно, чтобы построить какую угодно логику.

Естественно, если в выборке будут задействован список договоров по какому-либо условию, то неплохо было бы собрать ссылки на договора во временную таблицу для проверки вхождения измерения Договор (если я правильно понял структуру регистра и он у вас есть) перед соединением.
14 hhhh
 
17.03.15
19:34
(13) она не выдаст у вас все месяцы, а только те месяцы, которые в графике.
15 fishb1
 
17.03.15
20:07
(14)

1) Это несложно исправить
2) Пусть заполняют все нужные месяцы в графике
2) Изначально мы отталкивались запроса к графику и прикручивания к нему суммы долга из регистра. Задачи выводить все месяцы входящие в период, отсутствующие в графике, в ТЗ не было. :)
16 D_Sergeevich
 
18.03.15
10:29
Так. Начал я с получения остатков на каждый месяц.
Вот запрос, если движений в периоде не было но остаток не равен 0 то договор попадает, а вот если остаток равен 0 то не попадает. Как сделать чтоб попадал даже с нулевым остатком?

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&НачПериода, МЕСЯЦ, Цифры4.Цифра * 1000 + Цифры3.Цифра * 100 + Цифры2.Цифра * 10 + Цифры1.Цифра * 1) КАК Период
ПОМЕСТИТЬ ВТ_Календарь
ИЗ
    (ВЫБРАТЬ
        0 КАК Цифра
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        1
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        2
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        3
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        4
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        5
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        6
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        7
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        8
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        9) КАК Цифры1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            0 КАК Цифра
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            1
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            2
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            3
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            4
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            5
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            6
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            7
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            8
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            9) КАК Цифры2
        ПО (Цифры2.Цифра * 10 + Цифры1.Цифра * 1 <= РАЗНОСТЬДАТ(&НачПериода, &КонПериода, МЕСЯЦ))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            0 КАК Цифра
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            1
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            2
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            3
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            4
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            5
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            6
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            7
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            8
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            9) КАК Цифры3
        ПО (Цифры3.Цифра * 100 + Цифры2.Цифра * 10 + Цифры1.Цифра * 1 <= РАЗНОСТЬДАТ(&НачПериода, &КонПериода, МЕСЯЦ))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            0 КАК Цифра
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            1
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            2
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            3
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            4
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            5
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            6
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            7
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            8
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            9) КАК Цифры4
        ПО (Цифры4.Цифра * 1000 + Цифры3.Цифра * 100 + Цифры2.Цифра * 10 + Цифры1.Цифра * 1 <= РАЗНОСТЬДАТ(&НачПериода, &КонПериода, МЕСЯЦ))
;

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

СГРУППИРОВАТЬ ПО
    ОборотыПоКонтрагентамОстаткиИОбороты.Договор,
    ВТ_Календарь.Период

УПОРЯДОЧИТЬ ПО
    Договор,
    Период
АВТОУПОРЯДОЧИВАНИЕ
17 К_Дач
 
18.03.15
10:35
Вот запрос получения остатков товаров по складам на каждый день из выбранного интервала. Из курса "Запросы" 1с-курсы


ВЫБРАТЬ
    0 КАК Цифра
ПОМЕСТИТЬ ВТ_Цифры

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    9
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&Дата1, ДЕНЬ, ВТ_Цифры.Цифра + 10 * ВТ_Цифры1.Цифра) КАК Поле1
ПОМЕСТИТЬ ВТ_Даты
ИЗ
    ВТ_Цифры КАК ВТ_Цифры
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Цифры КАК ВТ_Цифры1
        ПО (ИСТИНА)
ГДЕ
    ДОБАВИТЬКДАТЕ(&Дата1, ДЕНЬ, ВТ_Цифры.Цифра + 10 * ВТ_Цифры1.Цифра) МЕЖДУ &Дата1 И &Дата2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТоварыНаСкладахОстаткиИОбороты.Период,
    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
    ТоварыНаСкладахОстаткиИОбороты.Склад,
    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК Остаток
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&Дата1, &Дата2, День, , Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстаткиИОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Остатки.Период КАК Период,
    МИНИМУМ(ВЫБОР
            КОГДА КОНЕЦПЕРИОДА(ВТ_Остатки1.Период, ДЕНЬ) = &Дата2
                ТОГДА &Дата2
            ИНАЧЕ ДОБАВИТЬКДАТЕ(ВТ_Остатки1.Период, СЕКУНДА, -1)
        КОНЕЦ) КАК Период1,
    ВТ_Остатки.Номенклатура КАК Номенклатура,
    ВТ_Остатки.Склад КАК Склад,
    ВТ_Остатки.Остаток
ПОМЕСТИТЬ ВТ_ОстаткиИнтервалами
ИЗ
    ВТ_Остатки КАК ВТ_Остатки
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки1
        ПО ВТ_Остатки.Номенклатура = ВТ_Остатки1.Номенклатура
            И ВТ_Остатки.Склад = ВТ_Остатки1.Склад
            И ВТ_Остатки.Период < ВТ_Остатки1.Период

СГРУППИРОВАТЬ ПО
    ВТ_Остатки.Склад,
    ВТ_Остатки.Номенклатура,
    ВТ_Остатки.Период,
    ВТ_Остатки.Остаток
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Даты.Поле1 КАК Дата,
    ВТ_ОстаткиИнтервалами.Номенклатура КАК Номенклатура,
    ВТ_ОстаткиИнтервалами.Склад КАК Склад,
    ВТ_ОстаткиИнтервалами.Остаток
ИЗ
    ВТ_ОстаткиИнтервалами КАК ВТ_ОстаткиИнтервалами
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Даты КАК ВТ_Даты
        ПО (ВТ_Даты.Поле1 МЕЖДУ ВТ_ОстаткиИнтервалами.Период И ВТ_ОстаткиИнтервалами.Период1)

УПОРЯДОЧИТЬ ПО
    Номенклатура,
    Склад,
    Дата
18 тарам пам пам
 
18.03.15
11:23
(17) Запрос в таком виде будет работать только на периоде менее 100 дней. Для общего случая - надо либо добавить пару лишних соединений в запросе ВТ_Даты, либо формировать текст запроса динамически.