Имя: Пароль:
1C
1С v8
Выбрать предыдущую запись в запросе
0 alexmobile
 
03.09.15
07:08
Из таблицы выбираются значения на определенные даты, если значение не задано на дату, то брать предыдущее. Не могу сообразить как составить запрос.
пример:
Дата,код инструмента, значение
01.01.2015, Инстр1, 100
01.01.2015, Инстр2, 500
02.01.2015, Инстр1, 1000
02.01.2015, Инстр2, 0

нужно на 02.01.2015 для инстр2 получить с даты 01.01.2015, т.е. 500
1 Маратыч
 
03.09.15
07:10
(0) Что за таблица-то? Если РС, то СрезПоследних(), если что-то другое, тупо отбирай Значение>0
2 Брегорьян
 
03.09.15
07:10
делай лучше потом
3 alexmobile
 
03.09.15
07:14
(1) внешние данные
4 Cyberhawk
 
03.09.15
07:14
Выбираешь всю таблицу с доп. полем: где значение не задано, там в доп. поле пишешь 0, где задано - 1. Далее выбираешь первые 1 с условием на доп. поле ( = 1)
5 Cyberhawk
 
03.09.15
07:15
Либо изначально отбираешь по значению, как в (1), и группируешь по инструменту и максимуму периода
6 alexmobile
 
03.09.15
15:25
(5) не пойдет.
вот кусок таблицы:
CodeInstr    Date    Среднее    ГодНазад
A592UFM060F    26.12.2014 0:00:00    31 404    
A592UFM060F    09.01.2015 0:00:00        29 200
A592UFM060F    10.01.2015 0:00:00        29 200
A592UFM060F    12.01.2015 0:00:00    31 529    
A592UFM060F    13.01.2015 0:00:00    31 400    29 200
A592UFM060F    14.01.2015 0:00:00    31 300    29 264
A592UFM060F    15.01.2015 0:00:00    31 000    29 396
A592UFM060F    16.01.2015 0:00:00    31 000    29 413
A592UFM060F    17.01.2015 0:00:00        29 559
A592UFM060F    19.01.2015 0:00:00    30 500    
A592UFM060F    20.01.2015 0:00:00    29 500    29 614
A592UFM060F    21.01.2015 0:00:00    29 200    30 099
A592UFM060F    22.01.2015 0:00:00    28 135    30 730
A592UFM060F    23.01.2015 0:00:00    28 000    31 244
A592UFM060F    24.01.2015 0:00:00        31 167
A592UFM060F    26.01.2015 0:00:00    28 000    
A592UFM060F    27.01.2015 0:00:00    28 400    31 150
A592UFM060F    28.01.2015 0:00:00    28 180    31 150
A592UFM060F    29.01.2015 0:00:00    28 000    31 000
A592UFM060F    30.01.2015 0:00:00    28 000    31 039
A592UFM060F    31.01.2015 0:00:00        31 054
A592UFM060F    02.02.2015 0:00:00    28 000    
A592UFM060F    03.02.2015 0:00:00    27 650    31 092
A592UFM060F    04.02.2015 0:00:00    28 217    31 147
A592UFM060F    05.02.2015 0:00:00    28 587    31 045
A592UFM060F    06.02.2015 0:00:00    28 524    31 097
в колонку среднее на дату 09.01 и 10.01 должно встать 31404, на дату 17.01 31 000, 24.01 28 000 и т.д.
7 Cyberhawk
 
03.09.15
17:13
Не понял. Входную таблицу твою вижу. Часть примера вижу. Но не понял, как формируется выходная таблица? Почему даты выборочно берешь? Нарисуй, какой должна быть выходная таблица и опиши правила ее формирования до конца
8 Nuobu
 
03.09.15
17:24
(6) Разбей свою таблицу на две таблички, заполненную датами и не заполненную и сделай как в ссылке.
Книга знаний: Срез последних на каждую дату в запросе
9 AndreYAN
 
03.09.15
17:25
Итоги по датам не предлагали?
10 Nuobu
 
03.09.15
17:26
(9) Ха, поздно.
11 AndreYAN
 
03.09.15
17:33
Запрос = Новый Запрос("ВЫБРАТЬ
                      |    ИсточникДанных.Дата КАК Дата,
                      |    ИсточникДанных.Номенклатура КАК Номенклатура,
                      |    ИсточникДанных.Количество КАК Количество
                      |ИЗ Данные КАК ИсточникДанных
                      |ИТОГИ
                      |    СУММА(Количество)
                      |ПО
                      |    Дата");

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДата = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ПредыдущееКоличество = 0;

Пока ВыборкаДата.Следующий() Цикл
    ВыборкаДетальныеЗаписи = ВыборкаДата.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        ПредыдущееКоличество = ВыборкаДетальныеЗаписи.Количество;
    КонецЦикла;
    
КонецЦикла;
12 alexmobile
 
04.09.15
07:27
(11) в СКД хотелось-бы. Такой уж вариант думал, но на крайний случай.
13 alexmobile
 
04.09.15
07:27
(8) срезы актуальны для регистров. нет?
14 Sewace
 
04.09.15
08:38
Итак, нужно выбрать предыдущую строку в выборке.
Значит:
1. Есть точное условие сортировки.
2. Есть возможность, наложив условие, выбрать текущую запись.

Делал бы так:

ВЫБРАТЬ ПЕРВЫЕ 2
   ....
ПОМЕСТИТЬ ВремТЗ
ИЗ
  ...
ГДЕ
  <условие на текущую запись>
УПОРЯДОЧИТЬ ПО
<порядок в одну сторону>;

ВЫБРАТЬ ПЕРВЫЕ 1
ИЗ
  ВремТЗ
УПОРЯДОЧИТЬ ПО <порядок в другую сторону>
2 + 2 = 3.9999999999999999999999999999999...