Налаштування регіональних цін на 1С-Бітрікс
Регіональне ціноутворення — одна з найскладніших тем у каталозі 1С-Бітрікс. «Показувати ціну залежно від регіону» — звучить просто, а на практиці перетинаються кілька механізмів: типи цін, групи користувачів, географічні групи та правила торгівлі. Розберемо, як це працює зсередини.
Механіка регіональних цін
У 1С-Бітрікс регіональні ціни реалізуються через поєднання двох інструментів:
Типи цін (b_catalog_price_type) — базовий механізм. Для кожного типу ціни задається доступність за групами користувачів. Приклади типів:
-
BASE— базова роздрібна ціна -
WHOLESALE— оптова -
MOSCOW— ціна для Москви -
REGIONS— ціна для регіонів
Правила торгівлі (b_sale_discount) — умовні знижки та націнки. Тут задається: якщо користувач із групи «Москва» — застосувати ціну типу MOSCOW або знижку X%.
Географічні групи — модуль sale.regions (входить до редакції Business). Визначає місцезнаходження користувача і автоматично додає його до відповідної групи 1С-Бітрікс.
Налаштування покроково
Крок 1. Створити типи цін для кожного регіону: Торговий каталог → Налаштування → Типи цін. Призначити права доступу — яка група користувачів бачить який тип ціни.
Крок 2. Заповнити ціни для кожного типу. Або вручну в картці товару, або через завантаження CSV/XML, або через синхронізацію з 1С з кількома типами цін.
Крок 3. Налаштувати визначення регіону. Варіанти:
- Автоматично за IP (модуль
sale+ база даних GeoIP MaxMind) - Через сесію: користувач обирає місто зі списку
- Через cookie:
$_COOKIE['BITRIX_SM_SALE_LOCATION']
Крок 4. Пов'язати регіон із групою користувачів через правило торгівлі:
// Програмне додавання користувача до групи за геолокацією
$locationCode = \Bitrix\Sale\Location\LocationTable::getLocationCityCode($cityId);
if (in_array($locationCode, ['0000073738', '0c5b2444b22d4d0fa32c11a4401d4c46'])) {
// Москва і МО — додаємо до групи 5
\CUser::SetUserGroup($userId, array_unique(array_merge($currentGroups, [5])));
}
Визначення ціни в запиті
При вибірці товарів важливо передавати коректну групу користувача для отримання потрібного типу ціни:
$userGroups = \Bitrix\Main\UserTable::getUserGroupIds($userId);
$products = \CCatalogProduct::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y'],
false,
false,
['ID', 'NAME', 'CATALOG_PRICE_1', 'CATALOG_PRICE_3'] // ID типів цін
);
// Або через GetPrice із зазначенням типу ціни
$price = \CCatalogProduct::GetOptimalPrice($productId, 1, $userGroups);
GetOptimalPrice повертає мінімальну ціну серед усіх типів, доступних групам користувача — це ключовий метод для регіональних цін.
Кешування та продуктивність
Регіональні ціни збільшують навантаження на кеш: один і той самий список товарів виглядає по-різному для різних регіонів. Використовують тегове кешування з включенням ідентифікатора регіону до ключа кешу:
$regionTag = 'region_' . \Bitrix\Sale\Location\LocationTable::getCurrentRegionCode();
$cacheId = 'catalog_section_' . $sectionId . '_' . $regionTag;
Терміни
| Конфігурація | Термін |
|---|---|
| 2–3 типи цін + ручний вибір регіону | 1–2 дні |
| Автовизначення регіону за IP + групи | 2–4 дні |
| Повне налаштування із синхронізацією цін з 1С | 4–7 днів |







