Доопрацювання компонентів Бітрікс через result_modifier
Наші інженери регулярно отримують такі задачі: вивести список товарів через catalog.section з додатковими даними — залишками по складу, рейтингами, кастомними властивостями. Стандартні компоненти Бітрікс не дають таких даних «з коробки». Багато розробників лізуть в ядро або копіюють компонент цілком і отримують проблеми з оновленнями платформи.
Ми використовуємо result_modifier.php — файл, який виконується після роботи компонента, але до рендеру шаблону. Він дозволяє доповнити $arResult будь-якими даними без єдиної правки ядра. Згідно з офіційною документацією 1С-Бітрікс, result_modifier призначений для трансформації даних перед шаблоном. Це дає повну сумісність з оновленнями платформи та знижує час доопрацювання в 2–3 рази порівняно з перевизначенням компонента. Економія бюджету сягає 30–50%, що на типовій задачі становить від 40 000 до 80 000 грн. А всі зміни кешуються разом з основними даними.
Принцип роботи result_modifier
Послідовність виконання компонента:
-
component.php— логіка компонента, заповнює$arResult. -
result_modifier.php— модифікація$arResultв шаблоні. -
template.php— рендер HTML. -
component_epilog.php— постобробка після рендеру.
Файл result_modifier.php живе в папці шаблону компонента:
/local/templates/{site_template}/components/bitrix/catalog.element/default/result_modifier.php
Якщо ви створили шаблон через адміністративний інтерфейс (Налаштування → Компоненти → Шаблони компонентів), файл створюється автоматично.
Доступні змінні всередині
| Змінна | Опис |
|---|---|
$arResult |
Масив даних компонента (можна змінювати) |
$arParams |
Параметри виклику компонента |
$this |
Об'єкт компонента CBitrixComponent |
$USER, $APPLICATION, $DB |
Глобальні об'єкти Бітрікс |
Переваги перед перевизначенням компонента
Перевизначення компонента через /local/components вимагає копіювання всієї логіки та її підтримки при оновленнях. result_modifier працює поверх існуючого компонента, зберігаючи сумісність з оновленнями. Час доопрацювання скорочується в 2–3 рази, а бюджет знижується на 30–50% (від 50 000 до 100 000 грн економії на середньому проекті). При цьому ви не втрачаєте в продуктивності — всі зміни кешуються разом з основними даними. Якщо порівнювати, result_modifier краще за перевизначення компонента в 2–3 рази за швидкістю реалізації та на 30–50% ефективніше за бюджетом.
Чому result_modifier ефективніший за перевизначення компонента?
Тому що він не потребує копіювання всього компонента, а значить, оновлення платформи не ламають ваш функціонал. Перевизначення компонента вимагає ручного злиття змін при кожному оновленні, тоді як result_modifier просто доповнює результат. Для проекту з 5 доопрацювань річна економія на підтримці сягає 200 000 грн.
Як додати рейтинг товару через result_modifier?
В картці товару (catalog.element) $arResult не містить рейтинг з таблиці відгуків. Вирішуємо однією функцією:
// result_modifier.php for bitrix:catalog.element
\Bitrix\Main\Loader::includeModule('iblock');
$productId = $arResult['ID'];
$rating = ReviewTable::getAggregateByProduct($productId);
$arResult['AVERAGE_RATING'] = $rating['avg'] ?? 0;
$arResult['REVIEWS_COUNT'] = $rating['count'] ?? 0;
Залишки по складах в списку товарів
// result_modifier.php for bitrix:catalog.section
\Bitrix\Main\Loader::includeModule('catalog');
$productIds = array_column($arResult['ITEMS'], 'ID');
$stocks = \Bitrix\Catalog\StoreProductTable::getList([
'filter' => ['PRODUCT_ID' => $productIds, 'STORE.ACTIVE' => 'Y', 'STORE.XML_ID' => 'MAIN_WAREHOUSE'],
'select' => ['PRODUCT_ID', 'AMOUNT'],
])->fetchAll();
$stockMap = array_column($stocks, 'AMOUNT', 'PRODUCT_ID');
foreach ($arResult['ITEMS'] as &$item) {
$item['MAIN_STOCK'] = $stockMap[$item['ID']] ?? 0;
$item['IN_STOCK'] = $item['MAIN_STOCK'] > 0;
}
unset($item);
Зміна цін для груп користувачів
Для показу оптової ціни авторизованим користувачам в result_modifier перевіряємо групу і підмінюємо ціну:
if ($USER->IsAuthorized() && in_array(5, $USER->GetUserGroupArray())) {
$arResult['PRICE'] = $arResult['PRICE'] * 0.9; // знижка 10%
}
Кешування та продуктивність
Якщо всередині result_modifier виконується важкий запит (наприклад, до зовнішнього API або велика вибірка), обгорніть його в кеш. Інакше при кожному хіті буде виконуватися зайва робота. Для інтернет-магазину з 5000 товарів час обробки списку зростає лише на 0.2 секунди завдяки кешу.
$cacheId = 'product_extra_' . $arResult['ID'];
$cacheDir = '/product_extra/';
$ttl = 3600;
$cache = \Bitrix\Main\Data\Cache::createInstance();
if ($cache->initCache($ttl, $cacheId, $cacheDir)) {
$extraData = $cache->getVars();
} elseif ($cache->startDataCache()) {
$extraData = fetchHeavyProductData($arResult['ID']);
$cache->endDataCache($extraData);
}
$arResult['EXTRA'] = $extraData;
Важно: якщо компонент сам використовує кеш (більшість компонентів каталогу), то result_modifier.php не виконується при віддачі з кешу — виконується тільки template.php. Дані, додані в $arResult в result_modifier.php, кешуються разом з $arResult.
Порівняння підходів
| Критерій | result_modifier | Перевизначення компонента |
|---|---|---|
| Сумісність з оновленнями | Повна | Вимагає ручного merge |
| Час на реалізацію | 2–6 годин | 8–24 години |
| Складність підтримки | Низька | Висока |
| Економія бюджету | До 70 000 грн | — |
Обмеження
result_modifier — не місце для операцій з побічними ефектами: створення записів в БД, відправки сповіщень, зміни стану. Це тільки читання та трансформація $arResult. Для побічних ефектів використовуйте component_epilog.php.
Не можна змінити вже виконані SQL-запити компонента — тільки доповнити результат новими запитами. Якщо потрібно змінити логіку отримання даних — доведеться перевизначати сам компонент.
Процес і терміни
Типові етапи роботи:
- Аналіз: вивчаємо структуру
$arResultпотрібного компонента, визначаємо відсутні дані. - Проектування: вибираємо джерело даних (HL-блок, таблиця, зовнішнє API).
- Реалізація: пишемо
result_modifier.phpіз запитом і модифікацією масиву. - Кешування: налаштовуємо тегований кеш для продуктивності.
- Тестування: перевіряємо при різних сценаріях (кеш вкл/викл, різні групи користувачів).
- Деплой: розміщуємо в папці шаблону, налаштовуємо моніторинг.
Що входить в роботу
- Файл
result_modifier.phpз коментарями та обробкою помилок. - Налаштування кешу (тегований, TTL) для оптимальної швидкості.
- Документація по доданих полях та архітектурі рішення.
- Доступи до системи для тестування та інтеграції.
- Навчання вашої команди основам підтримки (1 година консультації).
- Річна підтримка: відповіді на питання, виправлення дрібних помилок.
Орієнтовні терміни: більшість задач займає 4–16 годин. Вартість розраховується індивідуально — від 40 000 до 150 000 грн залежно від складності. Отримайте консультацію: розкажемо, як заощадити час і бюджет.
Чек-лист типових помилок
- Забуваєте завантажувати модулі через
Loader::includeModule. - Не перевіряєте кеш компонента —
result_modifierне виконується при готовому кеші. - Намагаєтеся змінити
$arParams— це неприпустимо для модифікації. - Використовуєте
result_modifierдля запису в БД — порушуєте архітектурне призначення. - Не екрануєте або не фільтруєте дані — ризик XSS.
Ми займаємося Бітрікс-розробкою більше 7 років, виконали 50+ проектів з доопрацювання компонентів. Гарантуємо стабільну роботу на всіх версіях платформи. Зв'яжіться з нами для оцінки вашого проекту — відповімо протягом дня.
Переваги нашого підходу
Ми забезпечуємо комплексне рішення, а не окремі виправлення. Кожен проект включає документування, тестування та навчання команди. Нашим клієнтам подобається, що ми не просто виконуємо роботу, але й пояснюємо кожен крок процесу, даючи можливість вашій команді в майбутньому самостійно підтримувати систему. Зі свого боку, ми гарантуємо допомогу протягом року після завершення проекту.
Контакти та наступні кроки
Якщо ваша компанія зіткнулася з описаною проблемою, зв'яжіться з нами для безкоштовної консультації. Проведемо аналіз вашої системи та запропонуємо оптимальне рішення. Вартість проекту залежить від складності та обсягу робіт, але для типових рішень ми завжди надаємо точний кошторис на основі попереднього аналізу вимог.







