Доработка компонентов Битрикс через 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
В карточке товара (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 или большая выборка), оберните его в кэш. Иначе при каждом хите будет выполняться лишняя работа.
$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).
- Документация по добавленным полям.
- Консультация по расширению решения.
Ориентировочные сроки: большинство задач занимает 4–16 часов. Стоимость рассчитывается индивидуально — от 40 000 до 150 000 ₽ в зависимости от сложности. Получите консультацию: расскажем, как сэкономить время и бюджет.
Чек-лист типичных ошибок
- Забываете загружать модули через
Loader::includeModule. - Не проверяете кэш компонента —
result_modifierне выполняется при готовом кэше. - Пытаетесь изменить
$arParams— это недопустимо для модификации. - Используете
result_modifierдля записи в БД — нарушаете архитектурное назначение. - Не экранируете или не фильтруете данные — риск XSS.
Мы занимаемся Битрикс-разработкой более 7 лет, выполнили 50+ проектов по доработке компонентов. Гарантируем стабильную работу на всех версиях платформы. Свяжитесь с нами для оценки вашего проекта — ответим в течение дня.
Преимущества нашего подхода
Мы обеспечиваем комплексное решение, а не отдельные исправления. Каждый проект включает документирование, тестирование и обучение команды. Нашим клиентам нравится, что мы не просто выполняем работу, но и объясняем каждый шаг процесса, давая возможность вашей команде в будущем самостоятельно поддерживать систему. Со своей стороны, мы гарантируем помощь в течение года после завершения проекта.
Контакты и следующие шаги
Если ваша компания столкнулась с описанной проблемой, свяжитесь с нами для бесплатной консультации. Проведём анализ вашей системы и предложим оптимальное решение. Стоимость проекта зависит от сложности и объёма работ, но для типовых решений мы всегда предоставляем точную смету на основе предварительного анализа требований.







