Setting up a one-page checkout 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
    1173
  • 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
    745
  • 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

Configuring Single-Page Order Checkout in 1C-Bitrix

Single-page checkout is the ONE_PAGE mode of the bitrix:sale.order.ajax component. All blocks (buyer details, delivery, payment) are displayed on one page and updated via AJAX when values change. The request to switch to this format typically follows analytics: a step-by-step checkout with 3–4 pages increases drop-off at each step, while a single-page format shortens the path from "Checkout" to "Pay".

Enabling ONE_PAGE Mode

In the component parameters on the checkout page:

$APPLICATION->IncludeComponent(
    'bitrix:sale.order.ajax',
    '',
    [
        'DELIVERY_MODE' => 'ONE_PAGE',
        'SHOW_DELIVERY_PICTURE' => 'Y',
        'SHOW_DELIVERY_DESCRIPTION' => 'N',
        'PAY_FROM_ACCOUNT' => 'N',
        'SHOW_VAT' => 'N',
    ]
);

In ONE_PAGE mode, the component sends an AJAX request on any field change (city change, delivery service selection) and updates the dependent blocks — delivery cost, available payment systems.

Configuring AJAX Block Updates

In the single-page checkout template, the orderAjax object handles AJAX updates — it is initialised in the order_ajax.php template file. When the "City" field changes, orderAjax.updateDelivery() is called, which:

  1. Fetches available delivery services for the given city via \Bitrix\Sale\Delivery\Services\Manager::getRestrictedObjectsList()
  2. Calculates the cost of each via \Bitrix\Sale\Delivery\Services\Base::calculate()
  3. Updates the delivery block without a page reload

If the calculation takes more than 1–2 seconds (for example, the external CDEK API responds slowly) — the user sees a loading spinner. This is normal, but it is worth adding a timeout and caching calculations by city code and cart weight.

Common ONE_PAGE Configuration Issues

Conflicts with SEO plugins. Single-page checkout loads blocks dynamically, so some SEO tools do not see the page content and add redundant meta tags. Solution: exclude the checkout page from indexing via robots.txt and <meta name="robots" content="noindex">.

Data loss on F5. When the page is refreshed on the single-page checkout, the standard component does not restore the entered data. This is a critical UX issue. Solution — save form data to localStorage on every field change and restore it on page load via JS.

Incorrect behaviour with multiple shipments. If the cart contains items with different delivery conditions, ONE_PAGE incorrectly displays the service list. This is a standard component limitation — such cases require custom development.

Configuration Timeline

Switching to ONE_PAGE mode and adapting the template to the design — 1–2 working days. Adding localStorage persistence, delivery calculation caching, and AJAX logic improvements — 2–4 days.