Имя: Пароль:
1C
1С v8
Запрос. Дополнить датами.
,
0 Mustang
 
19.05.15
10:09
Привожу на простом примере задачу:

Есть элемент справочника "Яблоко" с реквизитами "Начальная дата" - 01.01.2015, "Конечная дата" - 03.01.2015.
Как в запросе получить следующее:

|01.01.2015 Яблоко
|02.01.2015 Яблоко
|03.01.2015 Яблоко

Подскажите, как решить такую задачу?
1 ДенисЧ
 
19.05.15
10:10
Сделать табличку со всеми нужными датами и соединить с твоей
2 patria0muerte
 
19.05.15
10:11
Либо создать таблицу дат и соединиться с ней, либо, если это СКД - использовать дополнение периода в настройках отчета..
3 Mustang
 
19.05.15
10:13
Вариант с таблицей понял. Запросом таблицу дат можно получить?
4 patria0muerte
 
19.05.15
10:14
(3) Если есть РС ПроизводственныйКалендарь - то можешь с ним соединиться... а так вроде тоже какие то методы извращенские были...
5 patria0muerte
 
19.05.15
10:16
6 patria0muerte
 
19.05.15
10:16
+(5) Коммент №9
7 ХардHard
 
19.05.15
10:17
(3) 1.Надо получить временную таблицу 1..31
2.Получить таблицу 1..12
3.Получить таблицу годов , которые есть у тебя в периоде
4.Получить все возможные даты.
5.Отобрать их по заданному периоду.
8 xaozai
 
19.05.15
10:18
Все даты:
          ВЫБРАТЬ
     ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, 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 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
9 xaozai
 
19.05.15
10:20
(0)+(8) Всё можно сделать одним запросом.
10 GROOVY
 
19.05.15
10:24
Если нужно выводить даты, те которые в запрос не вошли, можно использовать ИТОГИ ПЕРИОДАМИ.
В СКД есть свойства группировки ДОПОЛНЕНИЕ.

А так, уже сотни тем про это написаны.
11 Mustang
 
19.05.15
10:24
Всем спасибо.
12 xaozai
 
19.05.15
10:30
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2015, 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 <= РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2015, 1, 1), ДАТАВРЕМЯ(2015, 1, 31), ДЕНЬ)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    "Яблоко" КАК Предмет,
    ДАТАВРЕМЯ(2015, 1, 1) КАК НачальнаяДата,
    ДАТАВРЕМЯ(2015, 1, 3) КАК КонечнаяДата
ПОМЕСТИТЬ Яблоки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВсеДни.Период,
    Яблоки.Предмет
ИЗ
    Яблоки КАК Яблоки
        ЛЕВОЕ СОЕДИНЕНИЕ ВсеДни КАК ВсеДни
        ПО (ВсеДни.Период >= Яблоки.НачальнаяДата)
            И (ВсеДни.Период <= Яблоки.КонечнаяДата)
13 lucifer
 
19.05.15
10:40
(8) это что O.o
14 xaozai
 
19.05.15
10:47
(13) Можно скопировать в консоль запросов и посмотреть...
15 Mustang
 
19.05.15
11:13
"Select
    |    0 as value
    |    
    |Into
    |    tTable
    |    
    |Union
    |Select
    |    1
    |    
    |Union
    |Select
    |    2
    |    
    |Union
    |Select
    |    3
    |    
    |Union
    |Select
    |    4
    |    
    |Union
    |Select
    |    5
    |    
    |Union
    |Select
    |    6
    |    
    |Union
    |Select
    |    7
    |    
    |Union
    |Select
    |    8
    |    
    |Union
    |Select
    |    9
    |    
    |    
    |    
    |;
    |Select
    |    DateAdd(&Begin, Day, second.value * 1000 + minute.value * 100 + hour.value * 10 + day.value) as Period
    |    
    |From
    |    tTable as second,
    |    tTable as minute,
    |    tTable as hour,
    |    tTable as day
    |"

Так будет короче код.
16 Web00001
 
19.05.15
11:28
Если есть типовая и там есть заполненный календарь можно просто брать оттуда :)