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

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Интеграция 1С-Битрикс с Яндекс.Картами
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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 Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

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