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

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Доробка стандартних компонентів через result_modifier 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • 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
    585
  • 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)
  • Усі глобальні об'єкти 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 не застосовується — перевірте:

  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 годин залежно від складності джерела даних.