Розширення логіки стандартних компонентів без копіювання 1С-Бітрікс
Ми часто зустрічаємо проекти, де розробники копіюють стандартні компоненти Бітрікс. Це призводить до проблем при оновленнях. Уявіть: ваш інтернет-магазин пропрацював рік. Ви скопіювали catalog.section, додали кастомні поля та рейтинг. Виходить мажорне оновлення — ви витрачаєте два дні на злиття змін. Через півроку знову оновлення — і знову головний біль. Кожна копія компонента перетворюється на технічний борг, який гальмує розвиток і збільшує вартість підтримки.
За нашою статистикою, 80% проектів з копіями компонентів вимагають тотального рефакторингу при переході на нову мажорну версію. Заміна копій на рідні механізми розширення окупається вже через 4-6 місяців: час на оновлення скорочується в 5 разів, зникають баги сумісності.
Ми — команда з 8-річним досвідом розробки на Бітрікс. Завершили 40+ проектів з рефакторингу та модернізації. Допомагаємо компаніям позбутися копій компонентів без втрати функціональності. Зв'яжіться з нами для консультації — оцінимо ваш проект.
Які механізми розширення надає Бітрікс?
Бітрікс пропонує чотири способи розширити логіку стандартного компонента без його копіювання: result_modifier.php, події, класи-розширення та компонент-обгортка.
result_modifier.php — швидке доповнення даних
Файл result_modifier.php у папці шаблону виконується після основної логіки компонента, але до виведення шаблону. Ви отримуєте посилання на $arResult і можете додавати або змінювати дані. Наприклад, підвантажити рейтинги товарів із зовнішнього сервісу:
<?php // /local/templates/my_site/components/bitrix/catalog.section/.default/result_modifier.php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die(); $ids = array_column($arResult['ITEMS'], 'ID'); if ($ids) { $ratings = MyRatingService::getAverageForItems($ids); foreach ($arResult['ITEMS'] as &$item) { $item['MY_RATING'] = $ratings[$item['ID']] ?? 0; } } Цей метод простий, але не дозволяє змінити SQL-запит компонента. Для втручання в запит потрібні події.
Події компонента — втручання на рівні запитів
Більшість стандартних компонентів генерують події. Наприклад, OnBeforeIBlockElementGetList дозволяє модифікувати фільтр вибірки. Ось як приховати товари без ціни:
// /local/php_interface/init.php \Bitrix\Main\EventManager::getInstance()->addEventHandler( 'iblock', 'OnBeforeIBlockElementGetList', function (\Bitrix\Main\Event $event) { $filter = $event->getParameter('filter'); $filter['!CATALOG_PRICE_1'] = false; $event->setParameter('filter', $filter); return $event; } ); Події дають гнучкість без копіювання компонента. Однак складну бізнес-логіку краще виносити в клас-розширення.
Клас-розширення — максимальна гнучкість
Створюєте клас-спадкоємець у /local/components/bitrix/ім'я_компонента/class.php. Бітрікс автоматично підхопить його замість оригінального. Шаблони при цьому залишаються з /bitrix/. Приклад — додаємо ознаку "новинка" для товарів, створених менш ніж 30 днів тому:
<?php // /local/components/bitrix/catalog.section/class.php \Bitrix\Main\Loader::includeModule('iblock'); \Bitrix\Main\Loader::includeModule('catalog'); class MyCatalogSectionComponent extends \Bitrix\Iblock\Component\ElementList { protected function getFilter(): array { $filter = parent::getFilter(); $filter['!PREVIEW_PICTURE'] = false; // приховати товари без зображення return $filter; } protected function prepareElementData(array $element): array { $element = parent::prepareElementData($element); $element['IS_NEW'] = (time() - strtotime($element['DATE_CREATE'])) < 86400 * 30; return $element; } } Цей підхід зберігає оновлюваність: при виході нової версії Бітрікс ваш клас успадковує покращення батьківського компонента. Порівняйте: ручне злиття копії займає від 2 до 8 годин, а при використанні класу-розширення — 0 годин. Клас-розширення дозволяє успадковувати поведінку стандартного компонента, зберігаючи можливість оновлення ядра (з документації Бітрікс).
Компонент-обгортка — повна заміна логіки
Якщо потрібно повністю перевизначити логіку, але викликати оригінал — створюєте компонент з іншим ім'ям. Використовується рідко, зазвичай для агрегації даних з кількох компонентів.
Зведена таблиця механізмів
| Задача | Рекомендований механізм |
|---|---|
| Додати обчислюване поле до результату | result_modifier.php |
| Змінити SQL-фільтр | Подія OnBefore* |
| Розширити бізнес-логіку | Клас-розширення в /local/ |
| Повна заміна зі збереженням шаблонів | Клас-розширення + перевизначення методів |
| Перевикористати компонент з іншими параметрами | Компонент-обгортка |
Як розширити компонент без втрати оновлень?
Відповідь проста: використовуйте клас-розширення або події. Вони зберігають сумісність з ядром і не вимагають ручного злиття при оновленні. Результат — зниження часу на оновлення на 80% та економія на підтримці до 40%.
Як вибрати підходящий механізм?
Якщо потрібно швидко додати поле — result_modifier.php. Якщо потрібно змінити запит — події. Для серйозної бізнес-логіки — клас-розширення. Компонент-обгортка — для випадків, коли потрібно повністю змінити поведінку.
Як ми реалізуємо розширення компонентів без копіювання?
Наш підхід — використовувати рідні механізми Бітрікс, зберігаючи оновлюваність. Процес включає п'ять етапів:
- Аудит кодової бази — знаходимо всі копії компонентів, оцінюємо обсяг та складність.
- Проектування — обираємо оптимальний механізм для кожного випадку.
- Реалізація — пишемо класи-розширення, обробники подій, модифікатори.
- Тестування — перевіряємо сумісність з шаблонами та кастомними доробками.
- Підтримка — надаємо документацію, навчаємо вашу команду та даємо гарантію на 12 місяців.
Що входить в роботу:
- Повна відмова від копій компонентів (рефакторинг).
- Оптимізація запитів та кешування.
- Тестування на всіх канонічних сценаріях.
- Навчання вашої команди роботі з розширеннями.
- Гарантія зворотної сумісності.
Приклад з практики: для інтернет-магазину з каталогом з 50 000 товарів ми замінили 12 копій компонентів на класи-розширення. Час оновлення ядра скоротився з 3 днів до 4 годин. Економія на підтримці — 40% на рік.
Строки та вартість
| Тип робіт | Орієнтовні строки |
|---|---|
| Розширення одного компонента (result_modifier) | 2–4 години |
| Розширення через клас-спадкоємець | 1–3 дні |
| Рефакторинг усіх копій компонентів | 3–8 днів (залежить від кількості) |
Точна вартість розраховується індивідуально після аудиту. Готові позбутися копій компонентів? Замовте аудит — наші інженери оцінять проект і запропонують оптимальне рішення.







