Setting up Yandex.Turbo pages for 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
    1212
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Website development for FIXPER company
    815
  • 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
    565
  • 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
    657
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    980

Configuring Yandex Turbo Pages for 1C-Bitrix

Yandex Turbo pages are served from Yandex servers — this speeds up loading on mobile devices with slow internet. For an online store on Bitrix, this means Yandex must receive an RSS feed with Turbo markup and correctly parse the catalog structure. Main problem: RSS is generated without considering product images and structured data, and Yandex either denies connection or shows a "raw" page without formatting.

RSS Format for Turbo Pages

Yandex requires RSS 2.0 with the turbo: extension. Minimum set of fields for a product card:

<item turbo="true">
    <link>https://example.com/catalog/product/</link>
    <turbo:content><![CDATA[
        <header>
            <h1>Product Name</h1>
            <menu>
                <item url="/catalog/">Catalog</item>
                <item url="/catalog/section/">Section</item>
            </menu>
        </header>
        <figure>
            <img src="https://example.com/upload/iblock/xxx/photo.jpg" alt="Photo">
        </figure>
        <p>Product description</p>
        <div data-block="price">
            <span data-value="price">5990</span>
            <span data-value="currency">RUB</span>
            <a data-block="button" href="/cart/?add=ID">Buy</a>
        </div>
    ]]></turbo:content>
</item>

RSS Generation in Bitrix

A custom component or URL handler is created. Optimal — separate /turbo-feed.xml page with a component that selects infoblock elements and generates XML.

// /turbo-feed.xml
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', false);
header('Content-Type: application/rss+xml; charset=utf-8');

$res = \CIBlockElement::GetList(
    ['TIMESTAMP_X' => 'DESC'],
    ['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y'],
    false,
    ['nTopCount' => 200],
    ['ID', 'NAME', 'DETAIL_PAGE_URL', 'DETAIL_TEXT', 'DETAIL_PICTURE',
     'PREVIEW_TEXT', 'TIMESTAMP_X', 'IBLOCK_SECTION_ID']
);

echo '<?xml version="1.0" encoding="utf-8"?>';
echo '<rss xmlns:yandex="http://news.yandex.ru" xmlns:turbo="http://turbo.yandex.ru" version="2.0">';
echo '<channel>';
echo '<title>Product Catalog</title>';
echo '<link>' . SITE_SERVER_NAME . '</link>';

while ($el = $res->GetNextElement()) {
    $fields = $el->GetFields();
    $price = \CCatalogProduct::GetOptimalPrice($fields['ID']);
    $imgSrc = '';
    if ($fields['DETAIL_PICTURE']) {
        $img = \CFile::GetFileArray($fields['DETAIL_PICTURE']);
        $imgSrc = 'https://' . SITE_SERVER_NAME . $img['SRC'];
    }
    // ... forming item
}

Images: Absolute URLs Mandatory

Yandex does not accept relative paths in <img src> inside turbo:content. All images must have full URLs with protocol and domain. Helper function:

function absoluteImageUrl(string $src): string {
    if (strpos($src, 'http') === 0) return $src;
    return 'https://' . SITE_SERVER_NAME . $src;
}

RSS Feed Caching

RSS from 200 products on each request — significant load. Cache via Bitrix file cache:

$cache = \Bitrix\Main\Data\Cache::createInstance();
if ($cache->startDataCache(3600, 'turbo_feed', '/turbo')) {
    // RSS generation
    $xmlContent = generateFeed();
    $cache->endDataCache(['xml' => $xmlContent]);
} else {
    $xmlContent = $cache->getVars()['xml'];
}
echo $xmlContent;

On product update — clear via tag iblock_id_ + infoblock ID.

Connecting in Yandex Webmaster

After configuring the feed — add the URL to "Yandex Webmaster → Turbo Pages → RSS Channels." Yandex crawls the feed with up to 24-hour delay. Check via "Check Page" tool — it will show how Yandex sees each item and if there are markup errors. Typical errors: missing required data-block="price" attributes, non-absolute image URLs, HTML tags not in CDATA.