Настройка автоматического пересчёта цен по курсу валют 1С-Битрикс
Базовые цены в каталоге хранятся в одной валюте, а курс меняется каждый день. Если цены зафиксированы в EUR, а покупатель платит в BYN — без автоматического пересчёта менеджер будет каждое утро вручную обновлять тысячи позиций. Модуль currency в Битрикс решает задачу конвертации на лету, но реальный пересчёт хранимых цен требует дополнительной настройки.
Конвертация на лету vs. пересчёт хранимых цен
Это две принципиально разные стратегии.
Конвертация на лету — цена хранится в исходной валюте (EUR), а при показе пользователю конвертируется по текущему курсу из b_catalog_currency_rate. Метод CCurrencyRates::ConvertCurrency(100, 'EUR', 'BYN') делает это в одну строку. Преимущество: не нужно ничего пересчитывать. Недостаток: цена «плавает», покупатель видит разные суммы в разное время дня.
Пересчёт хранимых цен — агент забирает курс и обновляет значения в b_catalog_price для целевого типа цены. Покупатель видит стабильную цену до следующего пересчёта. Подходит для B2B, где контрагенты ожидают фиксированный прайс-лист на день.
Настройка обновления курсов
Прежде чем пересчитывать цены, убедитесь, что курсы обновляются автоматически. Модуль currency поддерживает провайдеры ЦБ РФ и ECB. Для НБ РБ (nbrb.by) и других банков нужен кастомный провайдер — класс, реализующий \Bitrix\Currency\RateProvider.
Агент обновления курсов: \Bitrix\Currency\CurrencyManager::updateCurrencyRates(). Запускается через cron (cron_events.php). Без cron агент выполняется только при хитах — на ненагруженном B2B-портале курс может не обновиться до обеда.
Реализация пересчёта через агент
Создайте агент, который после обновления курса пересчитывает целевой тип цены:
-
Получить текущий курс:
CCurrencyRates::GetConvertFactor('EUR', 'BYN'). -
Выбрать товары с ценами в исходной валюте: запрос к
\Bitrix\Catalog\PriceTable::getList()с фильтром поCATALOG_GROUP_ID(тип цены) иCURRENCY. - Рассчитать новую цену: умножить базовую цену на курс, округлить по правилам валюты.
-
Записать в целевой тип цены:
\Bitrix\Catalog\PriceTable::update()для существующих записей.
Округление — задаётся в настройках валюты. Для BYN обычно до копеек (2 знака). Для оптовых цен может потребоваться округление до целых рублей: round($price, 0).
Агент должен работать пакетно — по 500 товаров за итерацию, чтобы не упереться в max_execution_time. Используйте \Bitrix\Main\Application::getConnection()->startTransaction() для атомарности обновления.
Контроль и уведомления
Добавьте проверку аномалий: если курс изменился более чем на 5% за сутки — не обновляйте цены автоматически, а отправьте уведомление администратору через \Bitrix\Main\Mail\Event::send(). Это защитит от ошибочных данных провайдера курсов.
Лог пересчёта записывайте в \Bitrix\Main\Diag\FileLogger — дата, старый курс, новый курс, количество обновлённых позиций. При разборе расхождений в заказах этот лог будет единственным источником правды.







