Ми впроваджуємо D7 API в проекти на Бітрікс, створюючи класи з неймспейсами замість глобальних функцій, об'єкти Result замість bool та рядків помилок, і використовуємо Application як точку входу замість глобальних змінних. Такий код не ламається при оновленні, легко тестується та перевикористовується. Наш досвід: понад 5 років роботи з Бітрікс, понад 30 проектів з повним переходом на D7. Оцінимо ваш проект — пишіть!
Проблеми, які вирішуємо
Типові болі: застарілий код на CModule та $_POST ламається при оновленнях, неможливо покрити тестами, помилки губляться (return false без контексту), а кеш інвалідується лише за часом. D7 API вирішує це через строгу типізацію, винятки та тегований кеш. В результаті кількість помилок у продакшені знижується в 2–3 рази, а час на деплой нового функціоналу скорочується на 40%.
Чому варто перейти на D7 API?
Перехід на D7 API — це не мода, а необхідність для проектів, які живуть довше року. Замість CIBlockElement::GetList() з купою параметрів ви отримуєте ORM-запити з ланцюжками методів. Замість $_POST['field'] — об'єкт Request з типізованим доступом. Ваш код стає передбачуваним і документованим. Порівняємо обсяг legacy-коду та D7: на 1000 рядків legacy припадає приблизно 800 рядків D7, але при цьому D7-код на 60% легше підтримувати.
Як ми розробляємо класи на D7
Візьмемо реальний кейс: інтернет-магазин на Бітрікс з 50 000 товарів. Старий код кошика працював через CSaleBasket::Add і розмазаний по шаблонах. Ми переписали його на сервісний клас BasketService з D7:
namespace MyProject\Services; use Bitrix\Main\Result; use Bitrix\Main\Error; use Bitrix\Sale\Basket; class BasketService { public function __construct( private readonly int $userId ) {} public function addItem(int $productId, int $quantity): Result { $result = new Result(); $basket = Basket::loadItemsForUser($this->userId); if (!$basket) { $result->addError(new Error('Не вдалося завантажити кошик', 'BASKET_LOAD_FAIL')); return $result; } $item = $basket->createItem('catalog', $productId); $item->setFields(['QUANTITY' => $quantity]); $saveResult = $basket->save(); if (!$saveResult->isSuccess()) { $result->addErrors($saveResult->getErrors()); } return $result; } } Тепер кошик повністю покритий юніт-тестами, а при оновленні Бітрікс достатньо замінити один клас, а не переписувати всі шаблони. Це скоротило час на оновлення з 3 днів до 2 годин.
Як D7 API покращує кешування?
Теговане кешування — одна з сильних сторін D7. Замість глобального скидання кешу за часом ви інвалідуєте лише ті дані, які змінилися. Наприклад, при оновленні ціни товару скидається кеш саме цього товару, а не всього каталогу. Це знижує навантаження на базу даних на 30–50%.
Архітектурні патерни: фабрики та репозиторії
Для складної логіки ми використовуємо фабрики (Factory) для створення об'єктів та репозиторії (Repository) для роботи зі сховищем. Наприклад, фабрика замовлень створює екземпляри Order із попередньо заповненими залежностями, а репозиторій товарів інкапсулює ORM-запити з тегованим кешем. Такий підхід дозволяє ізолювати бізнес-логіку від інфраструктури та легко підміняти реалізації при тестуванні.
Наш процес роботи
- Аудит поточного коду — виявляємо місця, де використовується legacy API.
- Проектуємо архітектуру — визначаємо сервіси, репозиторії, фабрики.
- Реалізуємо класи — пишемо код з Result, Application, тегованим кешем.
- Пишемо юніт-тести — покриваємо критичні сценарії.
- Інтеграція та деплой — замінюємо старі модулі частинами, зберігаючи зворотну сумісність.
Детальніше про принципи розробки
Кожен сервісний клас має бути вузькоспрямованим і відповідати за одну бізнес-операцію. Ми використовуємо впровадження залежностей через конструктор, а не через глобальні функції. Це робить код тестованим і замінним.Що входить у розробку
- Повний набір D7-класів (сервіси, репозиторії, фабрики, об'єкти Result)
- Документація по API в PHPDoc
- Юніт-тести (за запитом)
- Адаптація існуючого коду для роботи з новими класами
- Інструкції з встановлення та підтримки
Порівняння D7 API з Legacy API
| Критерій | Legacy API | D7 API |
|---|---|---|
| Обробка помилок | return false |
Result з масивом помилок |
| Типізація | Змішана (mixed) | Строга (PHP 8.1+) |
| Тестованість | Низька (глобальні функції) | Висока (залежності через DI) |
| Кешування | Час життя | Тегована інвалідація |
| Оновлення Бітрікс | Часто ламається | Сумісно з новими версіями |
Терміни
| Завдання | Термін |
|---|---|
| Набір сервісних класів для окремої функціональності (5–10 класів) | 1–2 тижні |
| Повна сервісна прошарка для модуля (репозиторії, сервіси, фабрики, об'єкти Result) | 3–5 тижнів |
| Написання юніт-тестів для готових класів | +30–50% до термінів розробки |
Код на D7 API живе довго. Його можна оновлювати частинами, тестувати та перевикористовувати. Замовте розробку D7-класів під ключ — оцінимо проект за 1 день. Гарантуємо сумісність з останніми версіями Бітрікс.
Детальніше про D7 API читайте в офіційній документації та у Wikipedia про неймспейси PHP.
Зв'яжіться з нами для консультації — допоможемо з міграцією на D7. Отримайте комерційну пропозицію та оцінку вартості протягом дня.







