Інтеграція 1С-Бітрікс з Яндекс.Картами
На сторінці контактів — статичне зображення карти замість інтерактивної. У розділі доставки немає можливості вибрати зону. Менеджер не бачить на карті замовлення за районами. Яндекс.Карти API v3 закриває всі ці задачі, але інтеграція вимагає правильної роботи з ключами API і серверною логікою геозон.
API Яндекс.Карт: версії та ключі
Актуальна версія — JavaScript API 3.0 (jsapi v3). Версія 2.1 застаріла, Яндекс припинить підтримку. Для роботи потрібен API-ключ у консолі розробника Яндекса (developer.tech.yandex.ru). Ключ прив'язується до домену. Зберігаємо в COption::GetOptionString('site', 'ymaps_api_key').
Базове підключення карти
<!-- У шаблоні компонента -->
<div id="ymap-container" style="width:100%;height:400px"></div>
<script src="https://api-maps.yandex.ru/v3/?apikey=<?= COption::GetOptionString('site', 'ymaps_api_key') ?>&lang=ru_RU"></script>
<script>
ymaps3.ready.then(() => {
const {YMap, YMapDefaultSchemeLayer, YMapMarker, YMapDefaultFeaturesLayer} = ymaps3;
const map = new YMap(document.getElementById('ymap-container'), {
location: { center: [37.617644, 55.755819], zoom: 10 }
});
map.addChild(new YMapDefaultSchemeLayer());
map.addChild(new YMapDefaultFeaturesLayer());
// Маркер з налаштувань інфоблоку
const marker = new YMapMarker({coordinates: [<?= $lon ?>, <?= $lat ?>]});
map.addChild(marker);
});
</script>
Координати офісу/магазину зберігаються у властивостях елемента інфоблоку (тип N для широти і довготи) або у користувацькій властивості типу MAP.
Геокодування адрес
При імпорті адрес або додаванні нового об'єкта (офіс, пункт видачі) — отримуємо координати через Geocoder API:
function geocodeAddress(string $address): ?array {
$apiKey = COption::GetOptionString('site', 'ymaps_api_key');
$url = 'https://geocode-maps.yandex.ru/1.x/?apikey=' . $apiKey
. '&geocode=' . urlencode($address) . '&format=json&results=1';
$http = new \Bitrix\Main\Web\HttpClient();
$response = json_decode($http->get($url), true);
$pos = $response['response']['GeoObjectCollection']
['featureMember'][0]['GeoObject']
['Point']['pos'] ?? null;
if (!$pos) return null;
[$lon, $lat] = explode(' ', $pos);
return ['lat' => (float)$lat, 'lon' => (float)$lon];
}
Результат кешуємо — повторне геокодування однієї адреси не потрібне. Кеш у b_cached_files через CPHPCache або в окремій таблиці.
Зони доставки
Завдання: при оформленні замовлення користувач клікає на карті або вводить адресу — система визначає зону доставки і вартість.
Крок 1. Зони доставки малюємо у вигляді полігонів і зберігаємо в інфоблоці як JSON-рядок з координатами вершин.
Крок 2. Серверна перевірка: чи потрапляє точка в полігон (алгоритм Ray Casting). PHP-реалізація:
function pointInPolygon(array $point, array $polygon): bool {
$x = $point['lon']; $y = $point['lat'];
$inside = false;
$n = count($polygon);
for ($i = 0, $j = $n - 1; $i < $n; $j = $i++) {
$xi = $polygon[$i]['lon']; $yi = $polygon[$i]['lat'];
$xj = $polygon[$j]['lon']; $yj = $polygon[$j]['lat'];
$intersect = (($yi > $y) !== ($yj > $y))
&& ($x < ($xj - $xi) * ($y - $yi) / ($yj - $yi) + $xi);
if ($intersect) $inside = !$inside;
}
return $inside;
}
Крок 3. Ajax-обробник у компоненті оформлення замовлення отримує адресу, геокодує її, визначає зону і повертає вартість доставки. Вартість підставляється у форму до оформлення.
Карта дилерів/магазинів
Поширена задача: карта з кластеризацією точок. З інфоблоку «Магазини» отримуємо всі активні елементи з координатами, передаємо на frontend як JSON:
$stores = CIBlockElement::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => STORES_IBLOCK_ID, 'ACTIVE' => 'Y'],
false, false,
['ID', 'NAME', 'PROPERTY_LAT', 'PROPERTY_LON', 'PROPERTY_ADDRESS', 'PROPERTY_PHONE']
);
// Формуємо GeoJSON Feature Collection
На frontend — YMapClusterer з пакета @yandex/ymaps3-clusterer для автоматичного групування маркерів при віддаленні.
| Завдання | Трудовитрати |
|---|---|
| Базова карта з маркерами | 4–6 год |
| Геокодування + кеш | 3–4 год |
| Зони доставки (полігони + серверна перевірка) | 8–12 год |
| Карта магазинів з кластеризацією | 6–8 год |







