Розширення логіки стандартних компонентів без копіювання

Розширення логіки стандартних компонентів без копіювання 1С-Бітрікс Ми часто зустрічаємо проекти, де розробники копіюють стандартні компоненти Бітрікс. Це призводить до проблем при оновленнях. Уявіть: ваш інтернет-магазин пропрацював рік. Ви скопіювали catalog.section, додали кастомні поля та рей
Послуги, які ми пропонуємо
Показано 1 з 1Усі 1626 послуг
Розширення логіки стандартних компонентів без копіювання
Середній
~1-2 тижні

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

Часті запитання

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

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1454
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    1018
  • 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
    760
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    879
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    803
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1162

Розширення логіки стандартних компонентів без копіювання 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. Якщо потрібно змінити запит — події. Для серйозної бізнес-логіки — клас-розширення. Компонент-обгортка — для випадків, коли потрібно повністю змінити поведінку.

Як ми реалізуємо розширення компонентів без копіювання?

Наш підхід — використовувати рідні механізми Бітрікс, зберігаючи оновлюваність. Процес включає п'ять етапів:

  1. Аудит кодової бази — знаходимо всі копії компонентів, оцінюємо обсяг та складність.
  2. Проектування — обираємо оптимальний механізм для кожного випадку.
  3. Реалізація — пишемо класи-розширення, обробники подій, модифікатори.
  4. Тестування — перевіряємо сумісність з шаблонами та кастомними доробками.
  5. Підтримка — надаємо документацію, навчаємо вашу команду та даємо гарантію на 12 місяців.

Що входить в роботу:

  • Повна відмова від копій компонентів (рефакторинг).
  • Оптимізація запитів та кешування.
  • Тестування на всіх канонічних сценаріях.
  • Навчання вашої команди роботі з розширеннями.
  • Гарантія зворотної сумісності.

Приклад з практики: для інтернет-магазину з каталогом з 50 000 товарів ми замінили 12 копій компонентів на класи-розширення. Час оновлення ядра скоротився з 3 днів до 4 годин. Економія на підтримці — 40% на рік.

Строки та вартість

Тип робіт Орієнтовні строки
Розширення одного компонента (result_modifier) 2–4 години
Розширення через клас-спадкоємець 1–3 дні
Рефакторинг усіх копій компонентів 3–8 днів (залежить від кількості)

Точна вартість розраховується індивідуально після аудиту. Готові позбутися копій компонентів? Замовте аудит — наші інженери оцінять проект і запропонують оптимальне рішення.