Доработка стандартных компонентов через 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) - Все глобальные объекты Битрикс:
$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 часов в зависимости от сложности источника данных.







