Код-рев'ю проєкту на 1С-Бітрікс
Коли проєкт переходить до нової команди, накопичує кастомний код за кілька років або готується до масштабування — потрібен незалежний погляд на якість коду. Код-рев'ю Бітрікс-проєкту складніше за стандартне: потрібно розуміти і сучасні PHP-практики, і специфіку ядра Бітрікс — як правильно працювати з компонентами, коли використовувати D7 API замість старого ядра, чому прямі запити до b_iblock_element через CIBlockElement::GetList з повним перебором вбивають базу даних.
Що перевіряється при рев'ю
Архітектура та організація коду:
- Наявність кастомних модулів (
/local/modules/) замість правок у/bitrix/modules/ - Використання просторів імен та автозавантаження
- Розділення логіки: контролери не містять SQL, шаблони не містять бізнес-логіку
- Кастомні таблиці реалізовані через
\Bitrix\Main\ORM\Data\DataManager, а не голими запитами
Робота з базою даних:
Типові проблеми, які шукаємо:
// ПОГАНО: N+1, вибірка всіх елементів без ліміту
while ($arItem = $rsItems->Fetch()) {
$price = \CPrice::GetList([], ['PRODUCT_ID' => $arItem['ID']])->Fetch();
}
// ДОБРЕ: попередня вибірка цін пакетом
$productIds = array_column($items, 'ID');
$prices = \Bitrix\Catalog\PriceTable::getList([
'filter' => ['=PRODUCT_ID' => $productIds],
])->fetchAll();
$priceMap = array_column($prices, 'PRICE', 'PRODUCT_ID');
Безпека:
- SQL-ін'єкції через конкатенацію запитів без екранування
- XSS — виведення
$_GET/$_POSTбезhtmlspecialchars() - Прямий доступ до файлів без перевірки
B_PROLOG_INCLUDED - Зберігання API-ключів у коді замість налаштувань модуля
Використання кешу:
- Компоненти з важкими запитами без кешування
- Неправильне керування тегами кешу (інвалідація не спрацьовує при зміні елемента)
- Відсутність кешу на AJAX-ендпоінтах каталогу
D7 проти старого ядра:
| Що використовувати | Старе ядро | D7 API |
|---|---|---|
| Робота з користувачами | CUser::GetByID() |
\Bitrix\Main\UserTable::getById() |
| Інфоблоки | CIBlockElement::GetList() |
\Bitrix\Iblock\ElementTable::getList() |
| Відправка пошти | CEvent::Send() |
\Bitrix\Main\Mail\Event::send() |
| Робота з датами | ConvertTimeStamp() |
\Bitrix\Main\Type\DateTime |
Процес рев'ю
-
Статичний аналіз — запускаємо PHPStan (level 5–6) та PHP_CodeSniffer з правилами PSR-12. Автоматично виявляє ~40% проблем.
-
Ручний аналіз — перевіряємо ключові підсистеми: компоненти каталогу, оформлення замовлення, інтеграція з 1С, модулі авторизації.
-
Профілювання запитів — вмикаємо
define('BX_DEBUG', true)на dev-стенді, перевіряємо кількість SQL-запитів на сторінках каталогу та картці товару. Норма — до 30 запитів. Більше 100 — системна проблема. -
Звіт — структурований документ з класифікацією проблем за критичністю (Critical / High / Medium / Low), прикладом проблемного коду та рекомендацією щодо виправлення.
Кейс: маркетплейс на Бітрікс, 5 років розробки
Ситуація: проєкт розроблявся 5 років різними командами, поточний підрядник повідомляє про неможливість додати новий функціонал «через криву архітектуру».
Що знайшли при рев'ю:
- 847 прямих звернень до
$DB->Query()з конкатенацією без екранування — 12 потенційних SQL-ін'єкцій - N+1 у компоненті лістингу: 1 запит на список + N запитів на ціни (при N=50 — 51 запит замість 2)
- 3 місця зі зберіганням паролів у MD5 без солі
- Бізнес-логіка у файлах
template.phpкомпонентів — неможливо перевикористовувати та тестувати - 40% кастомного коду в
/bitrix/— оновлення ядра гарантовано ламає сайт
Результат рев'ю: пріоритизований план рефакторингу на 6 місяців, розбитий по епіках. Критичні вразливості усунуто за 2 тижні.
| Категорія | Знайдено проблем | Критичних |
|---|---|---|
| Безпека | 18 | 3 |
| Продуктивність (N+1, відсутність кешу) | 24 | 5 |
| Архітектура та організація коду | 31 | 0 |
| Застарілі API (старе ядро) | 67 | 0 |
Що входить до код-рев'ю
- Статичний аналіз PHPStan + PHPCS зі звітом по порушеннях
- Ручна перевірка ключових підсистем: каталог, замовлення, інтеграції, авторизація
- Профілювання SQL-запитів на dev-стенді
- Аудит безпеки: SQL-ін'єкції, XSS, зберігання секретів
- Підсумковий звіт з класифікацією за критичністю та рекомендаціями
- Консультація щодо плану рефакторингу







