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

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

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

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

Наиболее надежным способом в типовых решениях (таких как УТ 11, ERP, БП 3.0) является использование функционала общих модулей. Разработчики конфигураций уже предусмотрели механизмы, которые учитывают не только курс, но и кратность валюты, а также обеспечивают корректную обработку исключительных ситуаций.

Для реализации этого подхода выполним следующие шаги:

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

Рассмотрим пример кода для реализации данного метода:


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

СуммаПлатежа = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту(
    СуммаВзаиморасчетов, 
    ВалютаВзаиморасчетов, 
    ВалютаДокумента, 
    КурсВзаиморасчетов, 
    КурсДокумента, 
    КратностьВзаиморасчетов, 
    КратностьДокумента
);

Этот метод предпочтителен, так как он гарантирует, что расчеты в ваших отчетах будут идентичны расчетам в типовых документах, а при обновлении конфигурации код сохранит свою работоспособность.

Вариант 2: Расчет через запрос к регистру «КурсыВалют»

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

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

Разберем логику запроса:


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

После того как мы получили данные в запросе, на этапе обработки результата или в вычисляемых полях СКД применяем формулу:

СуммаВРублях = (СуммаВВалюте * Курс) / Кратность

Почему важна «Кратность»?

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

Практический совет при работе с СКД

Если вы используете Систему компоновки данных (СКД), не обязательно выполнять умножение в тексте запроса. Вы можете добавить вычисляемое поле, где пропишете формулу Сумма * Курс / Кратность. Это решение позволит гибко настраивать отчет, сохраняя читаемость кода и снижая нагрузку на сервер приложения при формировании итогов и группировок.

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

← На главную