К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как получить курс валюты на дату в 1С

Разбираем, как получить курс валюты на конкретную дату в 1С: запрос к регистру «Курсы валют», функция РаботаСКурсамиВалют, загрузка с сайта ЦБ и типичные ошибки.

Задача получить курс валюты на конкретную дату возникает в 1С постоянно: при пересчёте валютных сумм в документах, переоценке остатков на счетах, формировании отчётов и проверке корректности проведения старых документов. В типовых конфигурациях (Бухгалтерия предприятия, Управление торговлей, ERP) для этого уже есть готовая инфраструктура, и изобретать собственный механизм обычно не нужно.

Ключевой объект — регистр сведений «Курсы валют». Это периодический регистр: каждая запись привязана к валюте и дате, а значение курса (и кратность) действует до следующей записи. Поэтому правильный способ получить курс на дату — взять «срез последних» на эту дату, а не искать запись с точным совпадением даты: на выходные и праздники записей может просто не быть.

Ниже разберём, где хранятся курсы, как их загрузить, как получить программно через запрос и через стандартные функции БСП, как проверить корректность результата и какие ошибки встречаются чаще всего.

Где в 1С хранятся курсы валют

В типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) курсы хранятся в регистре сведений «Курсы валют». У регистра есть измерение «Валюта» (ссылка на справочник «Валюты»), период и ресурсы «Курс» и «Кратность». Кратность нужна для валют, курс которых ЦБ публикует не за 1 единицу: например, за 100 японских иен или 10 польских злотых.

Формула пересчёта суммы из валюты в рубли выглядит так: сумма в рублях = сумма в валюте × курс / кратность. Если валюта имеет кратность 100, а вы поделили сумму только на курс без учёта кратности, результат будет занижен в 100 раз — это одна из самых частых ошибок в самописных доработках.

Посмотреть данные регистра можно в пользовательском режиме: раздел «НСИ и администрирование» (или «Справочники») → «Валюты» → открыть нужную валюту → ссылка «Курсы валют». В конфигураторе регистр доступен через ветку «Регистры сведений».

Как загрузить курсы в информационную базу

Прежде чем получать курс на дату, убедитесь, что данные в регистре есть. Самый простой способ — встроенная загрузка с сайта Центрального банка РФ. В разделе со списком валют есть кнопка «Загрузить курсы валют»: укажите период и нажмите «Загрузить». Программа обратится к сервису ЦБ и запишет курсы по всем валютам, у которых установлен признак загрузки из интернета.

Для регулярной работы удобнее настроить регламентное задание «Загрузка курсов валют»: оно выполняется по расписанию (обычно ежедневно) и поддерживает актуальность данных без участия пользователя. Проверить, что задание работает, можно в разделе «Администрирование» → «Обслуживание» → «Регламентные и фоновые задания».

Если у сервера нет доступа в интернет, курсы вводят вручную через форму валюты или загружают из файла, полученного другим способом. Учтите: для прошлых дат загрузка с сайта ЦБ работает корректно — сервис отдаёт исторические курсы, поэтому «дозагрузить» старый период можно в любой момент.

Загрузка курсов с сайта ЦБ
  1. 1
    Откройте справочник «Валюты» в разделе НСИ
  2. 2
    Нажмите «Загрузить курсы валют»
  3. 3
    Укажите период — дату начала и окончания
  4. 4
    Отметьте нужные валюты и нажмите «Загрузить»
  5. 5
    Откройте валюту и проверьте, что записи появились в таблице курсов

Получение курса запросом к регистру

Универсальный способ, работающий в любой конфигурации с регистром «Курсы валют», — запрос к виртуальной таблице «СрезПоследних» с параметром даты. В параметр передаётся дата, на которую нужен курс: если время не указано, берётся начало дня, поэтому для надёжности часто передают конец дня.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КурсыВалютСрезПоследних.Курс,
| КурсыВалютСрезПоследних.Кратность
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПоследних";
Запрос.УстановитьПараметр("Период", КонецДня(ДатаКурса));
Запрос.УстановитьПараметр("Валюта", ВалютаСсылка);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
    Курс = Результат.Курс;
    Кратность = Результат.Кратность;
Иначе
    // Курс на дату не найден - обработать ситуацию
КонецЕсли;

Обратите внимание на ветку «Иначе»: если запрос ничего не вернул, значит, на указанную дату (и ранее) записей по этой валюте нет. Просто оставить переменную незаполненной нельзя — дальше в расчётах получите ноль или деление на ноль. Минимальная обработка — предупреждение пользователю или попытка загрузить курсы программно.

Если нужен курс сразу для нескольких валют, передайте в условие список: «Валюта В (&СписокВалют)». Срез последних вернёт по одной записи на каждую валюту, что намного эффективнее, чем выполнять запрос в цикле.

Стандартные функции БСП: РаботаСКурсамиВалют

В конфигурациях на базе БСП есть общий модуль «РаботаСКурсамиВалют» (на клиенте — «РаботаСКурсамиВалютКлиент»). Он инкапсулирует работу с регистром, и в типовом коде предпочтительно использовать именно его, а не собственные запросы: так ваша доработка не сломается при изменении структуры регистра в новых релизах.

Основная функция — РаботаСКурсамиВалют.ПолучитьКурсВалюты(Валюта, ДатаКурса). Она возвращает структуру с полями «Курс» и «Кратность», а при отсутствии данных — нулевые значения. Пример использования:

bsl
СтруктураКурса = РаботаСКурсамиВалют.ПолучитьКурсВалюты(ВалютаДоллар, ДатаДокумента);
СуммаРуб = СуммаВал * СтруктураКурса.Курс / СтруктураКурса.Кратность;

Также полезна функция ПересчитатьВВалюту (в новых версиях БСП — ПересчитатьПоКурсу в модуле «РаботаСКурсамиВалют»), которая выполняет пересчёт суммы из одной валюты в другую по курсам на заданную дату и сама учитывает кратности. Для программной загрузки курсов с сайта ЦБ используется РаботаСКурсамиВалют.ЗагрузитьАктуальныйКурс() и связанные процедуры.

Как проверить корректность полученного курса

После получения курса полезно убедиться, что значение реалистично. Простейшая проверка — сравнение с курсом на соседние даты: скачок в разы без видимой причины обычно означает ошибку в данных (например, ручной ввод с опечаткой) или путаницу с кратностью.

Второй ориентир — официальный курс ЦБ на ту же дату, который можно посмотреть на сайте регулятора. Если ваша база показывает другое значение, проверьте, не была ли запись изменена вручную: в регистре видно, какие записи загружены автоматически, а какие введены пользователем.

Контрольные точки

Как проверить результат

Курс на дату в регистре
Норма

Значение близко к соседним датам и совпадает с курсом ЦБ

Тревожный признак

Курс равен 0, сильно отличается от соседних дат или от данных ЦБ

Кратность
Норма

Для иен, вон и подобных валют равна 10 или 100

Тревожный признак

Кратность 1 там, где ЦБ публикует курс за 100 единиц

Пересчёт суммы
Норма

Сумма в рублях соответствует рыночному эквиваленту

Тревожный признак

Сумма отличается в 10 или 100 раз — ошибка в кратности

Типичные ошибки и их последствия

Самая распространённая ошибка — поиск записи с точным равенством даты вместо среза последних. На субботу, воскресенье и праздники ЦБ курсы не публикует, записей в регистре нет, и запрос возвращает пустой результат. Документы за выходные при этом должны считаться по курсу последнего рабочего дня — именно это и даёт срез последних.

Вторая группа ошибок связана с кратностью: игнорирование кратности при пересчёте или её ручное изменение. Третья — обращение к регистру в цикле по строкам табличной части вместо одного запроса со списком валют, что резко замедляет проведение документов.

Типичные ошибки
01
Поиск записи по точной дате вместо среза последних — пустой результат на выходные и праздники
02
Игнорирование кратности — суммы занижены или завышены в 10–100 раз
03
Отсутствие обработки пустого результата — деление на ноль или нулевые суммы в проводках
04
Запрос курса в цикле по строкам документа — медленное проведение и лишняя нагрузка на СУБД
05
Ручная правка курса «под нужную сумму» — расхождения при переоценке и вопросы при аудите

Особые сценарии: кросс-курсы и прошлые периоды

Курс одной валюты к другой

Иногда нужен не курс валюты к рублю, а кросс-курс — например, доллара к евро. В регистре таких данных нет: кросс-курс вычисляется через рублёвые курсы обеих валют на одну и ту же дату. Получите два среза последних (или один запросом по списку валют) и поделите приведённые к рублю значения с учётом кратностей.

Получение курса для старых документов

При перепроведении или исправлении документов прошлых периодов курс нужен строго на дату документа, а не на текущую. Передавайте в срез последних дату документа, а не ТекущаяДата() — иначе суммы «поплывут». Если исторические курсы в базе отсутствуют, загрузите их с сайта ЦБ за нужный период: сервис отдаёт данные за прошлые годы.

Маршрут решения

Как выбрать действие

Конфигурация на базе БСП (БП, УТ, ERP)Используйте РаботаСКурсамиВалют.ПолучитьКурсВалюты — это устойчиво к обновлениям
Самописная конфигурация без БСПДелайте запрос к СрезПоследних регистра «Курсы валют» с обработкой пустого результата
Курса на дату нет в базеЗагрузите курсы с сайта ЦБ за нужный период или введите вручную, затем повторите получение
Нужен кросс-курс двух иностранных валютПолучите рублёвые курсы обеих валют на дату и вычислите отношение с учётом кратностей

FAQ

Почему запрос курса на понедельник возвращает пятничный курс?

Это нормальное поведение среза последних: ЦБ не публикует курсы на выходные, поэтому последняя запись перед понедельником датирована пятницей. Именно так и должны считаться валютные суммы за выходные — по последнему установленному курсу.

Можно ли получить курс валюты на дату без программирования?

Да. Откройте справочник «Валюты», выберите валюту и перейдите по ссылке «Курсы валют» — в таблице видны все записи с датами. Найдите ближайшую запись не позднее нужной даты: её значение и есть действующий курс на этот день.

Что делать, если ПолучитьКурсВалюты возвращает ноль?

Ноль означает, что в регистре нет записей по этой валюте на указанную дату и ранее. Проверьте, загружены ли курсы за нужный период, и убедитесь, что передаёте ссылку на правильный элемент справочника «Валюты», а не, например, код валюты строкой.

Чем курс отличается от кратности?

Курс — это рублёвая стоимость за установленное количество единиц валюты, а кратность — это само количество. Для доллара кратность обычно 1, для японской иены — 100. Итоговая формула пересчёта: сумма × курс / кратность.

Как получить курсы сразу по всем валютам на одну дату?

Выполните запрос к СрезПоследних без отбора по валюте или с условием «Валюта В (&СписокВалют)». Результат удобно выгрузить в таблицу значений и индексировать по колонке «Валюта» для быстрого поиска при обходе документов.

Влияет ли время в дате на получаемый курс?

Да. Срез последних учитывает записи не позднее указанного момента. Если передать дату с нулевым временем (начало дня), запись, сделанная в течение этого дня, не попадёт в срез. Чтобы гарантированно получить курс «на дату», передавайте КонецДня(Дата).

Итог

Что важно запомнить

Курс валюты на дату получают через срез последних регистра «Курсы валют» или функцию РаботаСКурсамиВалют.ПолучитьКурсВалюты. Всегда учитывайте кратность, передавайте конец дня в параметр даты, обрабатывайте пустой результат и используйте один запрос со списком валют вместо цикла. Предварительно убедитесь, что курсы за нужный период загружены с сайта ЦБ или введены вручную.