Как правильно рассчитать курс валюты в 1С, используя реквизиты 'Курс' и 'Кратность'?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет
← На главную

При работе с валютными операциями в 1С многие разработчики сталкиваются с регистром сведений КурсыВалют. На первый взгляд, все просто, но наличие двух реквизитов — Курс и Кратность — часто вызывает путаницу. Какой из них использовать? Или нужно использовать оба? В этой статье мы подробно разберем, для чего предназначен каждый из этих реквизитов, и научимся правильно рассчитывать итоговый курс для корректной конвертации сумм, проводя быстрый анализ данных в контексте решаемой задачи.

Разбираемся в реквизитах 'Курс' и 'Кратность'

Давайте проанализируем, какую информацию хранят эти два ключевых поля в регистре сведений КурсыВалют. Понимание их назначения — ключ к правильным расчетам.

Кратность — это количество единиц иностранной валюты, для которого установлен курс. В большинстве случаев для популярных валют, таких как доллар США (USD) или евро (EUR), кратность равна 1.

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

Рассмотрим на простых примерах:

Зачем же нужна кратность, если она почти всегда равна единице?

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

Проанализируем ситуацию с японской иеной:

Предположим, курс одной иены составляет 0.58 рубля. Хранить такое значение с большим количеством знаков после запятой (например, 0.581234) не очень удобно и может приводить к ошибкам округления при расчетах. Чтобы избежать этого, в 1С используется кратность. Вместо того чтобы устанавливать курс для 1 иены, система устанавливает курс, например, для 100 иен.

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

Формула для правильного расчета курса

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

Формула для итогового курса:

ИтоговыйКурс = Курс / Кратность

Формула для пересчета суммы в основную валюту:

СуммаВОсновнойВалюте = СуммаВИностраннойВалюте * Курс / Кратность

Важный момент: перед делением всегда проверяйте, что Кратность не равна нулю, чтобы избежать ошибки "Деление на ноль".

Пример получения курса с помощью запроса

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

Предположим, нам нужно получить курс на определенную дату.


// Входные данные
НужнаяДата = '20231027';
НужнаяВалюта = Справочники.Валюты.НайтиПоКоду("840"); // Код USD

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

Запрос.УстановитьПараметр("Дата", НужнаяДата);
Запрос.УстановитьПараметр("Валюта", НужнаяВалюта);

Выборка = Запрос.Выполнить().Выбрать();

// Обрабатываем результат
Если Выборка.Следующий() Тогда
    КурсИзРегистра = Выборка.Курс;
    КратностьИзРегистра = Выборка.Кратность;
    
    // Проверяем кратность на ноль
    Если КратностьИзРегистра > 0 Тогда
        ИтоговыйКурс = КурсИзРегистра / КратностьИзРегистра;
        Сообщить("Итоговый курс на " + Формат(НужнаяДата, "ДФ=dd.MM.yyyy") + " составляет: " + ИтоговыйКурс);
    Иначе
        Сообщить("Ошибка: для валюты " + НужнаяВалюта + " не задана кратность!");
    КонецЕсли;
Иначе
    Сообщить("На дату " + Формат(НужнаяДата, "ДФ=dd.MM.yyyy") + " курс для валюты " + НужнаяВалюта + " не найден!");
КонецЕсли;

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

Использование стандартных функций 1С

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

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

Эта функция принимает на вход ссылку на валюту и дату, а на выходе возвращает уже готовый, рассчитанный курс (т.е. результат деления Курс / Кратность).

Посмотрим на пример использования такой функции:


// Входные данные
ДатаКурса = ТекущаяДата();
ВалютаДоллар = Справочники.Валюты.НайтиПоНаименованию("Доллар США");

Если ЗначениеЗаполнено(ВалютаДоллар) Тогда
    // В разных конфигурациях функция может находиться в разных общих модулях.
    // Например, РаботаСКурсамиВалют.ПолучитьКурсВалюты(...)
    // Здесь для примера приведена общая концепция.
    
    ИтоговыйКурс = РаботаСКурсамиВалют.ПолучитьКурсВалюты(ВалютаДоллар, ДатаКурса);
    
    Если ИтоговыйКурс > 0 Тогда
         СуммаВал = 100; // 100 USD
         СуммаРуб = СуммаВал * ИтоговыйКурс;
         Сообщить("100 USD по курсу " + ИтоговыйКурс + " = " + СуммаРуб + " RUB");
    Иначе
        Сообщить("Не удалось получить курс для валюты на указанную дату.");
    КонецЕсли;

Иначе
    Сообщить("Валюта 'Доллар США' не найдена в справочнике.");
КонецЕсли;

Вывод:

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

← На главную