Налаштування автоматичного перерахунку цін за курсом валют 1С-Bitrix
Базові ціни в каталозі зберігаються в одній валюті, а курс змінюється щодня. Якщо ціни зафіксовані у EUR, а покупець платить у BYN — без автоматичного перерахунку менеджер буде щоутра вручну оновлювати тисячі позицій. Модуль currency у Bitrix розв'язує задачу конвертації на льоту, але реальний перерахунок збережених цін вимагає додаткового налаштування.
Конвертація на льоту 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 — дата, старий курс, новий курс, кількість оновлених позицій. При розборі розбіжностей у замовленнях цей лог буде єдиним джерелом істини.







