Настройка геолокации на 1С-Битрикс
Геолокация в Битриксе нужна для двух принципиально разных задач: определить физическое местоположение пользователя по IP (серверная сторона) или получить точные GPS-координаты с его устройства (браузерная сторона). Оба инструмента используются вместе в e-commerce — первый для предварительного определения города, второй для «найти ближайший магазин».
Серверное определение региона по IP
Битрикс не включает базу GeoIP в дистрибутив. Варианты:
MaxMind GeoIP2 — индустриальный стандарт. Бесплатная база GeoLite2-City обновляется еженедельно, точность для России — 85-90% на уровне города. Платная GeoIP2-City — точнее. Установка: скачиваете .mmdb файл, подключаете через composer require geoip2/geoip2, используете в PHP.
Sypex Geo — российская база, лучше работает по СНГ. Есть PHP-класс без composer-зависимостей, что удобно для старых инсталляций.
DaData API — облачный сервис, не требует локальной базы. Запрос к API при каждом новом IP. Подходит при невысокой нагрузке.
Интеграция в Битрикс через init.php:
AddEventHandler("main", "OnPageStart", function() {
if (!isset($_SESSION['USER_REGION'])) {
$ip = $_SERVER['REMOTE_ADDR'];
// Убираем IPv6 mapped IPv4
$ip = str_replace('::ffff:', '', $ip);
$reader = new \GeoIp2\Database\Reader('/path/to/GeoLite2-City.mmdb');
try {
$record = $reader->city($ip);
$_SESSION['USER_REGION'] = [
'city' => $record->city->name,
'city_ru' => $record->city->names['ru'] ?? '',
'lat' => $record->location->latitude,
'lng' => $record->location->longitude,
];
} catch (\Exception $e) {
$_SESSION['USER_REGION'] = ['city' => 'Москва'];
}
}
});
Результат кешируется в сессии — не стоит делать запрос к GeoIP на каждый хит.
Интеграция с модулем Location Битрикса
Модуль sale содержит таблицу b_sale_location с иерархией: страна → регион → город. Это внутренний справочник Битрикса для расчёта доставки. При определении города по GeoIP нужно найти соответствующую запись в b_sale_location:
$city = \Bitrix\Sale\Location\Search\Finder::find([
'select' => ['ID', 'NAME.NAME', 'CODE'],
'filter' => ['NAME.NAME' => $detectedCityName, 'NAME.LANGUAGE_ID' => 'ru'],
]);
Если совпадение найдено — сохраняете LOCATION_CODE в сессию/cookie. Этот код используется в компоненте bitrix:sale.location.selector.system и в расчёте стоимости доставки.
Браузерная геолокация: Geolocation API
HTML5 Geolocation API — для точного позиционирования. Требует разрешения пользователя и работает только по HTTPS:
navigator.geolocation.getCurrentPosition(
function(position) {
const lat = position.coords.latitude;
const lng = position.coords.longitude;
// Отправляем координаты на сервер
fetch('/local/ajax/set_location.php', {
method: 'POST',
body: JSON.stringify({ lat, lng }),
headers: { 'Content-Type': 'application/json' }
});
},
function(error) {
// Пользователь отказал — используем IP-геолокацию
}
);
На сервере по координатам делаете обратное геокодирование (reverse geocoding) через Яндекс.Геокодер или Google Maps Geocoding API. Яндекс.Геокодер предпочтительнее для российских адресов.
Попап подтверждения города
Стандартный UX: определяете город автоматически, показываете попап «Ваш город — %city%? Да / Нет, выбрать другой». При «Да» устанавливаете cookie user_city с длительным TTL (30 дней). При «Нет» — показываете поиск по городам.
В Битриксе компонент bitrix:sale.location.selector.system предоставляет готовый селектор. Но его визуальное оформление часто требует кастомизации шаблона под дизайн сайта.







