← Назад к вопросам

Пересчёт цен при изменении валюты

2.0 Middle🔥 121 комментариев
#Регистры#Формы и интерфейс

Условие

Доработайте документ продажи — при изменении валюты документа автоматически пересчитывать цены в табличной части.

Требования:

  • Получение курса валюты на дату документа из регистра сведений "КурсыВалют"
  • Пересчёт цен всех строк табличной части
  • Пересчёт сумм по строкам
  • Обновление итогов документа

Формула пересчёта

НоваяЦена = СтараяЦена × (НовыйКурс / СтарыйКурс)

Пример

Было: Товар, 100 USD (курс 90 руб.) Стало: Товар, 9000 RUB (при смене валюты на рубли)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение: Пересчёт цен при изменении валюты

Процедура ПриИзменении_Валюта()
    
    // Старая валюта и новая валюта уже установлены в документе
    // Пересчитываем цены в табличной части
    
    Если НЕ ЗначениеЗаполнено(Валюта) Тогда
        Возврат;
    КонецЕсли;
    
    ПересчитатьЦены();
    ПересчитатьИтоги();
    
КонецПроцедуры

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

Функция ПолучитьКурсВалюты(Валюта, ДатаДокумента) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |\tКурсыВалют.Курс
        |ИЗ
        |\tРегистрСведений.КурсыВалют КурсыВалют
        |ГДЕ
        |\tКурсыВалют.Валюта = &Валюта
        |\tИ КурсыВалют.Дата <= &Дата
        |УПОРЯДОЧИТЬ ПО
        |\tКурсыВалют.Дата УБЫВ
        |КОЛИЧЕСТВО 1";
    
    Запрос.УстановитьПараметр("Валюта", Валюта);
    Запрос.УстановитьПараметр("Дата", ДатаДокумента);
    
    Результат = Запрос.Выполнить();
    
    Если Результат.Пусто() Тогда
        // Если курс не найден, возвращаем 1 (нейтральный курс)
        Возврат 1;
    Иначе
        Выборка = Результат.Выбрать();
        Выборка.Прочитать();
        Возврат Выборка.Курс;
    КонецЕсли;
    
КонецФункции

Процедура ПересчитатьИтоги()
    
    ОбщаяСумма = 0;
    ОбщаяСуммаНДС = 0;
    
    Для каждого СтрокаТовара Из Товары Цикл
        ОбщаяСумма = ОбщаяСумма + СтрокаТовара.Сумма;
        ОбщаяСуммаНДС = ОбщаяСуммаНДС + СтрокаТовара.СуммаНДС;
    КонецЦикла;
    
    СуммаДокумента = ОбщаяСумма;
    СуммаНДС = ОбщаяСуммаНДС;
    
КонецПроцедуры

Ключевые аспекты

Получение курса валюты:

  • Получаем курс из РегистрСведений "КурсыВалют"
  • Ищем курс на или перед датой документа
  • Защита: если курса нет, возвращаем 1

Формула пересчёта:

  • НоваяЦена = СтараяЦена × (НовыйКурс / СтарыйКурс)
  • Защита от деления на ноль

Полный пересчёт:

  • Цены товаров
  • Суммы по строкам
  • Суммы НДС
  • Итоги документа
Пересчёт цен при изменении валюты | PrepBro