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

2 мин чтения

Релиз от 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-репозитории — чистые рефакторинги без изменения публичного контракта.

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

mail 26.900.0 Заметное Свежее

Mail 26.900.0: общие подписи ломают старый API, а тяжёлые вложения переезжают на Диск

Модуль mail получил один из самых жирных релизов за последнее время: 523 файла, +39 182/−3 131 строк. Внутри — три большие фичи (общие подписи, автоперенос тяжёлых вложений на Диск, избранное с AI-классификацией писем), переработанный IMAP-синк истории и три новые таблицы в БД. Если вы кастомизирова...

4 мин
main 26.700.0 Заметное Свежее

Main 26.700.0: в ядре появились фича-флаги

Битрикс выкатил main 26.700.0 — и это тот редкий случай, когда в ядре появляется целая новая подсистема: фича-флаги `Bitrix\Main\Config\Feature` с двумя таблицами в БД. Плюс несколько тихих поведенческих изменений, которые стоит проверить, если у вас не-UTF-8 сайт, кастомные фильтры пользователей ил...

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

Security 26.200.0 не ставится на маке и Windows: фатал «Cannot redeclare class» прямо в апдейтере

Обновление security 26.200.0 у нас не установилось вообще: апдейтер умирает с фаталом посреди своего скрипта. Если ваш прод на Linux — выдыхайте, вас это не касается. А вот если вы ставите обновления в локальной разработке на macOS или Windows (Docker с bind-mount проектной папки — это ровно тот слу...

4 мин
landing 26.1000.0 Заметное Свежее

Landing 26.1000.0: удалён Block::isContains, ссылки теперь режутся по белому списку схем

Обновление `landing` 26.1000.0 (сборка от 24.08.2026) — это на 90% security-хардening плюс новая песочница для превью страниц «на устройствах». Дифф огромный — 1300 файлов, +73 тысячи строк — но почти всё это пересобранные JS-бандлы, контентные блоки и webp вместо png. Содержательного PHP — примерно...

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

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

на связи

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

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

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

Войти