В Битрикс валюта товара может задаваться на нескольких уровнях: в карточке самого товара, в настройках инфоблока, а также в зависимости от используемого торгового каталога и типа цены. Это создает путаницу, особенно при интеграции с внешними системами или при построении отчётности.
Если используется модуль Торговый каталог, валюта хранится в таблице b_catalog_price в поле CURRENCY. Чтобы получить её, достаточно выполнить запрос к этой таблице по ID товара и нужному типу цены. Например, при использовании ORM это будет \Bitrix\Catalog\PriceTable::getList([...])
с фильтром по PRODUCT_ID.
Если модуль не используется, цена может храниться в произвольном свойстве инфоблока. В этом случае валюта либо задается явно в отдельном свойстве, либо определяется на уровне бизнес-логики. Проверить наличие соответствующего свойства можно через CIBlockElement::GetProperty
с фильтром по коду свойства, например VALYUTA или CURRENCY.
При использовании торговых предложений (SKU) валюту необходимо определять для конкретного предложения, а не для родительского товара. SKU являются отдельными элементами, и цены к ним привязаны отдельно. Проверка осуществляется аналогично – через запрос к b_catalog_price по ID конкретного предложения.
Если в проекте реализована многовалютность, следует учитывать настройки модуля Валюта, в частности список доступных валют и базовую валюту сайта. Эти параметры задаются в административной части: Настройки → Настройки продукта → Валюты. Их также можно получить программно через \Bitrix\Currency\CurrencyTable
и \Bitrix\Currency\CurrencyManager
.
Где хранится информация о валюте товара в стандартной структуре Битрикс
Информация о валюте товара в стандартной установке Битрикс хранится не в инфоблоке, а в модуле торгового каталога (catalog). Основное хранилище – таблица b_catalog_price
, где указаны цены и валюты для каждого товара.
Ключевые поля таблицы b_catalog_price
:
Поле | Описание |
---|---|
PRODUCT_ID |
ID товара из инфоблока |
CATALOG_GROUP_ID |
Тип цены (розничная, оптовая и т.д.) |
PRICE |
Сумма |
CURRENCY |
Код валюты (например, RUB, USD, EUR) |
Для получения валюты товара программно используется метод CCatalogProduct::GetByID
или PriceTable::getList
. Более точная выборка осуществляется через \Bitrix\Catalog\PriceTable::getList
с фильтрацией по PRODUCT_ID
.
Если товар имеет несколько цен, валюта указывается отдельно для каждой записи. Вариантов указания валюты в свойствах инфоблока нет – это противоречит логике работы модуля catalog.
Коды валют определяются в таблице b_catalog_currency
. Для их отображения в нужном формате используется метод CCurrencyLang::GetFormatDescription
.
Изменение валюты происходит через административный интерфейс: «Торговый каталог» → «Типы цен» или «Валюты». Любые манипуляции напрямую с таблицами возможны, но не рекомендуются без предварительной синхронизации через API.
Как узнать валюту товара через административную панель
Откройте административную панель и перейдите в раздел «Каталог» – «Товары». Найдите нужный товар с помощью фильтра или поиска по названию или артикулу.
Нажмите на название товара, чтобы перейти в его карточку. В открывшейся форме найдите блок «Цены». Он может быть расположен в одной из вкладок, например, «Торговый каталог» или «Цены» – в зависимости от настроек интерфейса и версии Битрикс.
В блоке цен указывается стоимость и валюта. Валюта отображается рядом со значением цены, например: «1000 RUB» или «15 USD». Если используется несколько типов цен, валюта указывается отдельно для каждой.
При включенной интеграции с торговыми предложениями (SKU) валюту необходимо проверять отдельно для каждого предложения. Для этого откройте вкладку «Торговые предложения» и выберите нужное. В его карточке также отобразится блок с ценами и валютой.
Если блок с ценами отсутствует, убедитесь, что модуль «Торговый каталог» активен и у пользователя есть соответствующие права на просмотр цен.
Получение валюты товара через API Bitrix с использованием CIBlockElement
Для получения валюты товара через API Bitrix используется класс CIBlockElement
в связке с модулем каталога. Валюта хранится в ценах, а не в самом инфоблоке, поэтому основной запрос делается к ценам, а не к элементам.
- Убедитесь, что подключены модули:
iblock
catalog
if (!CModule::IncludeModule("iblock") || !CModule::IncludeModule("catalog")) { return; }
- Получите ID нужного элемента инфоблока:
$elementId = 123; // замените на актуальный ID товара
- Получите цену и валюту:
$arPrice = CPrice::GetBasePrice($elementId); if ($arPrice) { $currency = $arPrice["CURRENCY"]; }
- Альтернатива с выбором всех цен:
$res = CPrice::GetList([], ["PRODUCT_ID" => $elementId]); while ($arPrice = $res->Fetch()) { $currency = $arPrice["CURRENCY"]; // при необходимости обрабатывайте несколько валют }
Если используется торговый каталог с предложениями, предварительно получите ID товарного предложения и работайте с ним.
$offerId = CCatalogSku::GetProductInfo($elementId)["ID"];
$arPrice = CPrice::GetBasePrice($offerId);
$currency = $arPrice["CURRENCY"];
Для конвертации валют используйте CCurrencyRates
или CCurrencyLang
при отображении значений.
Определение валюты в заказе на основе связанного товара
В Битрикс валюта товара указывается в его торговом предложении (SKU) или непосредственно в карточке товара, если предложения не используются. Для определения валюты в заказе необходимо получить информацию о каждом товаре, входящем в заказ, и использовать валюту из его параметров.
Для получения валюты товара в заказе используйте следующий подход в обработчике события создания заказа или при его анализе:
1. Получите список позиций заказа через метод \Bitrix\Sale\Order::getBasket()
.
2. Пройдитесь по каждой позиции и получите ID товара с помощью getProductId()
.
3. Используя ID, выполните запрос к инфоблоку для получения свойства CATALOG_PRICE_ID
или PRICE_CURRENCY
, если используется модуль торгового каталога.
Пример получения валюты для позиции:
$basket = $order->getBasket();
foreach ($basket as $item) {
$productId = $item->getProductId();
$priceData = \CCatalogProduct::GetByID($productId);
$res = \CPrice::GetList([], ['PRODUCT_ID' => $productId]);
if ($price = $res->Fetch()) {
$currency = $price['CURRENCY'];
// используйте $currency для логики заказа
}
}
Если товары в заказе могут иметь разные валюты, необходимо принудительно приводить цены к валюте заказа через функцию \CCurrencyRates::ConvertCurrency()
до сохранения заказа.
Также рекомендуется явно указывать валюту в каждой позиции заказа при создании заказа вручную через API или в своих обработчиках событий, чтобы избежать конфликтов и ошибок при расчётах.
Особенности работы с мультивалютными каталогами
Для корректной работы необходимо:
1. Установить модуль «Валюта». Без него невозможна автоматическая конвертация. Курс можно задавать вручную или получать автоматически через агент.
2. Задать базовую валюту каталога. Это делается в настройках модуля «Торговый каталог». Все цены в базе хранятся именно в ней, независимо от отображаемой валюты на сайте.
5. Обновлять курсы валют регулярно. При ручной установке курсов стоит настроить агент или cron-задачу. В противном случае возможен некорректный пересчёт цен при колебаниях курса.
6. Учитывать валюту при импорте товаров. В XML-файлах (например, CommerceML) валюта указывается отдельно для каждой цены. Если валюта не совпадает с базовой, Битрикс пересчитает её по текущему курсу.
7. Избегать изменения базовой валюты после запуска проекта. Это приведёт к потере точности цен из-за пересчёта и может нарушить работу связанных модулей, особенно при наличии скидок и акций.
Как изменить отображаемую валюту без изменения базовой
- Настройте валюту отображения в компоненте каталога через параметр
CURRENCY
или аналогичный, если используете готовый шаблон. - При самостоятельной обработке цен выполните конвертацию вручную с помощью функции
CCurrencyRates::ConvertCurrency
. В неё передаётся цена, исходная валюта и целевая валюта для показа. - Для поддержки динамического выбора валюты добавьте в сессию или куки параметр с кодом валюты, который будет передаваться в конвертирующую функцию.
Проверка валюты товара в пользовательском шаблоне компонента
Для определения валюты товара в пользовательском шаблоне компонента необходимо получить информацию из массива $arResult. Обычно валюта хранится в поле PRICE
или в отдельном параметре, например CURRENCY
.
В шаблоне обратитесь к элементу массива с ценой товара: $arResult['ITEM']['PRICE']
. Валюта часто доступна в виде строки: $arResult['ITEM']['PRICE']['CURRENCY']
или $arResult['ITEM']['CURRENCY']
. Важно проверить структуру массива для конкретного компонента.
Для точной проверки используйте конструкцию:
if (!empty($arResult['ITEM']['PRICE']['CURRENCY'])) { $currency = $arResult['ITEM']['PRICE']['CURRENCY']; }
Если валюта отсутствует в данных товара, её можно получить из настроек инфоблока через API:
$iblockCurrency = CCurrency::GetByID($arResult['ITEM']['PRICE']['CURRENCY']);
Вопрос-ответ:
Где в Битрикс хранится информация о валюте товара?
Валюта товара в Битрикс задаётся в настройках торгового каталога. Конкретно, она связана с типом цены товара, где указывается валюта, например, рубли, доллары или евро. Обычно эта информация хранится в таблице, отвечающей за цены товаров, и к ней можно получить доступ через административную панель или API.
Как узнать валюту конкретного товара через административную панель Битрикс?
Для этого нужно зайти в раздел «Каталог» в административной части сайта, выбрать интересующий товар и открыть его карточку. В блоке с ценами указывается цена и валюта, связанная с этим товаром. Если используются несколько типов цен, валюты могут отличаться, тогда стоит проверить настройки каждого типа.
Можно ли программно определить валюту товара через API Битрикс?
Да, через API можно получить данные о цене и валюте товара. Например, с помощью метода \CIBlockElement::GetList можно получить свойства товара, включая цены, а затем проверить валюту, которая связана с определённым типом цены через класс \CCurrencyLang или \CCatalogCurrency. Это позволяет использовать валюту в своих скриптах и модулях.
Что делать, если у товара указана цена, но валюта не отображается?
Если валюта не видна в интерфейсе, возможно, она не задана для данного типа цены или отсутствует в настройках валют. Проверьте раздел «Настройки магазина» → «Валюты» и убедитесь, что валюта добавлена и активна. Также стоит проверить, установлен ли у товара правильный тип цены, к которому привязана валюта.
Можно ли изменить валюту товара после его создания и как это повлияет на цены?
Изменить валюту товара можно, изменив валюту у соответствующего типа цены. Это делается через настройки торгового каталога. При смене валюты цены автоматически не конвертируются, поэтому необходимо самостоятельно пересчитать цены и сохранить их в новой валюте. Иначе цены будут некорректными, что повлияет на расчёты и отображение на сайте.
Как узнать, в какой валюте задан товар в Битрикс?
В системе Битрикс валюта товара хранится в его настройках, в разделе цены. Чтобы определить валюту, нужно зайти в административную панель, открыть карточку товара и посмотреть поле с ценой — рядом обычно указывается код валюты (например, RUB, USD, EUR). Если валюту не видно напрямую, можно проверить настройки торгового каталога или валюты в модуле «Настройки» — там прописаны все доступные валюты и курсы, а также основная валюта сайта. При использовании API можно получить валюту товара через соответствующие свойства или методы, которые возвращают цену с указанием валюты.