Добрый день! Подскажите как в регистре сведений можно получить курс указанной валюты(предшествующий актуальному)?
---
Получаете актуальный курс, определяете дату этого курса, отнимаете от даты одни сутки и на получившуюся дату определяете курс
---
Узнать дату записи с актуальным курсом срезом последних на текущую дату. Отнять от этой даты период регистра и сделать срез последних на полученную дату.
---
```1c
    ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ВалютыСрезПоследних.Период, ДЕНЬ) КАК Период
    ПОМЕСТИТЬ Масс
    ИЗ
    РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &Валюта) КАК ВалютыСрезПоследних
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ ПЕРВЫЕ 1
    Валюты.Валюта,
    Валюты.Курс,
    Валюты.Период КАК Период
    ИЗ
    РегистрСведений.КурсыВалют КАК Валюты
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Масс КАК Масс
    ПО Валюты.Период < Масс.Период
    ГДЕ
    Валюты.Валюта = &Валюта

    УПОРЯДОЧИТЬ ПО
    Период УБЫВ
```
---
Можно и так:

```1c
    ВЫБРАТЬ
    Валюты.Период КАК Период,
    Валюты.Валюта,
    Валюты.Курс КАК Курс
    ИЗ
    РегистрСведений.Валюты.СрезПоследних КАК ВалютыСрезПоследних
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Валюты КАК Валюты
    ПО (Валюты.Валюта = ВалютыСрезПоследних.Валюта
    И ВалютыСрезПоследних.Период <> Валюты.Период)

    СГРУППИРОВАТЬ ПО
    Валюты.Валюта,
    Валюты.Период,
    Валюты.Курс
```

Этот запрос будет чуть быстрее.
---
Получаете актуальный курс, определяете дату этого курса, отнимаете от даты одни сутки и на получившуюся дату определяете курс
---
Узнать дату записи с актуальным курсом срезом последних на текущую дату. Отнять от этой даты период регистра и сделать срез последних на полученную дату.
---
зачем отнимать, если можно искать максимальную дату меньше.... ну вы поняли :)
---
Добрый день. Есть ещё вот такой вариант решения:

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

    УПОРЯДОЧИТЬ ПО
    КурсыВалют.Период УБЫВ
```
---
Подскажите, а где можно в запрос вписать Функцию(Новый граница.ВидГраницы.Включая)?. Конец дня у меня получается, но мне надо границу вместо КонецДня

Вот Запрос;

       ВЫБРАТЬ
 ВалютыСрезПоследних.Валюта,
 ВалютыСрезПоследних.Курс,
  Период
ИЗ
 РегистрСведений.Валюты.СрезПоследних(&Период, Валюта = &Валюта) КАК ВалютыСрезПоследних
---
```1c
    ГраницаПериода = Новый Граница(КонецДня(ТекущаяДата()), ВидГраницы.Включая);
    Запрос.УстановитьПараметр("Период", ГраницаПериода);
```
---
Подскажите еще как в данном запросе можно применить функцию РазностьДат?
---
В данном запросе её негде применить.... А что нужно?
---
Сасибо за ответ!
Подскажите, в функции РазностьДат написал следующее РазностьДат(&Период, 1, День) система ругается говорит неверный параметр, подскажите что не так могу делать?

ВЫБРАТЬ
ВалютыСрезПоследних.Валюта,
ВалютыСрезПоследних.Курс,
Период
ИЗ
РегистрСведений.Валюты.СрезПоследних(РазностьДат(&Период, 1, День), Валюта = &Валюта) КАК ВалютыСрезПоследних
---
а, понятно, хорошее желание. Но так работать в этой таблице не будет.
---
```1c
    ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ВалютыСрезПоследних.Период, ДЕНЬ) КАК Период
    ПОМЕСТИТЬ Масс
    ИЗ
    РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &Валюта) КАК ВалютыСрезПоследних
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ ПЕРВЫЕ 1
    Валюты.Валюта,
    Валюты.Курс,
    Валюты.Период КАК Период
    ИЗ
    РегистрСведений.КурсыВалют КАК Валюты
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Масс КАК Масс
    ПО Валюты.Период < Масс.Период
    ГДЕ
    Валюты.Валюта = &Валюта

    УПОРЯДОЧИТЬ ПО
    Период УБЫВ
```
---
Спасибо вам за ваше решение, вы бы не могли мне прокоментировать эти две строчки:

1.ПО Валюты.Период < Масс.Период, т е правильно ли я понял что поле Валюты.Период должно быть меньше Масс.Период и таким образом происходит отнимание одного дня?
2. Почему вы взяли функцию НачалоПериода?
---
таким образом происходит отнимание одного дня это не отнимание одного дня. Это значит, что берется запись за предыдущий период.
В (1) написано словами, а в (11) функцией.
---
а ты точно программист?
---
Добрый день! Подскажите как правильно выбрать все предыдущие курсы валют, кроме актуальных, подскажите что не так делаю, вот код:

```1c
    ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ВалютыСрезПоследних.Период, ДЕНЬ) КАК Период,
    Валюты.Валюта,
    Валюты.Курс КАК Курс
    ИЗ
    РегистрСведений.Валюты.СрезПоследних КАК ВалютыСрезПоследних
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Валюты КАК Валюты
    ПО ВалютыСрезПоследних.Период <> Валюты.Период

    СГРУППИРОВАТЬ ПО
    Валюты.Валюта,
    НАЧАЛОПЕРИОДА(ВалютыСрезПоследних.Период, ДЕНЬ),
    Валюты.Курс
```
---
Переделал запрос:

```1c
    ВЫБРАТЬ
    Валюты.Период КАК Период,
    Валюты.Валюта КАК Валюта,
    Валюты.Курс КАК Курс
    ИЗ
    РегистрСведений.Валюты КАК Валюты
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Валюты.СрезПоследних КАК ВалютыСрезПоследних
    ПО (Валюты.Валюта = ВалютыСрезПоследних.Валюта
    И Валюты.Период = ВалютыСрезПоследних.Период)
    ГДЕ
    ВалютыСрезПоследних.Период ЕСТЬ NULL

    СГРУППИРОВАТЬ ПО
    Валюты.Валюта,
    Валюты.Курс,
    Валюты.Период
```
---
(18) Проверил в консоли, запросы дают не то, что нужно. И вообще, соединять реальную таблицу с виртуальной в одном запросе не рекомендуется.

Для одной заданной валюты я бы еще предложил такой вариант
```1c
    ВЫБРАТЬ ПЕРВЫЕ 1
    ВЗ.Период КАК Период,
    ВЗ.Курс КАК Курс
    ИЗ
    (ВЫБРАТЬ ПЕРВЫЕ 2
    КурсыВалют.Период КАК Период,
    КурсыВалют.Курс КАК Курс
    ИЗ
    РегистрСведений.КурсыВалют КАК КурсыВалют
    ГДЕ
    КурсыВалют.Валюта = &Валюта
    УПОРЯДОЧИТЬ ПО
    Период УБЫВ) КАК ВЗ
    УПОРЯДОЧИТЬ ПО
    Период
```
---
(17)(18) Проверил в консоли, запросы дают не то, что нужно
Это был ответ на (15). А именно: "Подскажите как правильно выбрать все предыдущие курсы валют, кроме актуальных".
---
Теперь понял, спасибо, но это уже совсем неинтересная и высосанная из пальца задача по сравнению с предпоследним курсом.
---
Спачибо за объяснение!
---
И вообще, соединять реальную таблицу с виртуальной в одном запросе не рекомендуется.
виртуальную надо помещать во временную с индексацией по объединяемым полям, а потом уже соединять?
а почему? так производительнее или еще почему-то?
---
виртуальную надо помещать во временную - да, желательно
с индексацией по объединяемым полям - не обязательно, затраты на индексацию часто бывают больше выигрыша
или еще почему-то? - меньше риск, что планировщик выполнения запроса выберет неправильный план, приводящий к большим затратам времени на выполнение запроса, поскольку виртуальный регистр это фактически сложный вложенный запрос, при обработке которого может быть выбран не оптимальный порядок соединения.
---
Можно и так:

```1c
    ВЫБРАТЬ
    Валюты.Период КАК Период,
    Валюты.Валюта,
    Валюты.Курс КАК Курс
    ИЗ
    РегистрСведений.Валюты.СрезПоследних КАК ВалютыСрезПоследних
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Валюты КАК Валюты
    ПО (Валюты.Валюта = ВалютыСрезПоследних.Валюта
    И ВалютыСрезПоследних.Период <> Валюты.Период)

    СГРУППИРОВАТЬ ПО
    Валюты.Валюта,
    Валюты.Период,
    Валюты.Курс
```

Этот запрос будет чуть быстрее.
---
Спасибо вам за ваше решение вы очень помогли! Вы не могли бы прокомментировать немного вот эти строки кода, мне просто не до конца понятно как работает данное условие при ГДЕ ВалютыСрезПоследних.Период ЕСТЬ NULL

 ПО (Валюты.Валюта = ВалютыСрезПоследних.Валюта
                И Валюты.Период = ВалютыСрезПоследних.Период)
ГДЕ
    ВалютыСрезПоследних.Период ЕСТЬ NULL

Заранее спасибо!
---
ГДЕ ВалютыСрезПоследних.Период ЕСТЬ NULL
Предварительно соберется таблица Валюты с левым соединением присоединятся записи из виртуальной таблицы среза последних (что в свою очередь часть записей той же таблицы). Те записи, которых нет в срезе последних, будут иметь в поле ВалютыСрезПоследних.Период значения NULL. Вот по ним и накладываем фильтр. В итоге отсекутся все записи, которые сопоставились из обеих таблиц.
---
Подскажите пожалуйста в чем может быть ошибка, очень надо! Данную строку ПО ВалютыСрезПоследних.Период <> Валюты.Период по разному в ней делал условия, но все равно попадают и актуальные курсы!
---
Сообщение было скрыто модератором.