Доработка стандартных компонентов через result_modifier 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Доработка стандартных компонентов через result_modifier 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1260
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    584
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    989

Доработка стандартных компонентов через 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 не применяется — проверьте:

  1. Путь к файлу: он должен быть в папке шаблона, который используется в вызове компонента
  2. Компонент не отдаётся полностью из кэша (в таком случае result_modifier.php не вызывается для кэшированных данных — только template.php)
  3. Нет синтаксических ошибок в файле — ошибка выполнения молча игнорируется в 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 часов в зависимости от сложности источника данных.