Інтеграція 1С-Бітрікс з Яндекс.Картами

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Інтеграція 1С-Бітрікс з Яндекс.Картами
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Інтеграція 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 год