Setting up pickup and delivery points in 1C-Bitrix

Our company is engaged in the development, support and maintenance of Bitrix and Bitrix24 solutions of any complexity. From simple one-page sites to complex online stores, CRM systems with 1C and telephony integration. The experience of developers is confirmed by certificates from the vendor.
Our competencies:
Development stages
Latest works
  • image_website-b2b-advance_0.png
    B2B ADVANCE company website development
    1175
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Website development for FIXPER company
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Development based on Bitrix, Bitrix24, 1C for the company Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    747
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    976

Setting Up Pickup and Parcel Lockers in 1C-Bitrix

Pickup and parcel lockers are delivery methods where the customer collects the order themselves. They reduce the store's operational costs and give the customer flexibility. In 1C-Bitrix this is implemented through the standard delivery module, but the specific scenario (single warehouse, multiple pickup points, or a third-party pickup network) requires different approaches.

Single-address pickup

The simplest case: one warehouse/store, one pickup address.

Shop → Settings → Delivery Services → Add → Manual (fixed price):

  • Price: 0 (or a nominal amount, e.g. 0)
  • Description: pickup address, business hours
  • Locations: required cities or the whole country

No APIs, no integrations — simply a service with zero price.

Multiple pickup points

When there are multiple points, the customer needs a choice. Implementation: a list of addresses in the delivery method selection form.

Points are stored in an info block (e.g., PICKUP_POINTS) with properties: name, address, coordinates, business hours, additional conditions. The delivery component template outputs the list via CIBlockElement::GetList.

// In the delivery component template
$pickupPoints = \CIBlockElement::GetList(
    ['SORT' => 'ASC'],
    ['IBLOCK_ID' => PICKUP_POINTS_IB_ID, 'ACTIVE' => 'Y'],
    false,
    false,
    ['ID', 'NAME', 'PROPERTY_ADDRESS', 'PROPERTY_WORKING_HOURS', 'PROPERTY_LAT', 'PROPERTY_LON']
);

while ($point = $pickupPoints->Fetch()) {
    // Output list of points with a map
}

The selected point ID is saved to the order property PICKUP_POINT_ID. In the admin panel the manager can see which point the order is directed to.

Partner pickup network on a map

For stores using CDEK, Boxberry, parcel locker networks, etc. — the widgets of these services are embedded in the delivery component template. When a specific delivery service is selected at checkout, a map with pickup points appears.

// Switch between maps when selecting a delivery service
document.querySelectorAll('[name="DELIVERY_ID"]').forEach(radio => {
    radio.addEventListener('change', function() {
        // Hide all maps
        document.querySelectorAll('.pvz-map').forEach(m => m.style.display = 'none');

        // Show map for the selected service
        const mapEl = document.getElementById('pvz-map-' + this.value);
        if (mapEl) mapEl.style.display = 'block';
    });
});

Order ready for pickup notification

With pickup, the customer must be notified when the order is ready for collection. This is done via the order status change event:

// In the OnSaleStatusOrder event handler
if ($newStatus === 'READY_FOR_PICKUP') {
    $deliveryId = $order->getPropertyValueByCode('PICKUP_POINT_ID');
    $this->sendReadyNotification($order, $deliveryId);
}

The notification template contains the point address, business hours, and storage period (usually 7–14 days). It is sent by email and SMS via standard 1C-Bitrix events.

Order storage: deadline and reminder

With pickup, the order waits for the customer at the point. If it is not collected within 7 days — the manager must receive a reminder. A 1C-Bitrix agent runs daily to check orders with the status "Ready for pickup" and a date older than N days, and sends a reminder to the manager and customer.

public static function checkExpiredPickups(): string
{
    $expiryDays = \Bitrix\Main\Config\Option::get('my_shop', 'pickup_expiry_days', 7);
    $expiryDate = (new \DateTime())->modify("-{$expiryDays} days")->format('Y-m-d H:i:s');

    $orders = \Bitrix\Sale\Internals\OrderTable::getList([
        'filter' => [
            'STATUS_ID'   => 'READY_FOR_PICKUP',
            '<DATE_UPDATE' => $expiryDate,
        ],
    ])->fetchAll();

    foreach ($orders as $order) {
        // Send reminder to customer and manager
        self::sendExpiredNotification($order['ID']);
    }

    return __CLASS__ . '::checkExpiredPickups();';
}

Pickup point map on the "Delivery" page

In addition to checkout, a map with pickup points is placed on the "Delivery and Payment" page. The customer can choose a convenient point before starting the checkout process. The component is built on the pickup points info block with output on Yandex Maps or Leaflet + OpenStreetMap.

Implementation timelines

Single pickup address — 2–3 hours. Multiple points with map, selection, and notification — 2 days. Integration with a third-party pickup widget (CDEK, Boxberry) — 2–3 days.