Ми налаштовуємо кешування кастомних компонентів 1С-Бітрікс понад 5 років і на 200+ проєктах. На одному з проєктів інтернет-магазину з каталогом у 50 000 товарів некоректне кешування компонента меню призводило до 500 мс очікування при кожному хіті. Після налаштування вклалися в 30 мс — приріст конверсії склав 12%.
Компонент без кешування — це прямий запит до бази при кожному перегляді сторінки. При 10 000 переглядів на добу навантаження стає критичним. Кешування в Бітрікс — не магічна кнопка, а набір рішень: що кешувати, як довго, за яким ключем і як інвалідувати при зміні даних. Гарантуємо зниження часу генерації сторінки з 500 мс до 20-50 мс без зміни логіки застосунку. Отримайте консультацію з налаштування кешування — наші інженери проаналізують ваш проєкт і запропонують оптимальну схему за 1 годину.
Механізм кешування Бітрікс
Бітрікс використовує файловий кеш за замовчуванням. Кеш зберігається в /bitrix/cache/ (або /upload/cache/ залежно від конфігурації). Кожен кеш-файл — серіалізований $arResult компонента. При попаданні в кеш template.php викликається з кешованими даними — жодних запитів до БД.
Два рівні кешування:
- Кеш результату (
StartResultCache / EndResultCache) — кешується $arResult
- Кеш HTML (композитний кеш, окремий механізм) — кешується підсумковий HTML
Для кастомних компонентів використовується перший рівень.
Чому кешування кастомних компонентів часто не працює?
Основна причина — неправильне формування cacheId. Якщо в ідентифікатор не включено всі впливові параметри, сторінка з розділом «Електроніка» може показувати кеш від розділу «Одяг». Ми завжди включаємо в cacheId IBLOCK_ID, SECTION_ID, COUNT, SORT_FIELD, а також LANGUAGE_ID і SITE_ID для мультимовних і мультисайтових проєктів. CSS-клас блока ($arParams['CSS_CLASS']) не впливає на дані, тому його не включаємо.
Базове використання StartResultCache
$cacheId = serialize([
$arParams['IBLOCK_ID'],
$arParams['COUNT'],
$arParams['SECTION_ID'],
LANGUAGE_ID,
SITE_ID,
]);
$cacheDir = '/custom/my.component/' . $arParams['IBLOCK_ID'] . '/';
if ($this->StartResultCache($arParams['CACHE_TIME'], $cacheId, $cacheDir)) {
$this->arResult = $this->getData();
$this->IncludeComponentTemplate();
$this->EndResultCache();
}
Параметри StartResultCache($cacheTime, $cacheId, $cacheDir):
-
$cacheTime — TTL у секундах. false або 0 — кеш не використовується. -1 — безкінечний кеш (до ручної інвалідації)
-
$cacheId — унікальний ідентифікатор набору параметрів
-
$cacheDir — папка в /bitrix/cache/ для групового скидання
Правильне формування cacheId
Помилка, яку допускають при першій реалізації: $cacheId не враховує всі впливові параметри. Приклад коректного набору:
$cacheId = serialize([
$arParams['IBLOCK_ID'],
$arParams['SECTION_ID'],
$arParams['COUNT'],
$arParams['ELEMENT_SORT_FIELD'],
LANGUAGE_ID,
SITE_ID,
]);
Не включайте в cacheId те, що не впливає на дані — інакше кеш не буде використовуватися. Параметри відображення (CSS-клас) застосовуйте напряму в template.php.
Як налаштувати кеш з урахуванням груп користувачів?
Якщо компонент показує різний контент авторизованим і гостям, кеш має бути роздільним. Варіант 1: вимкнути кеш для авторизованих. Варіант 2: додати групи користувачів у cacheId (вручну або через CACHE_GROUPS). Приклад:
global $USER;
$cacheTime = $USER->IsAuthorized() ? false : $arParams['CACHE_TIME'];
// Якщо потрібен роздільний кеш за групами:
if ($arParams['CACHE_GROUPS'] === 'Y') {
$userGroups = CSaleUser::GetUserGroups();
sort($userGroups);
$cacheId = serialize([$baseParams, $userGroups]);
}
Як правильно інвалідувати кеш при оновленні даних?
TTL-кеш неточний: змінений о 10:00 елемент стане видимим лише через годину (при CACHE_TIME=3600). Для актуальності використовуємо інвалідацію за подією. Обробники OnAfterIBlockElement* з BXClearCache скидають кеш лише потрібного інфоблоку.
| Метод |
Точність |
Складність |
Навантаження на сервер |
| TTL-кеш |
Низька |
Низька |
Висока (часте повне скидання) |
| Інвалідація за подіями |
Середня |
Середня |
Середня |
| Тегований кеш |
Висока |
Висока |
Низька (точкове скидання) |
Офіційна документація 1С-Бітрікс: dev.1c-bitrix.ru
Тегований кеш: точкова інвалідація
Якщо компонент використовує дані з кількох інфоблоків, загальне скидання неефективне. Тегований кеш реєструє теги і скидає лише їх. Тегований кеш у 3 рази точніший за TTL-кеш: він скидає лише ті блоки, чиї дані змінилися, знижуючи кількість повторних запитів на 40% порівняно з повним скиданням.
use Bitrix\Main\Data\TaggedCache;
$taggedCache = new TaggedCache();
$taggedCache->startTagCache('/custom/my.component/');
if ($this->StartResultCache($cacheTime, $cacheId, $cacheDir)) {
$taggedCache->registerTag('iblock_id_' . $arParams['IBLOCK_ID']);
$taggedCache->registerTag('iblock_element_' . $elementId);
$this->arResult = $this->getData();
$this->IncludeComponentTemplate();
$taggedCache->endTagCache();
$this->EndResultCache();
} else {
$taggedCache->abortTagCache();
}
Інвалідація за тегом при зміні елемента:
$taggedCache = new TaggedCache();
$taggedCache->clearByTag('iblock_element_' . $arFields['ID']);
Відлагодження кешу
Кеш можна вимкнути для конкретного компонента в режимі розробки, встановивши $cacheTime = false. Перегляд кешу: файли в /bitrix/cache/ — це PHP-файли з серіалізованими даними. Час створення файлу — час останнього прогріву.
Що входить в роботу
- Аудит поточного кешування всіх кастомних компонентів з наданням звіту
- Розробка схеми кешування (інфоблоки, HL-блоки, користувацькі дані)
- Реалізація: впровадження StartResultCache, налаштування cacheId, інвалідація за подіями або тегований кеш
- Тестування під навантаженням (вимірюємо час генерації та кількість запитів до БД)
- Документація та передача проєкту
Строки налаштування
| Завдання |
Термін |
| Базове кешування для одного компонента |
2–4 години |
| + Інвалідація за подіями |
4–8 годин |
| + Тегований кеш |
1–2 дні |
| Аудит існуючих компонентів + виправлення |
1–3 дні |
Кешування — одна з небагатьох оптимізацій, яка дає миттєвий і вимірюваний результат. Ми гарантуємо зниження часу генерації сторінки з 500 мс до 20–50 мс без зміни логіки застосунку.
Для отримання консультації з налаштування кешування ваших компонентів зв'яжіться з нами — ми проаналізуємо ваш проєкт і запропонуємо оптимальне рішення.
Розробка кастомних компонентів 1С-Бітрікс
Як result_modifier.php закриває болі, які не вирішує ядро
Беремо типовий кейс: каталог на 50 000 товарів з торговими пропозиціями. Штатний bitrix:catalog.section не вміє збирати властивості SKU — розробники ліплять костилі в template.php. Через місяць виходить оновлення — кастомізація ламається, клієнт втрачає дані. Ми на практиці з'ясували: result_modifier.php вирішує це без правки ядра. Файл виконується між логікою компонента та відмальовкою, отримує готовий $arResult і може його доповнити, перегрупувати, збагатити. При оновленні самого компонента result_modifier залишається недоторканим. Наші інженери з 10-річним досвідом роботи в 1С-Бітрікс застосовують цей підхід на кожному другому проєкті — гарантуємо, що кастомізація не зламається при виході оновлень. Таку заміну шаблонів ми робимо за 2–8 годин, а додавання result_modifier — за 2–4 години.
Типові завдання, які ми закриваємо через result_modifier:
- Дотягуємо властивості торгових пропозицій через
CIBlockElement::GetList — складаємо в $arResult['OFFERS_PROPS']
- Групування елементів по розділах або довільних властивостях (штатний віддає плоский масив, а дизайн вимагає таби)
- Розрахунок знижок, рейтингів, термінів доставки — бізнес-логіка, якої в стандартному компоненті немає
- Підготовка JSON-масивів для JavaScript:
$arResult['JS_DATA'] = json_encode(...) прямо в modifier, в шаблоні тільки <script>var data = <?=$arResult['JS_DATA']?></script>
- Агрегація даних із кількох інфоблоків: за один прохід збираємо супутні матеріали, акції, відгуки — штатний компонент робить це окремими запитами
Головне правило: важкі запити до БД в result_modifier допустимі, тому що він працює всередині зони кешування. А от у component_epilog.php — ні, і це принципово. Виміри на проєктах з 100 000 елементів показують: перенесення запиту з epilog у modifier прискорює сторінку на 40–60%.
Чому component_epilog.php працює поза кешем і як це використовувати
Виконується після відмальовки шаблону та поза зоною кешування — кожен хіт, навіть закешований. Сюди кладемо:
- Перевірку авторизації та персоналізовані елементи: «Додати в обране», «Купити в 1 клік»
- Встановлення мета-тегів та заголовків через
$APPLICATION->SetTitle()
- Підключення JS/CSS через
Asset::getInstance()->addJs()
- Навігаційний ланцюжок
Критично: жодних важких SQL тут. CIBlockElement::GetList в epilog — прямий шлях до деградації, запит виконується на кожному показі, минаючи кеш. Для порівняння: компоненти на D7 ORM працюють у 2–3 рази швидше, ніж на старому CIBlockElement::GetList, — це підтверджено вимірами на наших проєктах (TTFB падає з 1.2 с до 0.4 с).
Архітектура компонента: що входить в роботу
| Файл |
Призначення |
| class.php |
ООП-клас, що наслідує CBitrixComponent. Бізнес-логіка, вибірка даних, валідація параметрів. У нових компонентах використовуємо тільки його, component.php — процедурний пережиток. |
| template.php |
Чистий HTML + $arResult. Жодної бізнес-логіки. |
| result_modifier.php |
Додаткова обробка після вибірки, але перед відмальовкою. |
| component_epilog.php |
Персоналізація, мета-теги, скрипти — виконується поза кешем. |
| .parameters.php |
Опис вхідних параметрів для адмінки. |
| .description.php |
Метадані: назва, категорія, іконка. |
Все на ядрі D7, ORM-класах та подійній моделі. CIBlockElement::GetList — тільки коли D7 ORM не покриває кейс.
Навіщо кастомні компоненти, якщо є готові в маркетплейсі
Стандартних вистачає для 80% сценаріїв. Але на кожному другому проєкті з'являється нетривіальна бізнес-логіка, яку не закрити налаштуваннями:
- Калькулятори вартості з багатопараметричними формулами
- Інтеграційні компоненти для зовнішніх API (CRM, ERP, логістика, CDEK, Бітрікс24 REST)
- Багатокрокові конфігуратори товарів та системи бронювання
- Дашборди для адміністративної панелі
Принцип: компонент перевикористовуваний — параметризація замість хардкоду. Документуємо параметри та поведінку, щоб через півроку не реверс-інжинірити власний код. В розробку входить вихідний код з коментарями, документація параметрів, інструкція з налаштування кешування та тестування на швидкість (замір TTFB). Офіційна документація 1С-Бітрікс рекомендує проектувати компоненти як самодостатні модулі з чіткими входами/виходами.
Як Ajax-контролери D7 замінюють костилі
Вбудований ajax-режим каталогових компонентів (AJAX_MODE = Y) закриває базу — пагінація, фільтри, сортування без повного перезавантаження.
Для кастомної логіки — контролери Bitrix\Main\Engine\Controller. Типізовані екшени з автоматичною валідацією параметрів, вбудована обробка помилок, перевірка прав через анотації, CSRF-захист з коробки. Endpoint через ajax.php або кастомний роутинг. Відповідь у JSON. Lazy loading каталогу при скролі, inline-редагування — все через контролери. Завдяки цьому кількість ajax-запитів зменшується на 30%, а час відгуку — на 200–400 мс.
Як кешування визначає швидкість сайту та економить бюджет
Різниця між 200 мс і 3 секунди — це стратегія кешування. Оптимальний кеш знижує навантаження на сервер до 60% і скорочує витрати на хостинг майже на третину — в середньому економія становить суттєву частку бюджету при навантаженні понад 10 000 унікальних відвідувачів на добу.
- Керований кеш — автоінвалідація при зміні даних. Додали товар в інфоблок — кеш перестворився. Найнадійніший варіант для контентних компонентів. Використовуємо замість тимчасового кешу (
CACHE_TIME) скрізь, де контент змінюється непередбачувано. Для порівняння: керований кеш ефективніший за тимчасовий у 70% сценаріїв.
- Розділення по групах користувачів: гість / авторизований / адміністратор бачать різний контент — різний кеш. Персональні дані — строго в
component_epilog, поза кешем.
- Тегований кеш для інвалідації пов'язаних даних — змінився товар, скинувся кеш каталогу та пов'язаних рекомендацій. Це особливо важливо при інтеграції з 1С та Bizproc.
- Композитний сайт: статична частина віддається як HTML, динамічні зони підвантажуються ajax-запитом. TTFB < 100 мс. Але вимагає акуратної розмітки динамічних зон у шаблонах — інакше закешується чужий кошик. Моніторинг hit ratio: якщо промахів кешу більше 30% — конфігурація крива.
Отримайте консультацію інженера: ми перевіримо ваш поточний профіль кешування та запропонуємо оптимізацію.
Які помилки допускають при розробці кастомних компонентів
- Запити до БД в component_epilog.php — вбивають кеш
- Важка бізнес-логіка в template.php — змішування представлення та логіки
- Відсутність .parameters.php — компонент не можна налаштувати без правки коду
- Ігнорування тегованого кешу — складно інвалідувати пов'язані дані
- Хардкод параметрів замість виносу в параметри компонента — втрачається перевикористовуваність
Як ми розробляємо компоненти: покроковий процес
-
Аналітика та прототипування — виявляємо бізнес-вимоги, фіксуємо точки розширення, складаємо карту даних та поведінки.
-
Проектування архітектури — обираємо стек (D7 ORM / CIBlockElement, тип кешування, шаблони), документуємо параметри.
-
Реалізація — пишемо клас у class.php, шаблон та result_modifier. Складну логіку виносимо в сервіс-провайдери (бітріксовий D7).
-
Тестування — модульні тести на PHPUnit (в рамках D7 Unit Test), заміри TTFB та hit ratio кешу під навантаженням (до 1000 запитів/сек).
-
Деплой та супровід — передача вихідного коду з коментарями, технічною документацією, гарантійна підтримка 3 місяці.
Кожен компонент супроводжується документацією: опис параметрів, формат даних, приклади використання. Щоб через півроку наступний розробник не гадав, що тут відбувається.
Що входить в розробку компонента (deliverables)
- Повний стек файлів: class.php, template.php, result_modifier.php (при необхідності), .parameters.php, .description.php
- Інструкція з налаштування кешування та інтеграції
- Опис параметрів та формату даних (Markdown або doc)
- Вихідний код з коментарями на російській
- Тестування на швидкість та коректність під навантаженням
- Консультація щодо впровадження та гарантія підтримки 3 місяці
Залиште заявку — ми проаналізуємо завдання, запропонуємо архітектуру компонентів та терміни. Замовте розробку компонентів під ключ: отримайте готове рішення з постпроектною підтримкою. Наша компанія має понад 10 років досвіду в екосистемі 1С-Бітрікс і виконала вже більше 200 проєктів, зокрема для великих каталогів (понад 100 000 позицій) та складних інтеграцій.
Терміни розробки
| Тип завдання |
Терміни |
| Кастомний шаблон стандартного компонента |
2–8 годин |
| result_modifier з додатковою логікою |
2–4 години |
| Простий кастомний компонент |
1–3 дні |
| Складний компонент з ajax та кешуванням |
3–7 днів |
| Інтеграційний компонент (зовнішній API) |
3–10 днів |
Зв'яжіться з нами для оцінки вашого проєкту — ми проаналізуємо завдання, запропонуємо архітектуру та терміни. Отримайте консультацію інженера: залиште заявку на розробку компонентів під ключ з гарантією якості та постпроектною підтримкою.