Имя: Пароль:
1C
1С v8
v8: Запрос по регистру сведений: значение на каждую дату
0 oleg_prg
 
07.06.12
17:32
Добрый день. Люди добрые, помогите решить задачку.
Необходимо с помощью запроса получить курсы валют на КАЖДЫЙ день, вне зависимости от того было движение по запросу или нет. БЕЗ СКД, только запросом, СКД использоваться не будет - такое условие.

Надо получить такой результат
Валюта День          Курс
USD      01/01/12     35
USD      01/02/12     35
USD      01/03/12     35
USD      01/04/12     36
USD      01/05/12     36
USD      01/07/12     37
USD      01/08/12     37
USD      01/09/12     37

Но в регистре сведений есть движения только такие
Валюта День          Курс
USD      01/01/12     35
USD      01/04/12     36
USD      01/07/12     37

Заранее благодарен!




Вот то что у меня получилось на текущий момент

Идея такая - создать таблицу с датами и по датам получать результат регистра сведений

//Таблица с датами
ВЫБРАТЬ
   ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, Основа.НомерДняВПериоде) КАК Дата
ПОМЕСТИТЬ ТабДата
ИЗ
   (ВЫБРАТЬ
       1000 * (База1.Б1 - 1) + 100 * (База2.Б2 - 1) + 10 * (База3.Б3 - 1) + (База4.Б4 - 1) КАК НомерДняВПериоде
   ИЗ
       (ВЫБРАТЬ
           1 КАК Б1
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           2
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           3
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           4
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           5
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           6
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           7
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           8
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           9
       
       ОБЪЕДИНИТЬ
       
       ВЫБРАТЬ
           10) КАК База1
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               1 КАК Б2
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               4
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               5
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               6
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               7
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               8
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               9
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               10) КАК База2
           ПО (ИСТИНА)
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               1 КАК Б3
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               4
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               5
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               6
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               7
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               8
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               9
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               10) КАК База3
           ПО (ИСТИНА)
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               1 КАК Б4
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               2
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               3
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               4
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               5
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               6
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               7
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               8
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               9
           
           ОБЪЕДИНИТЬ
           
           ВЫБРАТЬ
               10) КАК База4
           ПО (ИСТИНА)) КАК Основа
;



ВЫБРАТЬ
   ТабДата.Дата КАК ДАТА1,
   КурсыВалют.Курс
ИЗ
   ТабДата КАК ТабДата
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
       ПО ТабДата.Дата = КурсыВалют.Период
1 DrShad
 
07.06.12
17:33
в книгу знаний там это уже давно все решено
2 shuhard
 
07.06.12
17:33
(0) читай классиков
в разделе книги знаний есть высоконаучная статья Срез последних на каждую дату
3 andrewks
 
07.06.12
17:36
лень читать длинный код.

формирование таблицы дат:

v8: Как в запросе выбрать все даты входящие в указанный период?

а дальше соединение с РС, и вперёд
4 DrShad
 
07.06.12
17:38
(3) ну выбрать даты он осилил, а вот соединить с РС не смог
5 andrewks
 
07.06.12
17:45
(4)ну, наверное, ему надо смотреть в сторону СрезПоследних
6 oleg_prg
 
07.06.12
17:48
Спасибо за совет, по поводу статьи "Срез последних на каждую дату" - читат, гуглил, я же говорю не получается, проблема в том, что я не могу понять как объединить эти таблицы, в 1С8 новичок. Если можно помогите конкретным кодом по этой задаче.
7 oleg_prg
 
07.06.12
17:49
В запросе СрезПоследних может принять лишь дату из параметра например &Дата1, поэтому срезПоследних неподходит, надо как то с МАКСИМУМ и запрос в запросе, ч-з левое соединение, но как - не могу сообразить
8 shuhard
 
07.06.12
17:49
(6) чё то ты гонишь,
в статье готовый код, который ни с чем соединять не надо
9 andrewks
 
07.06.12
17:54
(7) чё-чё?
10 oleg_prg
 
07.06.12
17:57
я реально брал код из статьи, правил в консоли запросов, получил только последние курсы, таблицы дат не было.
11 oleg_prg
 
07.06.12
17:58
Я же говорю, форум для меня это крайний случай, обычно сам все раскапываю, а с этой задачей сижу туплю, незнаю как сделать... Кому не влом, помогите плиз рабочим кодом. Надеюсь на понимание
12 shuhard
 
07.06.12
18:00
(11) ещё раз
код в статье рабочий, проверенный тысячи раз
13 oleg_prg
 
07.06.12
18:02
ВотВЫБРАТЬ
Таблица3.Курс,
Таблица3.Валюта,
Таблица3.Период
ИЗ
(ВЫБРАТЬ
 Таблица1.Валюта КАК Валюта,
 МАКСИМУМ(Таблица1.Период) КАК Период
ИЗ
 РегистрСведений.КурсыВалют КАК Таблица1
ГДЕ
 Таблица1.Период <= &КонецПериода
СГРУППИРОВАТЬ ПО
 Таблица1.Валюта) КАК Таблица2
 ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Таблица3
 ПО Таблица2.Валюта= Таблица3.Валюта
  И Таблица2.Период = Таблица3.Период
14 oleg_prg
 
07.06.12
18:02
Это код? Или я чет путаю?
15 oleg_prg
 
07.06.12
18:03
Именно его я брал за основу из статьи, не получилось, в консоли запросов получил последние курсы на &КонецПериода
16 oleg_prg
 
07.06.12
18:03
т.е. такого результата не получил
Валюта День          Курс
USD      01/01/12     35
USD      01/02/12     35
USD      01/03/12     35
USD      01/04/12     36
USD      01/05/12     36
USD      01/07/12     37
USD      01/08/12     37
USD      01/09/12     37
17 andrewks
 
07.06.12
19:18
(15) не так соединил, значит. у тебя должно быть соединение двух таблиц - таблицы-результата вложенного запроса с таблицей регистра курсов.

во вложенном запросе - соединение таблицы дат с таблицей регистра курсов с группировкой и максимумом, в выхлопе ты должен получить для каждой заданной даты - дату установки курса
18 andrewks
 
07.06.12
19:24
вот примерно так должен выглядеть вложенный запрос:


select
Даты.Дата as Дата
,ТабКурсов.Валюта as Валюта
,max(ТабКурсов.Период) as Период
from
Даты
left join
РегистрСведений.КурсыВалют as ТабКурсов
on
(ТабКурсов.Валюта=&ВыбВалюта) and (ТабКурсов.Период<=Даты.Дата)
group by
 Даты.Дата
,ТабКурсов.Валюта


в итоге ты будешь иметь соответствие, что, например, курс, действующий на дату Дата1, установлен в день Дата2

ну, а дальше - дело техники, соединить с регистром и выцепить из этой даты курс
19 andrewks
 
07.06.12
19:29
короче, вот:


select
0 as num
into digits
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(&НачДата,day,digits1.num+10*digits2.num+100*digits3.num+1000*digits4.num) as Дата
into Даты
from
digits as digits1
,digits as digits2
,digits as digits3
,digits as digits4
where (dateadd(&НачДата,day,digits1.num+10*digits2.num+100*digits3.num+1000*digits4.num)<=&КонДата)
index by Дата

;

select
КурсыВалютВспомогат.Дата as Дата
,КурсыВалют.Валюта as Валюта
,КурсыВалют.Курс as Курс
from

(
select
Даты.Дата as Дата
,КурсыВалют.Валюта as Валюта
,max(КурсыВалют.Период) as Период
from
Даты
left join
РегистрСведений.КурсыВалют as КурсыВалют
on
(КурсыВалют.Валюта=&ВыбВалюта) and (КурсыВалют.Период<=Даты.Дата)
group by
 Даты.Дата
,КурсыВалют.Валюта
)

as КурсыВалютВспомогат
left join
РегистрСведений.КурсыВалют as КурсыВалют
on (КурсыВалют.Валюта=КурсыВалютВспомогат.Валюта) and (КурсыВалют.Период=КурсыВалютВспомогат.Период)
order by
Дата, Валюта, Курс
20 oleg_prg
 
07.06.12
20:09
andrewks Спасибо тебе ОГРОМНОЕ!!! Именно так!
21 SnarkHunter
 
07.06.12
20:30
22 PiVa123
 
07.06.12
20:36
> БЕЗ СКД, только запросом, СКД использоваться не будет - такое условие.

Видима было страшно начинать, тем более из СКД получать таблицу значений.
23 oleg_prg
 
10.06.12
21:55
Ну сложно мне даются запросы, что поделать. 12 лет отработал с 1С7.7, теперь вот осваиваю 1с8.х, мозг заточился в другую сторону... Работаю один, на курсах не был, читаю статьи в инете, смотрю видеоуроки, рядом нет знакомых или кого бы можно было спросить, все осваиваю сам... По поводу СКД, прикол в том что на СКД я это сделал. Спасибо всем за участие )))