Коли ми відкриваємо проект Бітрікс, написаний кілька років тому, перше, що впадає в око — глобальні змінні та конкатенація SQL-рядків?
Клієнти скаржаться на повільну роботу каталогу, а кожен новий фіча-реквест перетворюється на переписування половини коду. Один з наших клієнтів, інтернет-магазин автозапчастин, втрачав до 15% замовлень через помилки в розрахунку доставки, викликані застарілим API. Після рефакторингу на D7 ми скоротили час на додавання нових способів доставки з 3 днів до 4 годин, а вартість підтримки знизилася на 40%. У проекті з 50 000 рядків коду на старому API кожен новий функціонал обходився втричі дорожче через необхідність обходити глобальні залежності. Наш рефакторинг — не «переписати заради переписування», а знизити вартість підтримки та виключити клас помилок, характерних для процедурного коду. Економія на підтримці досягає значної суми, окупність — менше 12 місяців. Зв'яжіться з нами для безкоштовної оцінки вашого проекту.
Що саме змінюється при переході на D7
Глобальні функції → методи DataManager:
// Було — старий API $res = CIBlockElement::GetList( ['SORT' => 'ASC'], ['IBLOCK_ID' => 5, 'ACTIVE' => 'Y'], false, ['nPageSize' => 20], ['ID', 'NAME', 'PROPERTY_PRICE'] ); while ($arItem = $res->GetNextElement()) { $arFields = $arItem->GetFields(); $arProps = $arItem->GetProperties(); } // Стало — D7 ORM $result = \Bitrix\Iblock\Elements\ElementProductsTable::getList([ 'select' => ['ID', 'NAME', 'PROPERTY_PRICE_VALUE'], 'filter' => ['=IBLOCK_ID' => 5, '=ACTIVE' => 'Y'], 'order' => ['SORT' => 'ASC'], 'limit' => 20, ]); foreach ($result->fetchCollection() as $element) { $name = $element->getName(); $price = $element->get('PROPERTY_PRICE_VALUE'); } SQL-рядки → Connection API:
// Було — прямий SQL з конкатенацією global $DB; $id = intval($id); // вся «захист» $res = $DB->Query("SELECT * FROM b_custom_table WHERE ID = " . $id); // Стало — параметризовані запити $connection = \Bitrix\Main\Application::getConnection(); $result = $connection->query( "SELECT * FROM my_custom_table WHERE ID = ?", [$id] ); // або через SqlHelper для складних випадків $helper = $connection->getSqlHelper(); $safeId = $helper->forSql((string)$id); Глобальний $APPLICATION → Context і Application:
// Було global $APPLICATION; $APPLICATION->SetTitle('Моя сторінка'); $APPLICATION->IncludeFile('/local/include/header.php'); // Стало — в контексті компонента або контролера $this->arResult['PAGE_TITLE'] = 'Моя сторінка'; // Підключення через D7-механізми або Inertia/React-підхід Чому старий API гальмує розвиток?
Безпека: конкатенація рядків у SQL — прямий шлях до SQL-ін'єкцій. Продуктивність: CIBlockElement::GetList() без лімітів вивантажує всю таблицю. Тестованість: глобальні залежності не дозволяють ізолювати бізнес-логіку. Детальніше про параметризовані запити читайте на Wikipedia.
Як поетапно провести рефакторинг?
Переписати весь проект за один раз — погана ідея. Навіть невеликий інтернет-магазин містить 50 000+ рядків коду. Правильний підхід — пошаровий рефакторинг з виділенням пріоритетів.
Покроковий план рефакторингу
- Аудит. Інвентаризація проблемних місць:
- SQL-запити з конкатенацією рядків (потенційні SQL-ін'єкції)
- Глобальні змінні в логіці (
global $DB,global $USER,global $APPLICATION) - Важкі запити через
CIBlockElement::GetListбез лімітів - Дублюючий код однієї логіки в різних файлах
- Створення сервісного шару. Нові класи-сервіси на D7 API для кожної зони відповідальності. Старий код викликає нові сервіси.
- Поступова заміна. За модулями та функціональними блоками. Кожен блок після заміни — регресійне тестування.
- Видалення застарілого коду. Тільки коли новий шлях перевірений у бою.
Що входить у рефакторинг на D7?
Повний аудит кодової бази з виявленням критичних ділянок, створення сервісного шару та міграція на D7 ORM, заміна SQL-запитів на параметризовані через Connection::query, налаштування тегованого кешування та агентів, регресійне тестування кожної заміни, документація з нової архітектури, навчання вашої команди роботі з D7. Гарантія на виконані роботи фіксується в договорі.
Інфоблоки: перехід на D7-класи
З актуальної версії Бітрікс доступні автогенеровані класи для інфоблоків через Bitrix\Iblock\Elements:
// Включення в налаштуваннях інфоблоку — прапорець "API-код" // Генерується клас з namespace Bitrix\Iblock\Elements $result = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([ 'select' => ['ID', 'NAME', 'IBLOCK_SECTION_ID'], 'filter' => ['=ACTIVE' => 'Y'], ]); Це не повна заміна CIBlockElement — для запису (add/update) часто все ще використовується старий API, оскільки D7-обгортки для запису інфоблоків не покривають всі сценарії.
Типові пастки при рефакторингу
Втрата подій. Якщо старий код викликав CIBlockElement::Update(), на цю подію були навішані обробники (OnAfterIBlockElementUpdate). При переході на D7-методи події ORM інші. Потрібна перевірка: які обробники зав'язані на старі події.
Різниця в результатах GetList vs getList. CIBlockElement::GetList повертає властивості інфоблоку в специфічному форматі з суфіксами _VALUE, _ENUM_ID. ORM-методи повертають іншу структуру. Код, який обробляє результат, потрібно адаптувати.
Транзакції. Старий API не завжди обгортав операції в транзакції. D7 дає явні транзакції:
$connection = \Bitrix\Main\Application::getConnection(); $connection->startTransaction(); try { // кілька операцій $connection->commitTransaction(); } catch (\Throwable $e) { $connection->rollbackTransaction(); throw $e; } Як ми гарантуємо якість?
Ми сертифіковані спеціалісти 1С-Бітрікс з досвідом понад 5 років і більше 50 виконаними проектами з рефакторингу. Використовуємо стайлгайди та автоматичне тестування. Надаємо гарантію на код — при виявленні багів з нашої вини виправляємо безкоштовно протягом місяця.
Що рефакторити в першу чергу
| Пріоритет | Що | Чому |
|---|---|---|
| Критично | SQL з конкатенацією рядків | Безпека |
| Високий | Важкі GetList без лімітів | Продуктивність |
| Середній | Бізнес-логіка в компонентах | Підтримуваність |
| Плановий | Стилістичні глобальні змінні | Читаємість |
Терміни
| Обсяг проекту | Термін рефакторингу |
|---|---|
| Невеликий сайт (до 30 файлів з логікою) | 2–4 тижні |
| Середній інтернет-магазин (50–150 файлів) | 2–3 місяці |
| Великий портал або маркетплейс | 4–8 місяців (поетапно) |
Рефакторинг — це технічний борг, який платиш зараз, щоб не платити втричі більше через рік. Код на старому API не стає надійнішим з часом — з кожним оновленням Бітрікс ризик несумісності зростає. Отримайте консультацію та оцінку вашого проекту — зв'яжіться з нами для підготовки комерційної пропозиції з детальним планом робіт.







