Настройка региональных цен на 1С-Битрикс
Региональное ценообразование — одна из самых запутанных тем в Битрикс-каталоге. «Показывать цену в зависимости от региона» — звучит просто, а на практике пересекаются несколько механизмов: типы цен, группы пользователей, географические группы и правила торговли. Разберём, как это работает изнутри.
Механика региональных цен
В Битрикс региональные цены реализуются через комбинацию двух инструментов:
Типы цен (b_catalog_price_type) — базовый механизм. Для каждого типа цены задаётся доступность по группам пользователей. Пример типов:
-
BASE— базовая розничная цена -
WHOLESALE— оптовая -
MOSCOW— цена для Москвы -
REGIONS— цена для регионов
Правила торговли (b_sale_discount) — условные скидки и наценки. Здесь задаётся: если пользователь из группы «Москва» — применить цену типа MOSCOW или скидку X%.
Географические группы — модуль sale.regions (входит в редакцию Business). Определяет местоположение пользователя и автоматически добавляет его в соответствующую группу Битрикс.
Настройка пошагово
Шаг 1. Создать типы цен под каждый регион: Торговый каталог → Настройки → Типы цен. Назначить права доступа — какая группа пользователей видит какой тип цены.
Шаг 2. Заполнить цены для каждого типа. Либо вручную в карточке товара, либо через загрузку CSV/XML, либо через 1С-синхронизацию с несколькими типами цен.
Шаг 3. Настроить определение региона. Варианты:
- Автоматически по IP (модуль
sale+ GeoIP база данных MaxMind) - Через сессию: пользователь выбирает город из выпадающего списка
- Через куку:
$_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 дней |







