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

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

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

Организация архитектуры: Клиент и Сервер

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

Для определения того, является ли валюта российским рублем, используйте метод ПредопределенноеЗначение("Справочник.Валюты.РоссийскийРубль"). Это позволит избежать лишних запросов к базе данных и корректно отработать на клиенте.

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

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


&НаСервере
Процедура ВалютаПриИзмененииСервер(НоваяВалюта)
    ДатаДокумента = ?(ЗначениеЗаполнено(Объект.Дата), Объект.Дата, ТекущаяДатаСеанса);
    КурсНовойВалюты = РаботаСКурсамиВалют.ПолучитьКурсВалюты(НоваяВалюта, ДатаДокумента);
    
    // Выполняем пересчет строк табличной части
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        СтрокаТЧ.Цена = СтрокаТЧ.Цена / КурсНовойВалюты;
        РаботаСДокументамиКлиент.РассчитатьСумму(СтрокаТЧ);
    КонецЦикла;
КонецПроцедуры

Как реализовать расчет «на лету» при заполнении документа

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

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

Важно помнить, что если валюта документа — РоссийскийРубль, коэффициент пересчета должен быть равен 1. Это предотвратит некорректные операции с ценами.

Важные рекомендации по учету

При реализации механизмов пересчета учитывайте следующие моменты:

Заключение

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

← На главную