Композит (Static HTML Cache) — технология, которая разделяет страницу на «быструю» статическую оболочку и отложенные динамические фрагменты. Браузер получает готовый HTML-файл практически мгновенно, а динамика догружается AJAX-ом уже после первого рендера. В результате метрики TTFB/FP/Core Web Vitals улучшаются в разы.

1. Как это работает
Первый визит
- ядро собирает страницу как обычно;
- отмеченные динамические зоны вырезаются;
- в конец добавляется JS-загрузчик
frameCache
; - итоговый HTML сохраняется в
/bitrix/html_pages/...
.
Повторный визит
- Nginx/Apache отдаёт файл с диска за ≈20 мс;
- параллельно JS делает AJAX-запрос
/bitrix/tools/composite_data.php
, подменяя заглушки свежим HTML.
Заголовок X-Bitrix-Composite: Cache/NCC
подсказывает, откуда пришла страница (кэш или генерация).
2. Режимы работы
Режим | Когда использовать | Что делает |
---|---|---|
Автокомпозит | «Коробка», лендинги, сайты без кастомных шаблонов | Система сама помечает все компоненты как динамические; нужно лишь нажать «Включить». |
Ручной композит | Интернет-магазины, порталы с кастомным JS | Разработчик сам определяет границы динамики, TTL и заглушки. |
3. Включение технологии
- Админ-панель → Настройки → Настройки продукта → Композитный сайт.
- Выберите режим и нажмите «Включить».
- Настройте:
- список доменов;
- параметры URL, игнорируемые при формировании ключа кэша (например,
utm_*
); - тип хранилища (
files
,memcached
,APCu
).
После переключения режима обязательно очистите общий и компонентный кэш.
4. Разметка динамических зон
4.1. Внутри шаблона компонента
<?php
$frame = $this->createFrame()->begin(); // начало динамики
?>
<span id="cart-count"><?=$arResult['COUNT']?></span>
<?php
$frame->beginStub(); // заглушка
?>
<span id="cart-count">0</span>
<?php
$frame->end(); // конец динамики
?>
Метод createFrame()
доступен в любом шаблоне компонента Bitrix Framework.
4.2. Вне компонента (шапка, футер)
use Bitrix\Main\Page\Frame;
Frame::getInstance()->startDynamicWithID('header-auth');
// ... любой PHP/HTML с авторизацией ...
Frame::getInstance()->finishDynamicWithID('header-auth', '');
4.3. Дополнительные возможности
$frame = Bitrix\Main\Page\Frame::getInstance();
$frame->setAutoUpdate(false); // отключить AJAX-обновление, кэш только по TTL
$frame->setAutoUpdateTTL(120); // TTL файла-кэша 2 мин
4.4. Если компонент подключает ресурсы <head>
use Bitrix\Main\Page\{FrameStatic, AssetMode};
$area = new FrameStatic('workarea');
$area->setAssetMode(AssetMode::STANDARD);
$area->setStub('<!-- stub -->');
$area->startDynamicArea();
$APPLICATION->IncludeComponent('my:comp', '.default', []);
$area->finishDynamicArea();
5. Клиентские события frameCache
function initCounters() {
// ваш код
}
if (window.frameCacheVars) { // страница из кэша
BX.addCustomEvent('onFrameDataReceived', initCounters);
} else {
BX.ready(initCounters); // обычная загрузка
}
onFrameDataReceivedBefore
— до вставки всех блоков;onBeforeDynamicBlockUpdate
— перед заменой каждого блока;onFrameDataReceived
— после полной подмены.
6. Управление кэшем
- Очистить все HTML-файлы:
\Bitrix\Main\Data\StaticHtmlCache::getInstance()->deleteAll();
- Плановая очистка кроном:
/bitrix/modules/main/tools/cron_html_pages.php
. - Временно отключить композит для URL: добавить
?ncc=1
или вызвать$APPLICATION->SetPageProperty('ncc', 'y');
.
7. Частые ошибки и решения
Симптом | Причина | Исправление |
---|---|---|
Страница каждый раз пересохраняется | Случайные rand() , уникальные ID в HTML |
Перенесите уникальные фрагменты в динамическую зону |
«Прыжок» блока при подмене | Высота заглушки ≠ высоте контента | Задайте фиксированную высоту или CSS-анимацию |
Не работает в IE ≤ 9 | Ограничение по поддержке postMessage |
Для старых браузеров композит автоматически отключён |
Цифра корзины «моргает» | AJAX успевает позже визуала | Храните значение в BX.localStorage и показывайте сразу |
8. Ограничения по пользователям
Для гостей ставится cookie _CC
; для групп, исключённых из композита, — _NCC
. Так можно кешировать только анонимный трафик, оставив персональные разделы (корзина, кабинет) динамичными.
9. Инструменты разработчика
- Chrome расширение “Bitrix Composite” — подсвечивает состояние кэша и объясняет причину его сброса.
- Панель «Статистика и отладка» в админке → вкладка «Скорость сайта».
- Заголовок
X-Bitrix-Composite
в Network-панели браузера.
10. Мини-конфигурация Nginx
location / {
try_files /bitrix/html_pages/$host$uri_index@.html $uri $uri/ /index.php?$args;
}
location ~* @\.html$ {
add_header X-Bitrix-Composite "Cache";
expires 30m;
}
(Если вы используете BitrixVM ≥ 5.1, этот блок генерируется автоматически.)
11. Когда не стоит включать композит
- Страницы, полностью зависящие от пользователя: оформление заказа, «Мой профиль», поиск.
- Контент меняется чаще, чем TTL кэша.
- Приложения, где важнее точное время полной загрузки тяжёлых JS-бандлов, а не первый рендер.
Итоги
Технология «Композитный сайт» позволяет за пару кликов (или за несколько часов ручной разметки) сократить время первого отображения страницы до десятков миллисекунд, улучшить Core Web Vitals и конверсию. Используйте примеры из этого справочника, контролируйте заголовки и панель отладки — и ваш Bitrix-проект будет «летать», оставаясь динамичным там, где это действительно нужно.