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

Учет и Финансы · 11 мин

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

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

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

Данные о курсах поступают с официального сервиса ЦБ РФ, поэтому они совпадают со значениями, которые используются для бухгалтерского и налогового учёта. Ручной ввод курса допустим, но при большом числе валютных операций ведёт к ошибкам и расхождениям при переоценке остатков. Ниже разобраны все рабочие сценарии: от настройки автозагрузки до примеров кода и проверки результата.

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

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

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

Узнать текущий курс вручную можно так: откройте раздел «Справочники» (в Бухгалтерии — «Справочники → Банк и касса → Валюты»), выберите валюту и перейдите по ссылке «Курсы валют». Откроется история значений с датами. Если записи устарели, курс в документах будет подставляться на последнюю известную дату — это видно по расхождению с текущим курсом ЦБ.

Загрузка курсов с сайта ЦБ РФ вручную

Штатный способ пополнить регистр — обработка «Загрузка курсов валют». Она встроена во все типовые конфигурации и не требует доработок. Откройте справочник «Валюты» и нажмите кнопку «Загрузить курсы валют» в командной панели формы списка.

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

Условия успешной загрузки: на компьютере или сервере, где работает клиент 1С, должен быть доступ в интернет, а в настройках прокси (если он используется в сети) — корректные параметры. Если загрузка завершается ошибкой соединения, проверьте настройки прокси-сервера в разделе «Администрирование → Общие настройки → Настройка прокси-сервера» или попросите администратора открыть доступ к сайту cbr.ru.

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

Автоматическая загрузка по расписанию

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

Проверьте настройку: откройте карточку валюты и посмотрите поле «Способ установки курса». Если выбрано «Вводится вручную», регламентное задание эту валюту проигнорирует. Для автозагрузки переключите на «Загружается из интернета».

Само задание настраивается в разделе «Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания». Найдите «Загрузка курсов валют», убедитесь, что флажок «Используется» установлен, и при необходимости скорректируйте расписание — обычно достаточно одного запуска утром до начала работы пользователей.

В файловой базе регламентные задания выполняются только при запущенном сеансе с включённым выполнением фоновых заданий. Если база файловая и курсы перестали обновляться, проверьте, запускается ли отдельный сеанс для регламентных операций. В клиент-серверном варианте задания исполняет сервер 1С, и проблема обычно кроется в отсутствии у сервера доступа в интернет.

Получение курса программно: функции типовых конфигураций

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

Пример пересчёта суммы из валюты в рубли:

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

СуммаРуб = СуммаВал * СтруктураКурса.Курс / СтруктураКурса.Кратность;

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

Если курса на запрошенную дату нет, функция вернёт ближайший ранний курс. Если в регистре вообще нет записей по валюте, курс и кратность вернутся равными нулю — перед делением обязательно проверяйте кратность, иначе получите ошибку «Деление на ноль».

bsl
СтруктураКурса = РаботаСКурсамиВалют.ПолучитьКурсВалюты(Валюта, Дата);
Если СтруктураКурса.Кратность = 0 Тогда
    ВызватьИсключение "Не задан курс валюты на дату " + Формат(Дата, "ДЛФ=D");
КонецЕсли;
СуммаРуб = СуммаВал * СтруктураКурса.Курс / СтруктураКурса.Кратность;

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

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

ВЫБРАТЬ

КурсыВалютСрезПоследних.Курс КАК Курс,

КурсыВалютСрезПоследних.Кратность КАК Кратность

ИЗ

РегистрСведений.КурсыВалют.СрезПоследних(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПоследних

Важный нюанс: параметр «Период» среза последних не включает записи на саму указанную дату, если передана дата без времени или с началом дня. Чтобы получить курс именно на дату документа, передавайте либо КонецДня(Дата), либо границу, включающую момент. Иначе для документа, проведённого в день единственной записи курса, запрос вернёт предыдущее значение.

Если курсы нужны сразу по многим валютам и датам (например, в отчёте по валютным продажам), не делайте срез последних в цикле — соединяйте таблицу документов со срезом последних по валюте и периоду через параметр виртуальной таблицы или через временную таблицу максимальных периодов. Это на порядок быстрее.

Типичные ошибки
01
Деление на курс вместо умножения с учётом кратности — суммы искажаются в разы
02
Срез последних на начало дня — курс, введённый в этот день, не попадает в выборку
03
Отсутствие проверки нулевой кратности — ошибка деления на ноль при пустом регистре
04
Ручной ввод курса с опечаткой — расхождения при переоценке валютных остатков
05
Смена способа установки курса на «вручную» — автозагрузка молча перестаёт работать

Курсы из внешних источников и нестандартные валюты

Штатная загрузка работает только с сайтом ЦБ РФ. Если нужны курсы другого регулятора (например, Нацбанка другой страны) или курсы криптовалют, типового механизма недостаточно. В этом случае пишут собственную загрузку: HTTP-запрос к API источника, разбор JSON или XML и запись в регистр «Курсы валют» с нужной периодичностью.

Альтернатива — способ установки курса «Зависит от курса другой валюты» или «Наценка на курс другой валюты» в карточке валюты. Так удобно вести условные единицы: например, «у.е. = USD + 2%». Курс такой валюты пересчитывается автоматически при изменении базовой валюты, отдельная загрузка не требуется.

При собственной загрузке учитывайте, что внешние API могут менять формат ответа и ограничивать частоту запросов. Закладывайте обработку ошибок и журналирование: если загрузка не удалась, пользователи должны увидеть предупреждение, а не устаревший курс, принятый за актуальный.

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

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

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

Проверка результата и ограничения

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

Признаки проблемы: документ подставляет курс, отличный от курса ЦБ на дату документа; в отчёте по валютным остаткам появляются курсовые разницы без видимых причин; в протоколе загрузки по валюте стоит отметка «данные не найдены». Последнее обычно означает, что код валюты в справочнике не совпадает с цифровым кодом ЦБ — проверьте поле «Код» в карточке валюты (для доллара — 840, для евро — 978).

Не редактируйте исторические курсы без необходимости: переоценка валютных остатков в уже закрытых периодах приведёт к изменению регламентных операций и потребует перепроведения документов. Если ошибочный курс попал в закрытый период, действуйте через корректировку в текущем периоде по правилам вашей учётной политики.

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

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

Запись в регистре «Курсы валют» на дату
Норма

Курс и кратность совпадают с данными ЦБ РФ

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

Записи нет или значение отличается от официального

Пересчёт суммы в документе
Норма

Сумма в рублях = сумма в валюте × курс / кратность

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

Сумма завышена или занижена кратно 10/100

Код валюты в справочнике
Норма

Цифровой код соответствует классификатору ЦБ (840, 978 и т.д.)

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

Произвольный код — загрузка по валюте не выполняется

Итог

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

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

Частые вопросы

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

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

Можно ли загрузить курсы за прошлый год?

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

Что делать, если загрузка завершается ошибкой соединения?

Проверьте доступ в интернет с того компьютера или сервера, где выполняется загрузка, настройки прокси в разделе «Администрирование → Общие настройки» и не блокирует ли файрвол обращение к сайту ЦБ. В клиент-серверном варианте интернет нужен именно серверу 1С, а не клиентским машинам.

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

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

Чем отличается курс ЦБ от курса конверсии в договоре?

Договорная конверсия (например, оплата в рублях по курсу USD + наценка) реализуется через настройку договора или зависимую валюту в справочнике, а не через изменение регистра «Курсы валют». Не подменяйте официальный курс договорным — это исказит переоценку валютных обязательств.