← Назад к вопросам
Пересчёт цен при изменении валюты
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
Формула пересчёта:
НоваяЦена = СтараяЦена × (НовыйКурс / СтарыйКурс)- Защита от деления на ноль
Полный пересчёт:
- Цены товаров
- Суммы по строкам
- Суммы НДС
- Итоги документа