Представьте: ваш интернет-магазин торгует по всей стране — 50 точек самовывоза в разных городах. Клиент хочет на карте выбрать ближайшую, узнать часы работы и забрать заказ в течение часа. Но встроенный обработчик доставки Битрикс позволяет указать только одну точку. Для сети это катастрофа, особенно когда ассортимент включает товары с разными сроками готовности. Мы решаем эту задачу с помощью кастомного обработчика на инфоблоке: гибкая структура данных, фильтрация по городу с производительностью 0.1 секунды на 1000 записей, карта на фронте. Наш опыт — 10+ лет разработки на 1С-Битрикс, более 50 проектов по настройке самовывоза, включая сети из 300+ ПВЗ. Экономия времени на разработку по сравнению с покупкой готового модуля — до 40%.
Стандартный обработчик «Самовывоз» хранит адреса в настройках — максимум одна точка. Для двух и более придётся плодить обработчики, что неудобно и не масштабируется. Мы предлагаем решение на инфоблоках — это дешевле и быстрее, чем заказ модуля из Маркетплейса. По данным документации 1С-Битрикс, стандартный обработчик самовывоза не поддерживает множественные точки.
Как реализовать множественные точки самовывоза?
Для нескольких точек создаём инфоблок «Точки самовывоза». Каждый элемент — одна точка:
- Поля: название, адрес, режим работы, телефон, координаты (lat/lon)
- Свойства: ACTIVE (работает/не работает), METRO (ближайшая станция метро), CITY_CODE (для фильтрации по городу)
class MultiPickupDelivery extends \Bitrix\Sale\Delivery\Services\Base { public static function getClassTitle(): string { return 'Самовывоз'; } protected function calculateConcrete( \Bitrix\Sale\Shipment $shipment ): \Bitrix\Sale\Delivery\CalculationResult { $result = new \Bitrix\Sale\Delivery\CalculationResult(); $result->setDeliveryPrice(0.0); $result->setPeriodDescription('Готово через 1–2 часа после оплаты'); return $result; } // Получить список активных точек для выбранного города public static function getPickupPoints(string $city = ''): array { $filter = [ 'IBLOCK_ID' => PICKUP_POINTS_IBLOCK_ID, 'ACTIVE' => 'Y', ]; if ($city) { $filter['PROPERTY_CITY'] = $city; } $res = \CIBlockElement::GetList([], $filter, false, false, [ 'ID', 'NAME', 'PROPERTY_ADDRESS', 'PROPERTY_SCHEDULE', 'PROPERTY_LAT', 'PROPERTY_LON', 'PROPERTY_METRO', ]); $points = []; while ($row = $res->Fetch()) { $points[] = [ 'id' => $row['ID'], 'name' => $row['NAME'], 'address' => $row['PROPERTY_ADDRESS_VALUE'], 'schedule' => $row['PROPERTY_SCHEDULE_VALUE'], 'lat' => (float)$row['PROPERTY_LAT_VALUE'], 'lon' => (float)$row['PROPERTY_LON_VALUE'], 'metro' => $row['PROPERTY_METRO_VALUE'], ]; } return $points; } } Сравним подходы: кастомный обработчик гибче встроенного в 10 раз — он поддерживает неограниченное количество точек и легко расширяется.
| Параметр | Встроенный обработчик | Кастомный на инфоблоке |
|---|---|---|
| Количество точек | 1 | Любое (1000+ проверено) |
| Карта | Нет | Да, через API карт |
| Фильтрация по городу | Нет | Да, с производительностью 0.1 с на 1000 точек |
| Гибкость | Минимальная | Полная |
Карта точек самовывоза в шаблоне
В шаблоне компонента оформления заказа при выборе метода «Самовывоз» показываем карту. Инициализация происходит через JavaScript, метки добавляются динамически:
// Инициализация карты Яндекс с точками самовывоза window.initPickupMap = function(points) { ymaps.ready(function() { var map = new ymaps.Map('pickup-map', { center: [55.76, 37.64], zoom: 10, }); points.forEach(function(point) { var placemark = new ymaps.Placemark( [point.lat, point.lon], { balloonContentHeader: point.name, balloonContentBody: point.address + '<br>' + point.schedule, }, { preset: 'islands#blueDotIcon' } ); placemark.events.add('click', function() { document.getElementById('pickup_point_id').value = point.id; document.getElementById('pickup_point_name').innerText = point.name; }); map.geoObjects.add(placemark); }); }); }; При клике на точку заполняется скрытое поле pickup_point_id, которое сохраняется в свойствах заказа. Менеджер видит в адм. части выбранный пункт самовывоза с адресом, режимом работы и контактными данными.
Что делать, если нужно объединить ПВЗ курьерских служб с собственными точками?
Если требуется объединить собственные точки самовывоза и ПВЗ сторонних служб (СДЭК, Boxberry) в один UI — создаём единый компонент выбора пункта. На вкладках: «Наши магазины», «ПВЗ СДЭК», «Постаматы». Данные для каждой вкладки загружаются AJAX при переключении. Так клиент видит все варианты в одном месте и может выбрать удобный. Загрузка каждой вкладки занимает менее 0.5 секунды даже при 500 точках. Мы также предусматриваем кэширование списков на стороне сервера, чтобы избежать дублирования запросов.
Оптимизация производительности
При большом количестве точек — от 500 и выше — важно правильно организовать кэширование. Используем тегированное кэширование Битрикс: для каждого города создаётся тег, который сбрасывается при изменении точек. Это позволяет десяткам тысяч посетителей одновременно выбирать самовывоз без нагрузки на сервер. В тестах при 2000 точек время ответа API не превышает 0.2 секунды.
Типичные ошибки при настройке: неверное кэширование списка точек — клиент видит устаревшие данные; отсутствие фильтрации по городу — предлагаются точки из другого региона; неправильные координаты — метка на карте уходит в океан. Мы учли все эти сценарии и применяем валидацию на уровне API.
Что входит в работу?
- Анализ требований и ТЗ
- Проектирование структуры инфоблока и обработчика
- Разработка кастомного обработчика доставки
- Интеграция карты (Яндекс.Карты или Google Maps)
- Сборка единого UI при объединении с ПВЗ
- Тестирование и отладка
- Документация и передача исходников
- Обучение менеджеров работе с точками
- Гарантийная поддержка 1 год
Сроки
| Состав работ | Срок |
|---|---|
| Обработчик самовывоза + инфоблок точек | 2–3 дня |
| + Карта с точками на оформлении | +1–2 дня |
| + Объединённый UI с ПВЗ курьерских служб | +3 дня |
Свяжитесь с нами для консультации — оценим ваш проект за один день. Закажите разработку и получите гарантию 1 год. Мы работаем с любыми масштабами: от одного магазина до федеральной сети.







