Настройка автоопределения города пользователя 1С-Битрикс
Автоопределение города нужно, когда сайт работает в нескольких регионах: нужно подставить правильный город в шапке, показать актуальные цены и наличие, предложить ближайший магазин. В Битриксе это решается через встроенные механизмы геолокации или внешние геобазы.
Встроенный модуль геолокации Битрикса
Битрикс поставляется с модулем sale (интернет-магазин), который включает геолокацию. Настройки: Магазин → Настройки → Геолокация.
Модуль использует базу GeoIP (MaxMind GeoLite2 или платные версии). Файл базы подключается в настройках сайта. По IP пользователя определяются страна, регион, город.
Получение города программно:
$ip = \Bitrix\Main\Context::getCurrent()->getRequest()->getRemoteAddress();
// Встроенный определитель Битрикса
$location = \Bitrix\Sale\Location\GeoIp\Manager::getLocationByIp($ip, LANGUAGE_ID);
// $location['CITY_NAME'] — название города
// $location['REGION_NAME'] — название региона
// $location['COUNTRY_NAME'] — название страны
Если нужна только страна и город без привязки к модулю sale:
\Bitrix\Main\Loader::includeModule('sale');
$geo = \Bitrix\Sale\Location\GeoIp\Manager::getInfo($ip, 'ru');
Хранение выбранного города в сессии
Определённый (или выбранный вручную) город сохраняете в сессии:
// Запись
$_SESSION['USER_CITY'] = [
'ID' => $cityId,
'NAME' => $cityName,
'CODE' => $cityCode,
];
// Чтение в шаблоне
$currentCity = $_SESSION['USER_CITY'] ?? null;
Для авторизованных пользователей — дополнительно сохраняете в профиле пользователя через CUser::Update() с кастомным полем UF_CITY.
JavaScript-определение через браузер
Если пользователь разрешил доступ к геолокации — можно определить точнее через Geolocation API браузера, а затем преобразовать координаты в город (reverse geocoding):
navigator.geolocation.getCurrentPosition(async (pos) => {
const resp = await fetch('/local/ajax/detect-city.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
lat: pos.coords.latitude,
lng: pos.coords.longitude,
}),
});
const data = await resp.json();
if (data.city) showCityConfirmDialog(data.city);
});
Для reverse geocoding на стороне сервера используете API Яндекс.Геокодера или DaData:
// Яндекс Геокодер
$url = "https://geocode-maps.yandex.ru/1.x/?apikey={$key}&format=json"
. "&geocode={$lng},{$lat}&kind=locality&results=1&lang=ru_RU";
$response = json_decode(file_get_contents($url), true);
$city = $response['response']['GeoObjectCollection']['featureMember'][0]
['GeoObject']['name'] ?? null;
Подтверждение города пользователем
Автоопределение — это предположение, не факт. Всегда показывайте всплывающую плашку «Ваш город — Минск?» с кнопками «Да, верно» / «Выбрать другой». Без подтверждения в некоторых сценариях (особенно с VPN) город будет определён неверно, и пользователь увидит неактуальные данные.
Плашку показываете на первом посещении через проверку $_SESSION['CITY_CONFIRMED']. После подтверждения или выбора — ставите флаг и больше не показываете.
Связь города с разделами каталога и ценами
Если у вас мультирегиональный сайт, город связывается с:
- Сайтом Битрикса (multisite) — разные домены для разных городов
- Разделами инфоблока — цены из свойств с региональными ценами
-
Ценовыми группами
b_catalog_price_type— для каждого города своя группа цен
| Этап | Время |
|---|---|
| Настройка GeoIP-базы | 1–2 ч |
| Логика определения и хранения города | 3–4 ч |
| Браузерная геолокация + reverse geocoding | 3–5 ч |
| UI-плашка подтверждения города | 2–3 ч |
| Привязка к ценам / контенту | 4–8 ч |







