Имя: Пароль:
1C
1С v8
Запрос - как правильней сделать?
0 Gangar
 
27.03.15
12:43
Доброго дня, уважаемые.
Есть задачка такая: два оборотных регистра План и Факт, измерения у них идентичные.
Надо получить на выходе таблицу с Дата1 по Дата2 таким образом, что б в ней, при отсутствии движений по регистрам, поля заполнялись 0.
Пробовал вложенный запрос, с соединениями, с виртуальной таблицей - в таблицу попадают только периоды, по которым есть движения.

Подскажите, как быть?
1 alex_shkut
 
27.03.15
12:48
Угадай с одного раза - почему тебя игнорят?
Книга знаний: Срез последних на каждую дату в запросе
2 Gangar
 
27.03.15
12:52
(1) казалось бы - при чем тут СрезПоследних() и Регистр сведений?
3 smitru
 
27.03.15
12:52
(0)" что б в ней, при отсутствии движений по регистрам, поля заполнялись 0. "

IsNull(Сумма,0) - тебе в помощь
4 Gangar
 
27.03.15
12:54
(3) как это поможет, когда за период не было никаких движений?
5 palpetrovich
 
27.03.15
12:57
че тут думать, выборка по дням из периода, в ней запрос :)
6 Gangar
 
27.03.15
12:58
(5) Запрос в цикле?!
7 Ненавижу 1С
 
гуру
27.03.15
12:58
я бы предложил объединение во временной таблице, а потом ее сгруппировать

работает быстрее чем полное соединение
8 palpetrovich
 
27.03.15
12:59
(6) канешн :)
9 Gangar
 
27.03.15
13:00
(7) Во временной таблице беда с ИТОГИ ПО .. ПЕРИОДАМИ
(8) А вы знаете толк :)
10 palpetrovich
 
27.03.15
13:04
(9) пятницо :)
11 palpetrovich
 
27.03.15
13:07
(9) скачай отсюда http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=602811  - ОстаткиПоДням.erf  
там можно подсмотреть как в запросе организовать таллицу дат, к которой потом прикрутить остатки
12 smitru
 
27.03.15
13:09
(4) "как это поможет, когда за период не было никаких движений?"

Только это и спасает. Так как движений нет, то результат - NULL, а чтобы преобразовать NULL в "ноль" и используется функция ISNULL(Поле1,0)

ПыСы.. Только нужно при этом регистр остатков в соединении с другой таблицей с "левым соединением" (или с правым, в зависимости от написания запроса)
13 anaed
 
27.03.15
13:09
(0)
1) строишь таблицу дат
2) объединяешь полным соединением или как в (7) указано свои план и факт
3) соединяешь таблицу дат с объединенной таблицей план/факта
4) не забываешь естьnull'ить
14 smitru
 
27.03.15
13:20
(13) "объединяешь полным соединением "

С дуба рухнул такие советы давать?
15 Gangar
 
27.03.15
15:06
что-то не выходит каменный цветок...
смотрю в конфигураторе и консоли - отдельно периоды и отдельно данные
16 smitru
 
27.03.15
15:27
(15) Тебе уже сказали.
1. Получи отдельно таблицу с датами и запихни её во временную таблицу (но это не тривиальная задачка, нужны навыка проганья на сиквеле)
2. Вяжешь левым соединением эту таблицу с датами с оборотным регистром, где сумму регистра запихиваешь в функцию isnull
3. Группируешь полученный запрос по датам, а поле сумм - суммируешь.

ПыСы.. Только не забудь, чтобы "приход" у тебя был с плюсом, а "расход" с минусом перед суммированием
17 Gangar
 
27.03.15
17:39
Всем спасибо, все получилось.
Для упрощения получения даты взял РАЗЛИЧНЫЕ ПЕРИОД из оборотного регистра, в котором движения есть каждый день.
18 palpetrovich
 
27.03.15
17:56
(17) хе, а вдруг завтра не будтет там движения?
и че, код из (11) такой уж трудный? :)

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, 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 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
19 fisher
 
27.03.15
18:03
(18) Без временной таблицы - да. Гораздо внушительней выглядит.
20 Drac0
 
27.03.15
18:06
(0) Используй:

|ИТОГИ
|    МАКСИМУМ(Сумма)
|ПО
|    Дата ПЕРИОДАМИ(ДЕНЬ, &Начало, &Конец),
|    Валюта


Обходи правильно:

пВыборкаДень= Запрос.Выполнить.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Дата", "Все")
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.