Налаштування геолокації на 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 надає готовий селектор. Але його візуальне оформлення часто потребує кастомізації шаблона під дизайн сайту.







