Знижуємо вартість підтримки Бітрікс: рефакторинг коду на D7 ORM

Коли ми відкриваємо проект Бітрікс, написаний кілька років тому, перше, що впадає в око — глобальні змінні та конкатенація SQL-рядків? Клієнти скаржаться на повільну роботу каталогу, а кожен новий фіча-реквест перетворюється на переписування половини коду. Один з наших клієнтів, інтернет-магазин
Послуги, які ми пропонуємо
Показано 1 з 1Усі 1626 послуг
Знижуємо вартість підтримки Бітрікс: рефакторинг коду на D7 ORM
Середній
~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

Коли ми відкриваємо проект Бітрікс, написаний кілька років тому, перше, що впадає в око — глобальні змінні та конкатенація 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+ рядків коду. Правильний підхід — пошаровий рефакторинг з виділенням пріоритетів.

Покроковий план рефакторингу
  1. Аудит. Інвентаризація проблемних місць:
    • SQL-запити з конкатенацією рядків (потенційні SQL-ін'єкції)
    • Глобальні змінні в логіці (global $DB, global $USER, global $APPLICATION)
    • Важкі запити через CIBlockElement::GetList без лімітів
    • Дублюючий код однієї логіки в різних файлах
  2. Створення сервісного шару. Нові класи-сервіси на D7 API для кожної зони відповідальності. Старий код викликає нові сервіси.
  3. Поступова заміна. За модулями та функціональними блоками. Кожен блок після заміни — регресійне тестування.
  4. Видалення застарілого коду. Тільки коли новий шлях перевірений у бою.

Що входить у рефакторинг на 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 не стає надійнішим з часом — з кожним оновленням Бітрікс ризик несумісності зростає. Отримайте консультацію та оцінку вашого проекту — зв'яжіться з нами для підготовки комерційної пропозиції з детальним планом робіт.