Location 26.300.0: батчевый обратный геокодинг — до 20 координат за один вызов

2 мин чтения
Узнавайте о ломающих изменениях Битрикса раньше, чем они доедут до прода: свежие разборы — в канале @bxmax_updates

Релиз от 17 июня 2026 с одной, но цельной темой: в модуль location завезли батчевый обратный геокодинг — метод findByCoordsList, который превращает список координат в список локаций за один вызов сервиса. Если вы строите интеграции с картами или доставкой и до сих пор дёргали findByCoords в цикле — это обновление для вас. Обратной несовместимости нет, миграций БД нет.

Новое: findByCoordsList сверху донизу

Добавлена целая цепочка — от публичного сервиса до реализаций в источниках:

  • Bitrix\Location\Repository\Location\Capability\IFindByCoordsList — новый интерфейс-capability с единственным методом findByCoordsList(array $coordsList, int $zoom, string $languageId): array.
  • LocationService::findByCoordsList(...) — публичная точка входа.
  • LocationService::MAX_BATCH_SIZE = 20 — публичный лимит размера батча.
  • LocationRepository::findByCoordsList(...) и стратегия Repository\Location\Strategy\Find::findByCoordsList(...) — маршрутизация до первого репозитория, который реализует новый интерфейс и проходит по IScope.
  • Реализации для OSM (Source\Osm\Repository) и Google (Source\Google\Repository).
  • В OSM API — новые методы reverseBatch() и detailsBatch(), работающие через actions шлюза Битрикса osmgateway.location.reverseBatch и osmgateway.location.detailsBatch.

Использование выглядит так:

        <?php declare(strict_types=1);

use Bitrix\Main\Loader;
use Bitrix\Location\Service\LocationService;

Loader::requireModule('location');

$coordsList = [
    ['lat' => 55.7558, 'lng' => 37.6173], // pickup
    ['lat' => 59.9343, 'lng' => 30.3351], // delivery
];

$locations = LocationService::getInstance()->findByCoordsList(
    $coordsList,
    zoom: 18,
    languageId: 'ru',
);

foreach ($locations as $key => $location) {
    if ($location === null) {
        // по этой точке ничего не нашлось — индекс сохранён
        continue;
    }
    // работаем с найденной локацией
}

    

Главное в контракте — результат выровнен по индексам входного массива: «не найдено» — это null на своей позиции, а не дырка в массиве. Удобно, когда координаты привязаны к заказам или точкам маршрута. Phpdoc ядра описывает контракт как index-aligned list (array<int, Entity\Location|null>), так что надёжнее передавать обычный числовой список, а свои ключи маппить снаружи.

Проверьте лимиты и валидацию на входе

Валидация строгая: больше 20 координат (MAX_BATCH_SIZE) или элемент без числовых lat/lng — и вы получите ArgumentException. Если точек больше — режьте на куски сами:

        foreach (array_chunk($coordsList, LocationService::MAX_BATCH_SIZE, true) as $chunk) {
    $result += $locationService->findByCoordsList($chunk, 18, 'ru');
}

    

И ещё один нюанс контракта: при внутреннем RuntimeException сервис не бросает исключение наружу, а возвращает null по всем позициям (array_fill_keys). То есть «весь батч из null» может означать как «ничего не нашлось», так и «источник упал» — закладывайтесь на это в логике.

Мелочи и находки

  • Батч работает только по внешним источникам. findByCoordsList жёстко использует LOCATION_SEARCH_SCOPE_EXTERNAL — локальный репозиторий БД в батчевом поиске не участвует.
  • Google «батчует» фиктивно. Реализация для Google — это цикл по одиночным findByCoords, то есть N HTTP-запросов; ошибки отдельных элементов уходят в ErrorService, а в результат идёт null. У OSM батч настоящий: до двух HTTP-запросов (reverseBatch + detailsBatch, второй пропускается, если первый ничего не нашёл) на весь список.
  • Таймауты для OSM подняли. Для батч-запросов HTTP-таймаут вырос с 10 до 60 секунд (HTTP_BATCH_TIMEOUT), появился приватный makeHttpClientWithTimeout().
  • Фича зависит от шлюза. Новые методы OSM опираются на серверные actions osmgateway.location.* — заработает только там, где шлюз Битрикса их уже поддерживает.
  • Breaking changes и deprecated отсутствуют: переформатирование LocationService::findByExternalId() и выделение приватного buildLocationFromDetails() в OSM-репозитории — чистые рефакторинги без изменения публичного контракта.

Новая версия вышла — разбор уже в Telegram

В канале @bxmax_updates публикуем каждый свежий разбор: что сломается, что устарело и что появилось в API. Узнаете до того, как обновите прод.

Подписаться

Читайте дальше

location 26.400.0 Заметное Свежее

Location 26.400.0: MapLibre GL для карты отметок в мобильном Битрикс24

Почти весь дифф location 26.400.0 — JavaScript карты отметок (check-in), которую показывает мобильный Битрикс24. У карты появился второй движок, MapLibre GL, он включается фича-флагом, а по умолчанию работает прежний Leaflet. PHP-API с [26.300.0](/bitrix-updates/location/location-26-300-0) не менялс…

2 мин
vote 26.300.0 Безопасность Свежее

Vote 26.300.0: список проголосовавших отдаётся только по подписи

В Vote 26.300.0 закрыли утечку списка проголосовавших через попап «Кто проголосовал», в том числе в анонимных опросах, и ужесточили права на удаление и сброс опросов в админском списке. Обновиться стоит всем, у кого на портале есть опросы. Если вы копировали к себе шаблон `.userfield` компонента `vo…

4 мин
translate 26.100.0 Безопасность Свежее

Translate 26.100.0: импорт CSV и редактор переводов больше не пишут за пределы разрешённых папок

В Translate 26.100.0 закрыли выход за пределы разрешённых папок при записи языковых файлов через редактор и CSV-импорт модуля «Перевод». Обновиться стоит всем, у кого модуль установлен. Публичный API не ломается, но CSV-импорт теперь пропускает файлы с путями вне разрешённых папок.

2 мин
timeman 26.300.0 Ломающее Свежее

Timeman 26.200.0–26.300.0: выключенный «Учёт рабочего времени» отключает REST timeman.*, перерывы за период отдаёт RecordProvider

Timeman 26.200.0 и 26.300.0 пришли в коробочный Битрикс24 в один прогон. В 26.200.0 модуль начал слушаться настройки портала: если инструмент «Учёт рабочего времени» выключен, перестают работать REST `timeman.*`, контроллеры и компоненты модуля, а уведомления не уходят. В 26.300.0 появился публичный…

2 мин
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.
AI Домовой

AI Домовой История

на связи

пишет…
Нет истории чатов
AI Домовой

Нужна авторизация

Войдите, чтобы задавать вопросы AI Домовому.

Войти