Композит в Битрикс на живом проекте: что ломается
Композит включается за несколько минут, а потом в шапке застывает «Здравствуйте, Гость», и блок «Случайные товары» перестаёт меняться. Разбираем типовой магазин на Битриксе: три подхода, их цена и места, где всё ломается.

Включить композит в Битриксе можно за несколько минут. Дальше начинается то, что в документации занимает абзац, а на проекте несколько дней: в шапке застывает «Здравствуйте, Гость», счётчик корзины показывает чужое число, а «Случайные товары» на главной перестают меняться. Композитный кеш отдаёт страницу быстро, но не интересуется, кто её открыл. Ниже типовой интернет-магазин и порядок, в котором его безопаснее переводить на композит.
Условия примера и что мерить до включения
Пример собирательный: магазин на «1С-Битрикс: Управление сайтом», модуль main 23.x и новее, PHP 8.x. В шапке приветствие и мини-корзина, на главной блок со случайными товарами, в каталоге фильтр и сортировка, в подвале форма обратного звонка. Замеров «до и после» я не привожу: они зависят от железа, размера каталога и числа компонентов. Вместо выдуманных цифр вот как снять свои.
Возьмите три страницы: главную, раздел каталога и карточку товара. Для каждой замерьте время до первого байта на холодном и на тёплом кеше отдельно, по десять запросов, и сравните медианы:
curl -s -o /dev/null -w "ttfb: %{time_starttransfer}s total: %{time_total}s\n" https://example.com/catalog/Снимайте замеры с одного и того же сервера и при сопоставимой нагрузке. Ночной замер до и дневной после дадут ложный вывод.
Три подхода и их цена
| Подход | Что выигрываете | Чем платите | Кому подходит |
|---|---|---|---|
| A. Кеш компонентов без композита | Одинаковое поведение для всех посетителей, шаблоны не трогаем | Ядро и PHP стартуют на каждый хит, время ответа упирается в сборку страницы | Базовый уровень для любого проекта |
| B. Композит, хранилище в файлах | Статичная часть отдаётся готовым HTML, персональное догружается отдельно | Разметка динамических областей, диск под кеш, риск показать лишнее | Магазин или каталог с преобладанием гостевого трафика |
| C. Композит, memcached и nginx | Кешированные страницы отдаются без запуска PHP | Администрирование связки, сложнее отладка, нужен доступ к серверу | Проекты, где после B время ответа всё ещё упирается в PHP |
Подход A не конкурент композиту, а фундамент: динамические области тоже собирает PHP, поэтому кеш компонентов нужен в любом случае. Настройка хранилища на memcached и nginx — отдельная тема. Здесь только то, что меняется для разработчика шаблонов.
Порядок внедрения на магазине
Композит включается в админке: Настройки → Настройки продукта → Композитный сайт. В разных версиях пункты могут называться иначе, ориентируйтесь на название раздела.
- Включите композит на копии сайта. Проверка: выполните
curl -s -D - -o /dev/null https://example.com/catalog/ | grep -i x-bitrix-compositeдважды. Первый запрос строит кеш, со второго в ответе должен появиться заголовок X-Bitrix-Composite, значение вида Cache (200) означает отдачу из кеша. - Ограничьте область. В настройках есть условия включения и исключения страниц по маскам адресов, точные названия полей смотрите в своей версии. Начните с каталога и информационных разделов, а корзину, личный кабинет и оформление заказа исключите. Проверка: на исключённой странице заголовка нет.
- Обойдите сайт гостем и авторизованным пользователем в разных браузерах. Выпишите всё, что зависит от человека: приветствие, корзину, избранное, сравнение, персональные цены, счётчики.
- Для каждого такого места проверьте компонент. Штатные нередко работают в динамической области, самописные и сторонние чаще нет. Если не работает, оберните вывод в template.php. Проверка: войдите под пользователем, обновите страницу, затем откройте её гостем в другом браузере. Чужих данных быть не должно.
- Отправьте все формы со страниц из кеша: обратный звонок, отзыв, подписку.
- Расширьте маску на весь сайт и следите за размером хранилища.
Динамическая область в шаблоне
Если компонент композит не поддерживает, оборачиваем его вывод вручную. Пример для блока приветствия, main 23.x и новее:
<?php
// template.php: блок приветствия в шапке
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
die();
}
global $USER;
// Всё между begin() и end() догружается отдельным запросом
$frame = $this->createFrame()->begin();
?>
<div class="header-greeting">
<?php if ($USER->IsAuthorized()): ?>
Здравствуйте, <?= htmlspecialcharsbx($USER->GetFirstName()) ?>
<?php else: ?>
Войти или зарегистрироваться
<?php endif; ?>
</div>
<?php
// Заглушка: её видит посетитель, пока область не загрузилась
$frame->beginStub();
?>
<div class="header-greeting">Войти или зарегистрироваться</div>
<?php
$frame->end();Сигнатуры createFrame(), begin(), beginStub() и end() сверяйте с документацией разработчика для вашей версии main. Заглушку делайте той же высоты, что и готовый блок, иначе страница будет прыгать при догрузке.
Композит ускоряет не сайт, а повторный показ одной и той же страницы. Всё, что у двух посетителей должно отличаться, обязано жить в динамической области.
Что ломается
- Персональное вне динамической области. Приветствие, имя в шапке, число товаров в корзине. Если блок попал в статичную часть, его увидят все. Начинайте проверку с данных, которые нельзя показывать чужим.
- Случайное и зависящее от времени. «Товар дня», ротация баннеров, вывод текущей даты. Пока кеш не сброшен, они застывают.
- Токены в формах. Если форма с проверкой сессии лежит в статичной части, а токен в ней устарел, отправка может закончиться ошибкой о сессии. Отправьте каждую форму с кешированной страницы.
- Размножение кеша. Фильтр, сортировка и utm-метки дают разные адреса. Посмотрите в настройках композита, как обрабатываются параметры запроса и какой лимит у хранилища.
- Старые цены и остатки. Изменили цену, выгрузили из 1С, открыли карточку гостем. Если видите старую, выясните, сбрасывается ли кеш при вашем способе обмена.
- Индексация. Содержимое динамической области приходит отдельным запросом, и робот может его не увидеть. Не прячьте туда текст и ссылки, которые должны попасть в индекс.
Правила сброса и инвалидации кеша — отдельная тема, здесь не разворачиваем.
Когда что выбирать
- Остаётесь на подходе A, если не можете до релиза обойти все типы страниц под гостем и под пользователем, а персональные блоки разбросаны по самописным компонентам.
- Берёте подход B, если трафик в основном гостевой, персональных блоков немного (шапка, корзина, избранное), а время ответа определяется сборкой страницы.
- Переходите к C, когда после B время ответа на кешированных страницах всё ещё упирается в запуск PHP, а на проекте есть человек, который поддерживает nginx и memcached.
Что делать дальше
Выведите заголовок X-Bitrix-Composite в лог nginx через переменную $upstream_http_x_bitrix_composite (работает, пока ответ приходит от PHP-FPM как от upstream) и считайте долю попаданий в кеш. Время до первого байта мерьте отдельно для кешированных и некешированных страниц. Добавьте в чек-лист релиза правило: любой новый компонент в шапке или подвале проверяется под гостем и под пользователем. Отдельно проверьте, что цены после обмена с 1С обновляются на страницах из кеша. Для деталей откройте раздел документации о композитном сайте и описание метода createFrame() для вашей версии.
Динамическая область — фрагмент страницы, который не попадает в готовый HTML-кеш и загружается отдельным запросом после показа статичной части. Именно так в композите живут корзина, приветствие и всё, что зависит от посетителя.
Логотип и фирменный стиль: Три концепции разного характера, палитра с обоснованием, проверка на читаемость в малом размере и в один цвет.
Спросить за 60 ₽Источники: Документация 1С-Битрикс: раздел о композитном сайте, Документация разработчика 1С-Битрикс: компоненты и метод createFrame()
Частые вопросы
Нужно ли переписывать шаблоны, чтобы включить композит?
Как понять, что страница отдана из композитного кеша?
А если у меня другая версия или композит не заработал?
Какие подводные камни ждут в проде?
Влияет ли композит на индексацию?
Что делать с utm-метками и фильтрами?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.