Настройка отображения контента по региону 1С-Битрикс
Когда геолокация определила регион пользователя, нужно на его основе менять контент: цены, телефоны, баннеры, условия доставки, ассортимент. В Битриксе нет единого механизма «региональный контент» — это набор паттернов, каждый из которых применяется для своего типа данных.
Региональные цены через типы цен каталога
Самый востребованный сценарий в e-commerce. Модуль catalog поддерживает несколько типов цен (b_catalog_price_type): «Розница Москва», «Розница Регионы», «Оптовая» и т.д. Каждый тип цены привязывается к группам пользователей.
Логика: пользователь из Москвы → группа msk_users → тип цены retail_msk. При определении региона через IP или выборе города добавляете пользователя в нужную группу (CUser::SetUserGroup() или через сессию) или устанавливаете тип цены напрямую:
// В init.php или компоненте после определения региона
$regionPriceType = getRegionPriceType($_SESSION['USER_REGION']['city']);
define('REGION_PRICE_TYPE', $regionPriceType);
В компоненте каталога передаёте PRICE_ID = REGION_PRICE_TYPE — компонент bitrix:catalog.element и bitrix:catalog.section используют этот параметр для выборки нужной цены из b_catalog_price.
Региональный текстовый контент
Телефоны, адреса, условия доставки — чаще всего меняются по региону. Два подхода:
Инфоблок «Регионы» с привязкой контента к каждому региону. Свойства: CITY_CODE, PHONE, OFFICE_ADDRESS, DELIVERY_DESCRIPTION. В шаблоне запрашиваете элемент с фильтром по коду региона:
$regionData = CIBlockElement::GetList(
[],
['IBLOCK_ID' => REGIONS_IBLOCK_ID, 'PROPERTY_CITY_CODE' => $_SESSION['USER_REGION']['city_code']],
false,
['nTopCount' => 1]
);
Параметры сайта (b_option) с суффиксом региона: phone_msk, phone_spb. Проще для небольшого числа регионов, неудобно при масштабировании.
Для регионального контента на страницах используйте условные блоки в шаблоне — проверяете $_SESSION['USER_REGION']['city_code'] и выводите соответствующий блок. Для кешируемых компонентов это проблема: кеш не должен быть общим для разных регионов.
Кеширование и регионы: критичный момент
Кеш компонента в Битриксе ключуется по параметрам компонента и URL. При региональном контенте кеш должен быть разным для разных регионов, иначе первый пользователь из Москвы «закеширует» московский контент для всех.
Решение: добавьте регион в ключ кеша через CACHE_ADDITIONAL_ID:
$APPLICATION->IncludeComponent('bitrix:news.list', '.default', [
'CACHE_TYPE' => 'A',
'CACHE_TIME' => 3600,
'CACHE_ADDITIONAL_ID' => $_SESSION['USER_REGION']['city_code'] ?? 'default',
// ...
]);
Или отключите кеш для региональных блоков (CACHE_TYPE = 'N') — только для тех компонентов, где контент реально меняется по региону. Кеш остального контента не трогайте.
Региональные баннеры и акции
Баннеры и промо-блоки с региональной привязкой — через инфоблок с свойством REGIONS (тип «Привязка к инфоблоку» или список). В компоненте фильтруете по текущему региону:
$filter = [
'IBLOCK_ID' => BANNERS_IBLOCK_ID,
'ACTIVE' => 'Y',
[
'LOGIC' => 'OR',
'PROPERTY_REGIONS' => $_SESSION['USER_REGION']['city_code'],
'PROPERTY_REGIONS' => 'all', // Баннеры для всех регионов
]
];
Для баннеров кеш обязательно ключуйте по региону — иначе московский баннер увидят пользователи из Новосибирска.
Региональная доставка
Условия доставки по регионам управляются в модуле sale через службы доставки (b_sale_delivery_service) и их зоны. Стоимость доставки рассчитывается на основе LOCATION_CODE из b_sale_location. При правильно настроенном определении региона и привязке к b_sale_location расчёт доставки работает автоматически.







