Учет и Финансы · 11 мин
Как получить курс валюты в 1С
Как получить курс валюты в 1С: загрузка с сайта ЦБ РФ, запрос к регистру «Курсы валют», функция РаботаСКурсамиВалют, примеры кода и типичные ошибки.
Курс валюты в типовых конфигурациях 1С (Бухгалтерия, Управление торговлей, ERP, ЗУП) хранится в регистре сведений «Курсы валют», а получить его можно тремя путями: загрузить актуальные значения с сайта Центрального банка штатной обработкой, прочитать значение из регистра запросом или через встроенные функции общего модуля «РаботаСКурсамиВалют». Выбор способа зависит от задачи: бухгалтеру нужна регулярная загрузка, разработчику — программное получение курса на конкретную дату для пересчёта сумм в документах.
Данные о курсах поступают с официального сервиса ЦБ РФ, поэтому они совпадают со значениями, которые используются для бухгалтерского и налогового учёта. Ручной ввод курса допустим, но при большом числе валютных операций ведёт к ошибкам и расхождениям при переоценке остатков. Ниже разобраны все рабочие сценарии: от настройки автозагрузки до примеров кода и проверки результата.
Где в 1С хранятся курсы валют
Все типовые конфигурации используют справочник «Валюты» и периодический регистр сведений «Курсы валют». В регистре для каждой валюты на каждую дату записываются два значения: курс и кратность. Кратность нужна для валют, которые ЦБ котировал не за единицу, а за 10, 100 или 1000 единиц (например, японская иена исторически имела кратность 100).
Итоговый курс для пересчёта вычисляется как «курс / кратность». Если игнорировать кратность и умножать сумму напрямую на курс, результат для таких валют будет завышен в десятки или сотни раз — это одна из самых частых ошибок в самописных доработках.
Узнать текущий курс вручную можно так: откройте раздел «Справочники» (в Бухгалтерии — «Справочники → Банк и касса → Валюты»), выберите валюту и перейдите по ссылке «Курсы валют». Откроется история значений с датами. Если записи устарели, курс в документах будет подставляться на последнюю известную дату — это видно по расхождению с текущим курсом ЦБ.
Загрузка курсов с сайта ЦБ РФ вручную
Штатный способ пополнить регистр — обработка «Загрузка курсов валют». Она встроена во все типовые конфигурации и не требует доработок. Откройте справочник «Валюты» и нажмите кнопку «Загрузить курсы валют» в командной панели формы списка.
В открывшейся форме укажите период загрузки и отметьте флажками нужные валюты. По умолчанию предлагается загрузка с начала текущего месяца по текущую дату. После нажатия «Загрузить» программа обратится к сервису ЦБ, получит XML-данные и запишет их в регистр. По завершении отобразится протокол: какие курсы загружены, а по каким валютам данных нет.
Условия успешной загрузки: на компьютере или сервере, где работает клиент 1С, должен быть доступ в интернет, а в настройках прокси (если он используется в сети) — корректные параметры. Если загрузка завершается ошибкой соединения, проверьте настройки прокси-сервера в разделе «Администрирование → Общие настройки → Настройка прокси-сервера» или попросите администратора открыть доступ к сайту cbr.ru.
- 1Откройте «Справочники → Валюты»
- 2Нажмите «Загрузить курсы валют»
- 3Укажите период и отметьте нужные валюты
- 4Нажмите «Загрузить» и дождитесь протокола
- 5Откройте валюту и проверьте, что курс на нужную дату появился
Автоматическая загрузка по расписанию
Чтобы не запускать загрузку вручную каждый день, в типовых конфигурациях есть регламентное задание «Загрузка курсов валют». Оно выполняется по расписанию и обновляет курсы по всем валютам, у которых в карточке установлен способ установки курса «Загружается из интернета».
Проверьте настройку: откройте карточку валюты и посмотрите поле «Способ установки курса». Если выбрано «Вводится вручную», регламентное задание эту валюту проигнорирует. Для автозагрузки переключите на «Загружается из интернета».
Само задание настраивается в разделе «Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания». Найдите «Загрузка курсов валют», убедитесь, что флажок «Используется» установлен, и при необходимости скорректируйте расписание — обычно достаточно одного запуска утром до начала работы пользователей.
В файловой базе регламентные задания выполняются только при запущенном сеансе с включённым выполнением фоновых заданий. Если база файловая и курсы перестали обновляться, проверьте, запускается ли отдельный сеанс для регламентных операций. В клиент-серверном варианте задания исполняет сервер 1С, и проблема обычно кроется в отсутствии у сервера доступа в интернет.
Получение курса программно: функции типовых конфигураций
Разработчику в типовой конфигурации не нужно писать запрос к регистру вручную: за это отвечает общий модуль «РаботаСКурсамиВалют». Основная функция — ПолучитьКурсВалюты(Валюта, ДатаКурса). Она возвращает структуру с полями «Курс» и «Кратность» на указанную дату с учётом среза последних.
Пример пересчёта суммы из валюты в рубли:
СтруктураКурса = РаботаСКурсамиВалют.ПолучитьКурсВалюты(ВалютаДокумента, ДатаДокумента);
СуммаРуб = СуммаВал * СтруктураКурса.Курс / СтруктураКурса.Кратность;
Для пересчёта между двумя произвольными валютами удобнее функция ПересчитатьВВалюту или РаботаСКурсамиВалютКлиентСервер.ПересчитатьПоКурсу — она принимает сумму и структуры курсов валюты-источника и валюты-получателя. В клиент-серверном коде используйте серверный вызов: модуль «РаботаСКурсамиВалют» доступен на сервере, на клиенте без контекста его вызывать нельзя.
Если курса на запрошенную дату нет, функция вернёт ближайший ранний курс. Если в регистре вообще нет записей по валюте, курс и кратность вернутся равными нулю — перед делением обязательно проверяйте кратность, иначе получите ошибку «Деление на ноль».
СтруктураКурса = РаботаСКурсамиВалют.ПолучитьКурсВалюты(Валюта, Дата);
Если СтруктураКурса.Кратность = 0 Тогда
ВызватьИсключение "Не задан курс валюты на дату " + Формат(Дата, "ДЛФ=D");
КонецЕсли;
СуммаРуб = СуммаВал * СтруктураКурса.Курс / СтруктураКурса.Кратность;Получение курса запросом к регистру
В отчётах и произвольных выборках курс получают запросом к виртуальной таблице «СрезПоследних» регистра «КурсыВалют». Параметр «Период» среза задаёт дату, на которую нужен курс.
ВЫБРАТЬ
КурсыВалютСрезПоследних.Курс КАК Курс,
КурсыВалютСрезПоследних.Кратность КАК Кратность
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
Важный нюанс: параметр «Период» среза последних не включает записи на саму указанную дату, если передана дата без времени или с началом дня. Чтобы получить курс именно на дату документа, передавайте либо КонецДня(Дата), либо границу, включающую момент. Иначе для документа, проведённого в день единственной записи курса, запрос вернёт предыдущее значение.
Если курсы нужны сразу по многим валютам и датам (например, в отчёте по валютным продажам), не делайте срез последних в цикле — соединяйте таблицу документов со срезом последних по валюте и периоду через параметр виртуальной таблицы или через временную таблицу максимальных периодов. Это на порядок быстрее.
Курсы из внешних источников и нестандартные валюты
Штатная загрузка работает только с сайтом ЦБ РФ. Если нужны курсы другого регулятора (например, Нацбанка другой страны) или курсы криптовалют, типового механизма недостаточно. В этом случае пишут собственную загрузку: HTTP-запрос к API источника, разбор JSON или XML и запись в регистр «Курсы валют» с нужной периодичностью.
Альтернатива — способ установки курса «Зависит от курса другой валюты» или «Наценка на курс другой валюты» в карточке валюты. Так удобно вести условные единицы: например, «у.е. = USD + 2%». Курс такой валюты пересчитывается автоматически при изменении базовой валюты, отдельная загрузка не требуется.
При собственной загрузке учитывайте, что внешние API могут менять формат ответа и ограничивать частоту запросов. Закладывайте обработку ошибок и журналирование: если загрузка не удалась, пользователи должны увидеть предупреждение, а не устаревший курс, принятый за актуальный.
Как выбрать способ получения курса
Проверка результата и ограничения
После загрузки убедитесь, что курс применяется корректно. Откройте карточку валюты → «Курсы валют» и сверьте значение на нужную дату с данными на сайте ЦБ. Затем создайте тестовый валютный документ (например, поступление на валютный счёт) и проверьте, что сумма в рублях пересчитана по ожидаемому курсу.
Признаки проблемы: документ подставляет курс, отличный от курса ЦБ на дату документа; в отчёте по валютным остаткам появляются курсовые разницы без видимых причин; в протоколе загрузки по валюте стоит отметка «данные не найдены». Последнее обычно означает, что код валюты в справочнике не совпадает с цифровым кодом ЦБ — проверьте поле «Код» в карточке валюты (для доллара — 840, для евро — 978).
Не редактируйте исторические курсы без необходимости: переоценка валютных остатков в уже закрытых периодах приведёт к изменению регламентных операций и потребует перепроведения документов. Если ошибочный курс попал в закрытый период, действуйте через корректировку в текущем периоде по правилам вашей учётной политики.
Как проверить результат
Курс и кратность совпадают с данными ЦБ РФ
Записи нет или значение отличается от официального
Сумма в рублях = сумма в валюте × курс / кратность
Сумма завышена или занижена кратно 10/100
Цифровой код соответствует классификатору ЦБ (840, 978 и т.д.)
Произвольный код — загрузка по валюте не выполняется
Что важно запомнить
Курсы хранятся в регистре «Курсы валют» с учётом кратности. Загружайте их штатной обработкой или регламентным заданием, в коде используйте РаботаСКурсамиВалют.ПолучитьКурсВалюты(), в отчётах — срез последних с корректной датой. Всегда проверяйте кратность и сверяйте результат с сайтом ЦБ.
Частые вопросы
Почему в документе подставляется вчерашний курс?
ЦБ публикует курс на следующий день, а в выходные действует курс пятницы. Если документ датирован субботой или воскресеньем, программа берёт последний рабочий курс — это корректное поведение для учёта. Также проверьте, что загрузка курсов за нужный период вообще выполнялась.
Можно ли загрузить курсы за прошлый год?
Да, в обработке «Загрузка курсов валют» укажите произвольный период в прошлом — сервис ЦБ отдаёт исторические данные. Учтите, что загрузка большого периода занимает время, а изменение курсов в закрытых периодах может потребовать перепроведения переоценки.
Что делать, если загрузка завершается ошибкой соединения?
Проверьте доступ в интернет с того компьютера или сервера, где выполняется загрузка, настройки прокси в разделе «Администрирование → Общие настройки» и не блокирует ли файрвол обращение к сайту ЦБ. В клиент-серверном варианте интернет нужен именно серверу 1С, а не клиентским машинам.
Как получить курс на дату, когда записи в регистре нет?
Функция ПолучитьКурсВалюты и срез последних автоматически возвращают ближайший ранний курс — отдельная запись на каждую дату не нужна. Если ранних записей нет вообще, функция вернёт нулевые курс и кратность, поэтому перед пересчётом проверяйте результат.
Чем отличается курс ЦБ от курса конверсии в договоре?
Договорная конверсия (например, оплата в рублях по курсу USD + наценка) реализуется через настройку договора или зависимую валюту в справочнике, а не через изменение регистра «Курсы валют». Не подменяйте официальный курс договорным — это исказит переоценку валютных обязательств.