Имя: Пароль:
1C
1С v8
Как получить курсы валют для документа
,
0 nikitas2020
 
12.12.20
23:03
Как запросом получить курсы валют для соответствующих документов. Курс может быть задан не на каждую дату: в примере нет курса USD на 03.01.2009, а документ есть. Должна получиться таблица Ссылка|Курс.

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

ИНДЕКСИРОВАТЬ ПО
    Валюта,
    ДатаКалендаря
1 H A D G E H O G s
 
12.12.20
23:19
Зачем производственный календарь?
2 RomanYS
 
12.12.20
23:31
О! Первый вопрос в ветке появился :) ТС как будто похвастаться пришел
3 H A D G E H O G s
 
12.12.20
23:46
(2) ТС как будто пытается лопнуть мои глазоньки
4 RomanYS
 
12.12.20
23:55
(3) Загадал ТС ребус :)) Зачем "на каждую дату" при условии РеализацияТоваровУслуг.Ссылка = &Ссылка?
5 youalex
 
12.12.20
23:58
Это бест-практикс?
6 RomanYS
 
12.12.20
23:59
(3) В соседней ветке вон гораздо интереснее: утверждается что кривоватый коррелированный запрос будет работать быстро.
Как в запросе выбрать ПЕРВЫЕ 1 для ЛЕВОЕ СОЕДИНЕНИЕ ?
Выскажешь мнение?
7 nikitas2020
 
13.12.20
00:04
Получилось вот так:
ВЫБРАТЬ
    ВложенныйЗапрос.Валюта КАК Валюта,
    ВложенныйЗапрос.Ссылка,
    ВложенныйЗапрос.ДатаКурса,
    КурсыВалют.Курс
ПОМЕСТИТЬ КурсыВалют
ИЗ
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
        МАКСИМУМ(КурсыВалют.Период) КАК ДатаКурса,
        КурсыВалют.Валюта КАК Валюта,
        РеализацияТоваровУслуг.Ссылка КАК Ссылка,
        РеализацияТоваровУслуг.Дата КАК Дата
    ИЗ
        Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
            ПО РеализацияТоваровУслуг.Дата >= КурсыВалют.Период
                И РеализацияТоваровУслуг.ВалютаДокумента = КурсыВалют.Валюта
    ГДЕ
        КурсыВалют.Валюта = &Валюта
        И КурсыВалют.Период <= РеализацияТоваровУслуг.Дата
    
    СГРУППИРОВАТЬ ПО
        КурсыВалют.Валюта,
        РеализацияТоваровУслуг.Ссылка,
        РеализацияТоваровУслуг.Дата) КАК ВложенныйЗапрос
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО ВложенныйЗапрос.ДатаКурса = КурсыВалют.Период
            И ВложенныйЗапрос.Валюта = КурсыВалют.Валюта

ИНДЕКСИРОВАТЬ ПО
    Валюта
8 H A D G E H O G s
 
13.12.20
00:04
(6) На моей практике коррелирующие запросы работали так, как от них это ожидается, вызывая в цикле коррелирующую часть по числу внешних строк.
Никаких там сканов или tablespool не попадалось. Ничего криминального.
Но, епстественно, я бы им не доверял и пользовал только в крайних случаях, например, в динсписках.
9 H A D G E H O G s
 
13.12.20
00:07
(7) Что, прям все РТУ нужны с курсами?
10 youalex
 
13.12.20
00:22
(6) имхуется, что основная проблема коррелирующих запросов в том, что они сильно зависят от среды исполнения, конкретно от СУБД и ее настроек. В файловых версиях - это сразу смерть. в PG, наверное от настроек, в MS - нормальная практика по умолчанию. Более того, в официальных курсах от MS коррелирующие запросы приводятся как нечто само собой разумеющееся. Чего не скажешь про 1С.
11 nikitas2020
 
13.12.20
00:23
Нужно получить курс валюты на тот же день.
12 hhhh
 
13.12.20
00:33
(11) тогда и получить курс на день. Зачем нужно курсы грузить за 15 лет?
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший