Разработка и настройка модулей 1С-Битрикс
Главная ловушка Битрикса — init.php. Сунул туда обработчик OnBeforeIBlockElementUpdate, потом ещё один, через год файл на 2000 строк, и при каждом хите весь этот ком выполняется. Мы переносим бизнес-логику в полноценные модули с D7 ORM, собственными таблицами и административным интерфейсом. Модуль можно отключить, перенести на другой проект, покрыть тестами — с init.php ничего из этого не получится.
Стандартные модули: где граблей больше всего
Информационные блоки. Архитектура ИБ — первое, что мы ревьюим на любом проекте. Классическая ошибка: один инфоблок каталога с 80 свойствами, из которых 30 — множественные. Таблица b_iblock_element_property раздувается до миллионов строк, CIBlockElement::GetList на фильтрации по трём свойствам уходит в полное сканирование. Переносим справочники в Highload-блоки, убираем множественные свойства где можно, проектируем структуру с прицелом на то, что каталог вырастет в 5 раз.
Интернет-магазин (sale). Модуль мощный, но бизнес-правила корзины — отдельная история. Настраиваем приоритеты скидок, чтобы две акции не дали 60% вместо 30%, подключаем платёжные обработчики, прописываем обработчики OnSaleOrderBeforeSaved для кастомной валидации.
Поиск. Встроенный модуль search с морфологией работает до 10-15 тысяч элементов. Дальше — Elasticsearch. Настраиваем через API модуля поиска Битрикс, индексируем через CSearchFullText или кастомные индексаторы.
Highload-блоки. Для справочников, логов, пользовательских данных — вместо раздутых ИБ. Прямые запросы через Bitrix\Highloadblock\HighloadBlockTable, собственные таблицы вместо EAV-структуры стандартных инфоблоков. Миллион записей — без деградации.
Почтовые события. Настройка — не только шаблоны в b_event_message. Главное — SPF, DKIM, DMARC на DNS, иначе транзакционные письма летят в спам. Проверяем доставляемость, настраиваем bounce-обработку.
Разработка кастомных модулей
Каждый модуль — по структуре /local/modules/vendor.modulename/:
-
install/index.php— класс установки, создание таблиц через$DB->RunSQLBatch() -
lib/— классы D7 ORM, наследникиBitrix\Main\ORM\Data\DataManager -
admin/— административные страницы черезCAdminList,CAdminForm -
include.php— автозагрузка, регистрация обработчиков черезEventManager::getInstance()->registerEventHandler() - REST API endpoints через
\Bitrix\Rest\RestManager
Модуль регистрируется в системе, появляется в списке «Установленные решения», имеет свои настройки в /bitrix/admin/settings.php?mid=vendor.modulename. Его можно включать, отключать, обновлять через UpdateSystem или свой механизм миграций.
Что делали:
- Управление акциями — визуальный конструктор условий через
CAdminCalendar, таймеры через агенты (CAgent::AddAgent), аналитика эффективности в связке с модулем sale - Калькулятор стоимости — React-виджет на фронте, REST API в модуле, формулы хранятся в Highload-блоке
- Система бронирования — real-time календарь, блокировка через
$DB->StartTransaction()/$DB->Commit()при одновременных запросах, синхронизация с channel manager через webhook
Компоненты и композитный кэш
Кастомизация компонентов — через result_modifier.php и component_epilog.php, не через правку template.php стандартного шаблона. Так ядро обновляется безболезненно.
Композитный кэш (технология «Композитный сайт») — сервер отдаёт готовый HTML, минуя PHP-роутинг. Динамические зоны (корзина, авторизация) подгружаются через CBitrixComponent::setFrameMode(true) и AJAX. TTFB падает до 30-50 мс. Но есть нюансы: не все компоненты совместимы, $APPLICATION->ShowPanel() ломает композит, нужна аккуратная разметка <div id="bx-composite-...">.
Маркетплейс: аудит перед установкой
Перед установкой модуля с маркетплейса — обязательный аудит. Проверяем: SQL-запросы без подготовленных выражений (привет, SQL-инъекции), прямое обращение к $_REQUEST без фильтрации, использование устаревшего API старого ядра вместо D7, конфликты с модулем композитного кэширования. Модуль без обновлений больше года и с парой десятков установок — скорее всего, headache на ближайшем обновлении PHP.
Миграция на D7
При обновлении PHP до 8.x или переходе на новую редакцию — рефакторинг устаревших вызовов:
-
CIBlockElement::GetList()→Bitrix\Iblock\Elements\ElementTable::getList() -
CSaleOrder::GetList()→Bitrix\Sale\Order::getList() -
CModule::IncludeModule()→Bitrix\Main\Loader::includeModule() - Тестирование на staging, откат через git при проблемах
Стоимость разработки модулей
| Сложность | Примеры | Сроки | Ориентировочная стоимость |
|---|---|---|---|
| Простой | Виджет обратного звонка, баннерная система, простой калькулятор | 3-5 дней | от 30 000 руб. |
| Средний | Система бронирования, конфигуратор товаров, модуль отзывов с модерацией | 1-2 недели | от 80 000 руб. |
| Сложный | Мультирегиональность, кастомная программа лояльности, интеграция с ERP | 2-4 недели | от 150 000 руб. |
| Enterprise | Маркетплейс-платформа, сложные бизнес-процессы с множеством ролей | 1-3 месяца | от 350 000 руб. |
В стоимость входит проектирование, разработка, тестирование, документация и установка.
Тестирование модулей
Unit-тесты через PHPUnit. Покрываем бизнес-логику: расчёт скидок, валидация, формирование документов. Моки для Bitrix\Main\Application::getConnection() — чтобы тесты не зависели от БД.
Интеграционные тесты. Проверяем обработчики событий на реальной базе — OnAfterIBlockElementAdd, OnSaleOrderSaved и прочие. REST API endpoints тестируем через curl или PHPUnit HTTP-клиент. Критично для модулей, работающих с b_sale_order, b_catalog_price — где ошибка стоит денег.
Совместимость. PHP 7.4, 8.0, 8.1, 8.2. Редакции: Стандарт, Малый бизнес, Бизнес. Проверяем конфликты с популярными модулями маркетплейса — они любят перехватывать те же события.
Нагрузочное. Для модулей с большими объёмами: замеры на 10K, 100K, 1M записей. Профилирование через Xdebug на предмет утечек памяти и N+1 запросов.
Примеры из практики
Модуль акций для сети электроники. Штатные скидки модуля sale не покрывали сценарии «2+1», подарок при покупке от суммы, комбинированные условия. Собрали визуальный конструктор: маркетолог создаёт правила через drag-and-drop, без тикетов в разработку. Календарь акций, автодеактивация через агенты, аналитика в привязке к b_sale_order — конверсия, средний чек, количество применений. Время запуска новой акции упало с двух дней до получаса.
Калькулятор для строителей. Параметры (площадь, материалы, этажность) → формула → предварительная смета → заявка в CRM через CRest::call('crm.lead.add'). Региональные коэффициенты и сезонные наценки — из Highload-блока, цены материалов — из обмена с 1С. Количество целевых заявок выросло на треть: клиенты видят разбивку по статьям до звонка менеджеру.
Бронирование для сети отелей. Real-time доступность через AJAX-запросы к кастомной таблице vendor_booking_slots, расчёт тарифов по сезону, синхронизация с Booking.com через channel manager API. Блокировка номера при одновременном бронировании — через SELECT ... FOR UPDATE в транзакции. Таймзоны обрабатываются через \DateTimeZone — гость из Владивостока и менеджер из Москвы видят одну картину.







