При разработке отчетов или функционала для документов в 1С часто возникает задача пересчета суммы из валюты, отличной от национальной, в рубли. В этой статье мы разберем, как правильно реализовать такой расчет, чтобы данные были точными и соответствовали типовым механизмам платформы.
Наиболее надежным способом в типовых решениях (таких как УТ 11, ERP, БП 3.0) является использование функционала общих модулей. Разработчики конфигураций уже предусмотрели механизмы, которые учитывают не только курс, но и кратность валюты, а также обеспечивают корректную обработку исключительных ситуаций.
Для реализации этого подхода выполним следующие шаги:
МодульВалютногоУчета или ВалютыКлиентСервер).Рассмотрим пример кода для реализации данного метода:
СтруктураКурсаВалютаДокумента = МодульВалютногоУчета.ПолучитьКурсВалюты(ВалютаДокумента, ДатаРасхода);
КурсДокумента = СтруктураКурсаВалютаДокумента.Курс;
КратностьДокумента = СтруктураКурсаВалютаДокумента.Кратность;
СуммаПлатежа = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту(
СуммаВзаиморасчетов,
ВалютаВзаиморасчетов,
ВалютаДокумента,
КурсВзаиморасчетов,
КурсДокумента,
КратностьВзаиморасчетов,
КратностьДокумента
);
Этот метод предпочтителен, так как он гарантирует, что расчеты в ваших отчетах будут идентичны расчетам в типовых документах, а при обновлении конфигурации код сохранит свою работоспособность.
Если вы создаете простой отчет, где не требуется обращение к сложным общим модулям, можно получить данные напрямую из регистра сведений КурсыВалют. Для этого нам потребуется сделать два основных действия: получить курс через запрос и выполнить арифметическую операцию.
Важно помнить, что виртуальная таблица СрезПоследних требует указания периода. Использование &ТекущийПериод позволяет получить курс на конкретную дату документа, что критически важно для корректности отчетности за прошлые периоды.
Разберем логику запроса:
ВЫБРАТЬ
Тест.Ссылка,
Тест.ВалютаДокумента,
Тест.Сумма,
КурсыВалютСрезПоследних.Курс,
КурсыВалютСрезПоследних.Кратность
ИЗ
Документ.Тест КАК Тест
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.КурсыВалют.СрезПоследних(&ТекущийПериод, ) КАК КурсыВалютСрезПоследних
ПО
Тест.ВалютаДокумента = КурсыВалютСрезПоследних.Валюта
После того как мы получили данные в запросе, на этапе обработки результата или в вычисляемых полях СКД применяем формулу:
СуммаВРублях = (СуммаВВалюте * Курс) / Кратность
Многие начинающие разработчики забывают про поле Кратность, умножая сумму только на Курс. Это допустимо для валют с номиналом 1, но приведет к грубым ошибкам при расчете курсов валют, где номинал отличается от единицы (например, 100 единиц валюты). Обязательно включайте кратность в свои расчеты, чтобы избежать критических неточностей в финансовой отчетности.
Если вы используете Систему компоновки данных (СКД), не обязательно выполнять умножение в тексте запроса. Вы можете добавить вычисляемое поле, где пропишете формулу Сумма * Курс / Кратность. Это решение позволит гибко настраивать отчет, сохраняя читаемость кода и снижая нагрузку на сервер приложения при формировании итогов и группировок.
Таким образом, мы рассмотрели два основных пути решения задачи: использование встроенных процедур для сложных систем и прямой запрос к регистрам для быстрых отчетов. Выбирая любой из них, всегда помните о необходимости учета кратности и правильного выбора периода при получении курса валюты.