Цена в другой валюте неверная - разбор причин
Цены в дополнительной валюте выглядят странно: не совпадают с расчётом, отстают от курса или показываются в базовой валюте. Разбираем причины по убыванию частоты.
С чего начать
Смотрим валюты и их курсы:
\Bitrix\Main\Loader::includeModule('currency');
$rows = \Bitrix\Currency\CurrencyTable::getList([ 'select' => ['CURRENCY', 'BASE', 'AMOUNT', 'AMOUNT_CNT'],])->fetchAll();print_r($rows);// признак базовой валюты должен стоять ровно у одной записи// AMOUNT и AMOUNT_CNT задают курс по умолчанию для этой валютыБазовая валюта - опора всего пересчёта. Её отсутствие или вторая запись с тем же признаком ломают расчёт цен раньше, чем дело доходит до курсов.
Проверяем курс на нужную дату:
$rate = \CCurrencyRates::GetConvertFactor('USD', 'RUB');printf("текущий курс: %s\n", $rate);$rows = \CCurrencyRates::GetList('DATE_RATE', 'DESC', ['CURRENCY' => 'USD']);// при отсутствии курса на дату молча берётся курс валюты по умолчаниюКурс на дату и курс по умолчанию - разные величины. Пропуск в истории курсов не даёт ошибки: система тихо подставляет значение по умолчанию, и цены расходятся с ожидаемыми.
Смотрим, что показывает витрина:
// параметр компонента каталога отвечает за валюту показа'CONVERT_CURRENCY' => 'Y','CURRENCY_ID' => 'USD',// в административной части цены всегда показываются в базовой валютеВалюта показа задаётся параметром компонента и действует только на витрине. Административная часть всегда работает в базовой валюте, и сравнивать её числа с витриной напрямую нельзя.
Смотрим формат валюты:
$format = \CCurrencyLang::GetCurrencyFormat('USD');print_r($format); // число знаков, разделители и правило округленияprintf("%s\n", \CCurrencyLang::CurrencyFormat(1234.5, 'USD'));// расхождение в копейки почти всегда объясняется форматом, а не курсомФормат валюты отвечает за число знаков и округление при выводе. Пересчёт по курсу почти всегда даёт длинную дробь, и вид итогового числа определяет именно этот формат.
Причины
-
Курс на дату не загружен примерно 30% случаев
ПризнакЦены отстают от рынка или замерли на одном значении.
ПроверкаСмотрим историю курсов валюты и дату последней записи.
Что делатьНастраиваем регулярную загрузку курса: без свежей записи молча берётся курс по умолчанию.
-
Базовая валюта не задана или задана неверно примерно 25% случаев
ПризнакРасчёты цен ведут себя непредсказуемо во всём магазине сразу.
ПроверкаСмотрим список валют и признак базовой: он должен стоять ровно у одной.
Что делатьНазначаем базовую валюту: от неё считаются все курсы и все пересчёты цен.
-
Сравнивают витрину с административной частью примерно 20% случаев
ПризнакВ карточке товара одна сумма, в списке заказов другая, обе выглядят правильными.
ПроверкаСмотрим валюту показа у компонента каталога и валюту заказа.
Что делатьСравниваем однородные числа: административная часть показывает базовую валюту всегда.
-
Автозагрузка курса недоступна примерно 15% случаев
ПризнакКнопка запроса курса ничего не даёт или её нет в интерфейсе.
ПроверкаСмотрим базовую валюту и код валюты: автозагрузка работает не для любой пары.
Что делатьЗагружаем курсы своим заданием по расписанию из нужного источника.
-
Дело в округлении и формате примерно 10% случаев
ПризнакРасхождение в копейки при верном курсе и правильной валюте.
ПроверкаСмотрим формат валюты: число знаков после запятой и правила округления.
Что делатьПриводим формат к ожидаемому: пересчёт по курсу почти всегда даёт дробные значения.
Частые вопросы
Почему цена не изменилась после смены курса?
Страница отдаётся из кэша или курс загружен не на ту дату. Кэш сбрасывают, а историю курсов проверяют по датам записей.
Можно ли смотреть цены в другой валюте в админке?
Нет, административная часть всегда работает в базовой валюте. Валюта показа переключается только на витрине параметром компонента.
Что происходит при отсутствии курса на дату?
Пересчёт молча берёт курс валюты по умолчанию. Ошибки при этом не возникает, поэтому расхождение замечают по числам, а не по журналу.
Как загружать курсы автоматически?
Штатной загрузкой, если она доступна для вашей базовой валюты, либо своим заданием по расписанию из выбранного источника.
В какой валюте хранятся цены товаров?
В той, которая указана у самой цены. Пересчёт в валюту показа выполняется на лету, и хранимые значения при этом не меняются.
Смежное
- Цены и скидки - оглавление подтемы
- Валюты и курсы: несколько валют в магазине и пересчёт цен - как настраивают валюты
- Цена на витрине не та: разбор причин - когда дело не в валюте
- Типы цен: розница и опт, права групп, цена по количеству - откуда берётся сама цена
- НДС в каталоге и заказах: ставки, цена с налогом и доставка - соседний источник расхождений в копейках
- Кэш не срабатывает: страница собирается заново каждый раз - когда виноват кэш витрины
- Модуль «Валюты» - устройство валют целиком