Снижаем стоимость поддержки Битрикс: рефакторинг кода на 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 Appointment Booking Widget for a Medical Center
    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 не становится надёжнее со временем — с каждым обновлением Битрикс риск несовместимости растёт. Получите консультацию и оценку вашего проекта — свяжитесь с нами для подготовки коммерческого предложения с детальным планом работ.