Интеграция 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 ч |







