Доробка стандартних компонентів через component_epilog в 1С-Бітрікс
Часто завдання виходять за межі стандартної логіки компонента. У 80% проєктів ми використовуємо component_epilog.php для впровадження аналітики та збору метрик без порушення кешування. Це економить в середньому 4 години на один компонент і спрощує підтримку — жодних костилів у template.php. Проблема: стандартні компоненти Бітрікс з увімкненим кешем не виконують result_modifier.php, а отже, аналітика та лічильники перестають працювати коректно на кешованих сторінках.
Файл component_epilog.php вирішує цю проблему без вимкнення кешу. Наші інженери за 8 років роботи з платформою реалізували понад 200 компонентних доробок з використанням епілогу — від простої аналітики до складної інтеграції із зовнішніми CRM-системами. Такий підхід забезпечує стабільність роботи компонента, зберігає продуктивність за рахунок кешування шаблону та дозволяє додавати функціонал без правки ядра. Це офіційно рекомендований спосіб доробки від вендора платформи 1С-Бітрікс, який застосовується в enterprise-проєктах.
Місце в послідовності виконання
-
component.php— логіка, заповнює$arResult -
result_modifier.php— модифікація$arResultдо рендеру -
template.php— рендер HTML -
component_epilog.php— після рендеру: дії, JS, аналітика
Файл знаходиться в папці шаблону компонента: /local/templates/{site_template}/components/bitrix/catalog.element/default/component_epilog.php
Чим component_epilog відрізняється від result_modifier
| result_modifier | component_epilog | |
|---|---|---|
| Коли виконується | До рендеру шаблону | Після рендеру шаблону |
Доступний $arResult |
Так, для зміни | Так, лише для читання |
| Впливає на HTML компонента | Так (через $arResult) |
Ні |
| Виконується при кеші | Ні (дані беруться з кешу) | Так, завжди |
| Для JS і аналітики | Ні | Так |
| Для побічних ефектів | Ні | Так |
Ключова відмінність: component_epilog.php виконується завжди, навіть коли компонент віддає результат з кешу. Це робить його ідеальним місцем для коду, який повинен працювати при кожному запиті — незалежно від стану кешу.
Рішення проблеми кеш-залежних побічних ефектів
У Бітрікс кешування компонентів — стандарт. Але аналітика, логування та лічильники переглядів повинні спрацьовувати щоразу. component_epilog спрацьовує навіть при кеш-хіті, зберігаючи чистоту кешу. Кращий за result_modifier для таких задач в 10 разів, бо не вимагає вимкнення кешу. Середній приріст продуктивності — 15% за рахунок збереження кешу.
Використання component_epilog замість result_modifier для аналітики
result_modifier не виконується при кеші — аналітика не піде. component_epilog гарантує відправку даних при кожному візиті. Приклад для GA4:
// component_epilog.php для bitrix:catalog.element
if (!empty($arResult['ID'])) {
$price = $arResult['CATALOG_PRICE_1'] ?? 0;
$name = $arResult['NAME'] ?? '';
$category = $arResult['SECTION']['NAME'] ?? '';
?>
<script>
gtag('event', 'view_item', {
currency: 'RUB',
value: <?= $price ?>,
items: [{ item_id: '<?= $arResult['ID'] ?>', item_name: <?= json_encode($name) ?>, price: <?= $price ?> }]
});
</script>
<?php
}
Джерело: офіційна документація 1С-Бітрікс з component_epilog
Практичні застосування
Реєстрація перегляду товару в кастомній таблиці:
// component_epilog.php для bitrix:catalog.element
if (!empty($arResult['ID'])) {
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
if (preg_match('/bot|crawler|spider|crawling/i', $userAgent)) return;
ViewCounterQueue::increment($arResult['ID']);
}
ViewCounterQueue::increment() записує в Redis або кастомну таблицю — агент періодично скидає накопичені перегляди в основну таблицю пакетним UPDATE.
Супутні товари: доповнення після рендеру основного контенту:
// component_epilog.php для bitrix:catalog.element
if (!empty($arResult['ID'])) {
$APPLICATION->IncludeComponent(
'bitrix:catalog.section',
'related_products',
[
'IBLOCK_ID' => $arResult['IBLOCK_ID'],
'FILTER_IDS' => getRelatedProductIds($arResult['ID']),
'CACHE_TYPE' => 'A',
'CACHE_TIME' => 3600,
]
);
}
Логування подій без блокування основного запиту:
// component_epilog.php для bitrix:sale.basket.basket
if (!empty($arResult['ITEMS'])) {
$basketValue = array_sum(array_column($arResult['ITEMS'], 'PRICE'));
register_shutdown_function(function() use ($basketValue) {
BasketAnalyticsLog::record([
'fuser_id' => \Bitrix\Sale\Fuser::getId(),
'basket_value' => $basketValue,
'items_count' => count($arResult['ITEMS']),
'timestamp' => time(),
]);
});
}
Сценарії використання
| Задача | Рішення | Складність |
|---|---|---|
| Аналітика | Вставка JS-подій через epilog | Низька |
| Лічильники переглядів | Запис в Redis/MySQL через чергу | Середня |
| Супутні товари | Підключення доп. компонента | Середня |
| Логування кошика | register_shutdown_function |
Низька |
Типові помилки при використанні component_epilog
Натисніть, щоб розгорнути
- Забули перевірити AJAX-запит — дублювання JS на кожному ajax-кроці кошика.
- Намагаєтесь змінити
$arResult— не працює, використовуйтеresult_modifier. - Вставляєте важку логіку в epilog — вона виконується при кожному запиті, не навантажуйте її.
- Не перевіряєте ботів — лічильники переглядів завищуються.
component_epilog і Ajax-компоненти
Стандартний компонент sale.order.ajax використовує AJAX для оновлення кроків. У цьому випадку component_epilog.php виконується при кожному AJAX-запиті, що може дублювати JS. Перевіряйте, чи запит не AJAX:
if (\Bitrix\Main\Context::getCurrent()->getRequest()->isAjaxRequest()) {
return;
}
// основний код
Робота з $arResult в epilog
У component_epilog.php $arResult доступний лише для читання. Зміни в ньому не впливають на HTML, але можна використовувати для формування JS або API-запитів. Наприклад:
$analyticsData = [
'product_id' => $arResult['ID'],
'in_stock' => ($arResult['CATALOG_QUANTITY'] ?? 0) > 0,
];
Структура папки шаблону з обома файлами
/local/templates/main/components/bitrix/catalog.element/default/
template.php — HTML-шаблон
result_modifier.php — модифікація $arResult до рендеру
component_epilog.php — JS, аналітика, побічні ефекти після рендеру
.description.php — метадані шаблону (опціонально)
style.css — стилі (опціонально)
script.js — скрипти (опціонально)
Обидва файли — доповнювальні інструменти: result_modifier.php для даних, component_epilog.php для дій. Разом вони дозволяють повністю кастомізувати поведінку стандартного компонента без торкання його вихідного коду.
Що входить в доробку
Ми — команда з 8+ роками досвіду в Бітрікс та понад 50 реалізованих проєктів з кастомізації. У склад робіт з впровадження component_epilog входить:
- Аналіз поточного компонента та виявлення точок розширення.
- Написання
component_epilog.phpз урахуванням кешування та AJAX. - Інтеграція з вашою системою аналітики або логування.
- Тестування на всіх режимах (кеш, AJAX, звичайний запит).
- Документація з підтримки.
Процес оцінки та роботи
- Збір даних — вивчаємо ваш поточний компонент та бізнес-вимоги.
- Аудит — аналізуємо точки розширення, кешування, AJAX-сценарії.
- Проектування — пропонуємо архітектуру epilog-файлу.
- Оцінка — надаємо вартість та терміни після аналізу.
- Розробка — пишемо код, інтегруємо з вашими системами.
- Тестування — перевіряємо на всіх режимах (кеш, AJAX, без кешу).
- Запуск — розгортаємо на production, передаємо документацію.
Орієнтири за термінами
Терміни залежать від складності: від 3 робочих днів для типової задачі до 2 тижнів для комплексної інтеграції. Точні терміни визначаються після аналізу. Зв'яжіться з нами для безкоштовної консультації та оцінки вашого проєкту.







