Имя: Пароль:
1C
1С v8
В запросе заполнить пустые значения последним значением по периоду
, , ,
0 smartu
 
12.03.15
16:48
Есть временная таблица:

01.01.2014 0:00:00    100
01.02.2014 0:00:00    Null
01.03.2014 0:00:00    Null
01.04.2014 0:00:00    Null
01.05.2014 0:00:00    150
01.06.2014 0:00:00    200
01.07.2014 0:00:00    Null
01.08.2014 0:00:00    Null
01.09.2014 0:00:00    Null
01.10.2014 0:00:00    Null
01.11.2014 0:00:00    Null
01.12.2014 0:00:00    Null


подскажите, как ее в запросе привести к виду:

01.01.2014 0:00:00    100
01.02.2014 0:00:00    100
01.03.2014 0:00:00    100
01.04.2014 0:00:00    100
01.05.2014 0:00:00    150
01.06.2014 0:00:00    200
01.07.2014 0:00:00    200
01.08.2014 0:00:00    200
01.09.2014 0:00:00    200
01.10.2014 0:00:00    200
01.11.2014 0:00:00    200
01.12.2014 0:00:00    200


т.е. заменить null последним значением по периоду.
1 Napalmmm
 
12.03.15
16:55
Может быть так?
Для Сч = 0 По ВременнаяТаблица.Количество() Цикл
    Если ВременнаяТаблица[Сч].<СтрокаСКоличеством> = Null Тогда
           ВременнаяТаблица[Сч].<СтрокаСКоличеством> = ВременнаяТаблица[Сч-1].<СтрокаСКоличеством>
    КонецЕсли;
КонецЦикла;

При условии, что первая строка <> Null
2 Napalmmm
 
12.03.15
16:55
(1) КолонкаСКоличеством*
3 Napalmmm
 
12.03.15
16:57
(1) Для Сч = 0 По ВременнаяТаблица.Количество()-1 Цикл
Еще один мой косяк
4 smartu
 
12.03.15
16:57
необходимо инструментами запроса.
5 smartu
 
12.03.15
16:58
необходимо соединение, условие связи не пойму какое нужно
6 Napalmmm
 
12.03.15
16:58
(4) Извини, туплю
Вариант: выгрузить запрос в тз, дозаполнить значениями и "вернуться" в запрос с уже заполненной тз не подходит?
7 smartu
 
12.03.15
17:01
наверное не подойдет, отчет скд
8 alex_shkut
 
12.03.15
17:02
Посмотрите здесь, может что подойдет:
Книга знаний: Срез последних на каждую дату в запросе
9 Лефмихалыч
 
12.03.15
17:16
ВЫБРАТЬ
    ВТ.Дата,
    ВТ.Значение
ПОМЕСТИТЬ ВТ
ИЗ
    &ВТ КАК ВТ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Дата,
    ВТ.Значение
ПОМЕСТИТЬ ТолькоЗаполненные
ИЗ
    ВТ КАК ВТ
ГДЕ
    ВТ.Значение > 0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Дата,
    ВТ.Значение,
    ТолькоЗаполненные.Значение КАК Значение1
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ВТ.Дата КАК ОсновнаяДата,
            МАКСИМУМ(ТолькоЗаполненные.Дата) КАК ДатаМаксимум
        ИЗ
            ВТ КАК ВТ
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТолькоЗаполненные КАК ТолькоЗаполненные
                ПО ВТ.Дата >= ТолькоЗаполненные.Дата
        
        СГРУППИРОВАТЬ ПО
            ВТ.Дата) КАК ВЗ
            ЛЕВОЕ СОЕДИНЕНИЕ ТолькоЗаполненные КАК ТолькоЗаполненные
            ПО ВЗ.ДатаМаксимум = ТолькоЗаполненные.Дата
        ПО ВТ.Дата = ВЗ.ОсновнаяДата
10 Лефмихалыч
 
12.03.15
17:17
11 Крошка Ру
 
12.03.15
17:28
(9) Вложенный запрос - это зло. Особенно в соединениях
12 Nuobu
 
12.03.15
17:35
(11) А почему? Как тогда сделать срез последних на дату в запроса?
13 Nuobu
 
12.03.15
17:36
(12) запроса = запросе.
14 mikecool
 
12.03.15
17:38
(11) продолжайте так считать
15 Крошка Ру
 
12.03.15
17:39
(14) Так считаю не я
16 Nuobu
 
12.03.15
17:59
(15) А кто тогда? Фраза - Ваша.
17 vyaz
 
12.03.15
18:26
(16) Так считает оптимизатор сервера СУБД при построении плана запроса, скорее всего из-за Nested Loops
18 D_E_S_131
 
12.03.15
18:34
(12) Через временную таблицу, где будут предварительно выбраны значения для подстановки.
19 D_E_S_131
 
12.03.15
18:36
(18) По примеру того как получают запросом курс валюты на дату документа.
20 Nuobu
 
12.03.15
19:07
(19) (18) Как выбирают?
21 Nuobu
 
12.03.15
19:07
(20) Тоесть получают.
22 D_E_S_131
 
12.03.15
19:50

ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка КАК ДокСсылка,
    МАКСИМУМ(ДатыКурсовВалют.Период) КАК ДатаКурса,
    РеализацияТоваровУслуг.ВалютаДокумента
ПОМЕСТИТЬ ВТ_Данные
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК ДатыКурсовВалют
        ПО РеализацияТоваровУслуг.ВалютаДокумента = ДатыКурсовВалют.Валюта
            И РеализацияТоваровУслуг.Дата >= ДатыКурсовВалют.Период
ГДЕ
    РеализацияТоваровУслуг.Проведен
    И РеализацияТоваровУслуг.Дата МЕЖДУ &Дата1 И &Дата2

СГРУППИРОВАТЬ ПО
    РеализацияТоваровУслуг.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Данные.ДокСсылка,
    ЕСТЬNULL(КурсыВалют.Курс, 0) КАК Курс,
    ЕСТЬNULL(КурсыВалют.Кратность, 0) КАК Кратность
ИЗ
    ВТ_Данные КАК ВТ_Данные
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО ВТ_Данные.ВалютаДокумента = КурсыВалют.Валюта
            И ВТ_Данные.ДатаКурса = КурсыВалют.Период
23 D_E_S_131
 
12.03.15
19:53
(22) Обрати внимание, что в первом запросе условие по Периоду идет >= (все периоды загрузки курсов до даты документа, а из них ближайшая через МАКСИМУМ()), а во втором запросе условие по Периоду = (получаем конкретную запись регистра сведений).
24 Лефмихалыч
 
13.03.15
08:24
(11) категоричность суждений - признак поверхностности знаний предмета
25 D_E_S_131
 
13.03.15
09:59
(24) Некоторым нужно говорить "Делай так, а так не делай!", а углублять знание предмета только после оценки реакции.
1. "ОК, сделаю" — не углублять.
2. "А почему так не делать?" — углублять.
26 Крошка Ру
 
13.03.15
18:55
(24) Правильно говорить не "поверхностности", а "обширности".