Доопрацювання стандартних компонентів через result_modifier у 1С-Бітрікс
result_modifier.php — файл усередині папки шаблону компонента, який виконується після роботи самого компонента, але до рендеру шаблону. На цьому етапі $arResult вже заповнений даними — можна додати, змінити або видалити будь-які дані перед виведенням. Це головний механізм кастомізації стандартних компонентів без модифікації ядра.
Як працює механізм
Послідовність виконання компонента:
1. component.php (логіка компонента, заповнює $arResult)
2. result_modifier.php (модифікація $arResult у шаблоні)
3. template.php (рендер HTML)
4. component_epilog.php (постобробка після рендеру)
result_modifier.php знаходиться в папці шаблону:
/local/templates/{site_template}/components/bitrix/catalog.element/default/result_modifier.php
Або в копії шаблону компонента:
/local/components/bitrix/catalog.element/templates/default/result_modifier.php
Якщо ви створили шаблон компонента через адміністративний інтерфейс (Налаштування → Компоненти → Шаблони компонентів) — result_modifier.php створюється в копії шаблону автоматично.
Що доступно в result_modifier
У файлі доступні:
-
$arResult— результат роботи компонента, масив із даними -
$arParams— параметри компонента (з виклику в шаблоні або автоматично) -
$this— об'єкт компонента (CBitrixComponent) - Усі глобальні об'єкти 1С-Бітрікс:
$USER,$APPLICATION,$DB
Практичні застосування
Додавання даних із зовнішнього джерела в картку товару:
У catalog.element $arResult не містить, наприклад, середнього рейтингу з таблиці відгуків. Додаємо:
// result_modifier.php для 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;
Тепер у template.php ці дані доступні через $arResult['AVERAGE_RATING'].
Доопрацювання списку товарів (catalog.section): додавання даних про наявність по складах:
// result_modifier.php для bitrix:catalog.section / bitrix:catalog.smart.filter
\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.php для bitrix:catalog.element
global $USER;
$userGroups = $USER->GetUserGroupArray();
$isWholesale = in_array(WHOLESALE_GROUP_ID, $userGroups);
if ($isWholesale && isset($arResult['CATALOG_PRICE_2'])) {
// Показуємо оптову ціну замість роздрібної
$arResult['DISPLAY_PRICE'] = $arResult['CATALOG_PRICE_2'];
} else {
$arResult['DISPLAY_PRICE'] = $arResult['CATALOG_PRICE_1'] ?? 0;
}
Формування breadcrumbs із кастомними даними:
// Додаємо SEO-хлібні крихти з розділу
if (!empty($arResult['SECTION'])) {
$arResult['SEO_BREADCRUMBS'] = buildSeoJsonLd(
$arResult['SECTION']['PATH'],
$arResult['NAME']
);
}
Продуктивність: кешуйте всередині result_modifier
result_modifier.php виконується щоразу при рендері компонента. Якщо всередині важкі запити — оберніть їх у кеш:
// result_modifier.php
$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. Майте це на увазі: дані, додані до $arResult у result_modifier.php, кешуються разом із $arResult.
Обмеження result_modifier
result_modifier.php — не місце для операцій із побічними ефектами: створення записів у БД, відправки сповіщень, зміни стану. Це лише читання та трансформація $arResult. Для побічних ефектів після рендеру — component_epilog.php.
Не можна змінити вже виконані SQL-запити компонента — лише доповнити результат новими запитами. Якщо потрібно змінити логіку отримання даних — доведеться перевизначати сам компонент через /local/components/.
Налагодження
Якщо result_modifier.php не застосовується — перевірте:
- Шлях до файлу: він має бути в папці шаблону, що використовується у виклику компонента
- Компонент не віддається повністю з кешу (у такому разі
result_modifier.phpне викликається для закешованих даних — лишеtemplate.php) - Відсутність синтаксичних помилок у файлі — помилки виконання мовчки ігноруються в production-режимі
// На початку result_modifier.php для налагодження
// Переконайтеся, що файл взагалі виконується:
if (defined('LOG_RESULT_MODIFIER')) {
file_put_contents('/tmp/rm_debug.log', date('H:i:s') . ' ' . __FILE__ . "\n", FILE_APPEND);
}
Склад робіт: аналіз структури $arResult потрібного компонента, написання result_modifier.php, покриття кешем — для більшості завдань 4–16 годин залежно від складності джерела даних.







