Получение курса валюты по списку дат

24.03.10

Разработка - Запросы

Иногда у меня возникала необходимость в запросе получить значение курсов валют на разные даты, причем заранее список дат неизвестен. Естественно было желание сделать все одним запросом. Буквально вчера нашел я оптимальное решение задачи. Т.к. подобные задачи могут возникать и у других, то решил результат здесь.

Итак исходные условия: любая конфигурация 1с 8, в которой присутствует регистр сведений курсы валют. Для получения списка дат я использовал список периодов валюты Тест1.

Предварительно я заполнил регистр вот такимим данными:

     
Период Валюта Курс
10.03.2010 Тест2 12,0000
12.03.2010 Тест2 142,0000
15.03.2010 Тест2 100,0000
16.03.2010 Тест 20,0000
19.03.2010 Тест2 213,0000
20.03.2010 Тест 40,0000

Обратите внимание: периоды курсов валют различаются, что привносит дополнительные трудности.

Далее собственно запрос:

ВЫБРАТЬ
    КурсыВалют.Курс КАК Курс2,
    КурсыВалют.Период КАК Период2
ПОМЕСТИТЬ Курсы2
ИЗ
    РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
    КурсыВалют.Валюта.Наименование = "Тест2"
;

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

А вот результат выполнения запроса:

       
Курс1 Период1 Курс2 Период2
20,0000 16.03.2010 100,0000 15.03.2010
40,0000 20.03.2010 213,0000 19.03.2010

т.е. я получил значение курса второй валюты действовавшее на дату периода установки курса первой валюты.

 

 

 

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159416    872    399    

861

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    9874    sergey279    18    

64

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    5167    XilDen    36    

80

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    7901    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2393    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8684    implecs_team    6    

47

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3391    andrey_sag    10    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kote 537 21.03.10 15:46 Сейчас в теме
Это то же, что и 2 среза последних на 2ве даты что ли?
Не очень понятно, что это даёт.. дайте пожалуйста пару примеров где это может пригодится..
7. Ivon 676 24.03.10 12:49 Сейчас в теме
(1). Посмотрите мою статью, указанную в 4-м посте, возможно так Вам станет понятнее. На самом деле нужный и полезный прием.
8. Nikola23 705 24.03.10 13:25 Сейчас в теме
(7). указанную статью я видел уже давно.
На мой взгляд - и эта и Ваша статья - одно и тоже, да вот только когда надо я не смог найти уже предложенное Вами решение моего вопроса. Потому сначала сделал сам, а потом выложил на этом сайте.
Предлагаю не начинать обсуждение, чем хорошо ваше решение, или чем хорошо мое - смысла я в этом не вижу. Если лучше все таки Ваше - честь Вам и хвала.
Честно говоря, Ваше решение кажется мне не менее запутанным, чем мое))).
9. Ivon 676 24.03.10 14:51 Сейчас в теме
(8) Посмотреть статью было адресовано kote.
11. echo77 1906 02.02.12 21:37 Сейчас в теме
Уже было. Это называется срез последних на каждую дату в запросе. Например, вот эта публикация http://infostart.ru/public/77568/
В интернете уже достаточно решений данного вопроса.
А соединять два набора данных в СКД с исползованием среза последних - я не рекомендую, т.к. это достаточно медленно работает

(1) Где это можно применить? Например, вы делаете реестр счетов-фактур, часть из которых не рублевые, а валютные. Вам нужен реестр в одной валюте - в рублях. По скольку курсы валют могут быть не на каждую дату, а какие счет-фактуры и на какю дату в валюте сразу и не определишь.
12. Nikola23 705 02.02.12 21:47 Сейчас в теме
(11) echo77, Указанная Вами публикация датирована позже моей. Собственно, мне все-равно.

Применить можно во многих случаях. Срез последних на каждую дату в запросе может быть полезен когда приходится выводить данные из регистра накопления и регистра сведений одновременно. Причем, из регистра сведений данные необходимо получать актуальные на дату из регистра накопления.

Пример из практики: вывести движения по складу, где суммовая оценка движения товара берется из типов цен. Ест-но значение цены должно получаться на дату движения.

По прошествии времени, понимаю, что привел не всем понятный пример(
13. echo77 1906 03.02.12 06:55 Сейчас в теме
(12) Я только что увидел, что я здесь некропостингом занимаюсь. Не понимаю, как ваша публикация 2010 года всплыла на главной странице...
2. пользователь 21.03.10 18:07
Сообщение было скрыто модератором.
...
3. Nikola23 705 21.03.10 18:22 Сейчас в теме
ту 1:
В конкретно этом примере, действительно можно было бы использовать 2 среза последних, однако мне попадались ситуации, когда в запросе необходимо было получить значения периодического регистра сведений или остатков из регистра накопления на различные, заранее не известные наборы дат. Ранее приходилось решать динамическим построением текста запроса.

Пример по другим таблицам, но с использованием того же механизма.
Например используя этот механизм можно построить отчет "Динамика дебиторской задолженности по месяцам" для БП8 в различных валютах. Причем сумма задолженности вычисляется по курсу, действовавшему на конец каждого месяца попавшего в период отчета.
4. Ivon 676 24.03.10 10:55 Сейчас в теме
Вот здесь http://infostart.ru/public/21181/ моя статья с примером-базой, посвященная данному вопросу. Твое решение сильно запутано. Там надо всего 2 запроса: либо один вложенный в другой, либо через одну временную таблицу. У тебя же в примере запросов 4.
5. Nikola23 705 24.03.10 11:21 Сейчас в теме
При желании можно сделать текст этого запроса и с 2мя конструкциями выбор и с 3мя.
Некоторая запутанность обусловлена тем, что я использую 2 периодических регистра сведений.
Как не странно, но с 4мя запросами этот пример отрабатывает приблизительно в 10 раз быстрее, чем с 2мя.))))
6. Ivon 676 24.03.10 12:47 Сейчас в теме
(5) В данном примере я увидел только РегистрСведений.КурсыВалют. Где второй? На самом деле скорость выполнения так же обусловлена построением запроса и его оптимизацией внутри MSSQL. Как сервер оптимизирует запрос - одному Майкрософту известно, но не факт, что он это делает всегда правильно. Конструкции с вложенным запросом и с временной таблицей могут различаться по времени выполнения в разные стороны из-за многих факторов, которые включают в себя так же и то, насколько правильно настроен MSSQL и количество данных, передаваемых между таблицами. Так что быстрее в 10 раз может быть исключительно на твоей системе, а у других может быть так же или медленнее.
10. Nikola23 705 24.03.10 15:09 Сейчас в теме
14. Onemany 12.07.12 17:03 Сейчас в теме
Есть пример применения?
oneman@yandex.ru; +1 Ответить
16. Nikola23 705 12.07.12 17:29 Сейчас в теме
(14), (15) Пример приведен в публикации. Это виртуальный пример. На практике этот кусок кода, обычно, является частью более крупного запроса.
15. oneman@yandex.ru 12.07.12 17:04 Сейчас в теме
Обработка-пример имеется?
17. NoRazum 29 27.09.12 15:54 Сейчас в теме
Без примера очень сложно.
Реальный пример хотя бы из УТ
Оставьте свое сообщение