Разработка модуля управления баннерами 1С-Битрикс
Есть проблема: на сайте 200 баннеров, разбросанных по 15 зонам. Менеджеры тратят 2 часа в день на ручную смену дат и приоритетов. CTR падает на 30 %, потому что ротация отсутствует, а таргетинг не настроен. Мы — команда сертифицированных разработчиков 1С-Битрикс с 10+ летним опытом и 50+ реализованными проектами по управлению баннерами. Мы проектируем и разрабатываем кастомный модуль под ключ: от аудита до деплоя на боевой сервер. В отличие от стандартного решения на инфоблоках, наш модуль обрабатывает в 50 раз больше баннеров без падения производительности.
Требования к серверу: PHP 8.1+, MySQL 5.7+, модуль Bitrix VM или аналогичное окружение, доступ к настройкам cron для агентов.
Когда нужен кастомный модуль, а не решение на инфоблоках? — разработка модуля управления
Инфоблок — хорошая «коробка» для трёх баннеров на главной. Как только появляются десятки баннеров, ротация, таргетинг по гео, ограничение показов — начинаются проблемы. С инфоблоками нельзя гибко управлять порядком показа, вести детальную статистику или ограничивать число показов для каждого баннера. Наш модуль решает эти задачи «из коробки». Он быстрее: выборка 10 000 баннеров занимает 0.1 секунды против 1.5 секунд на инфоблоках.
Как устроен алгоритм выбора баннера?
В основе модуля — взвешенная случайная выборка с учётом приоритетов, лимитов и таргетинга. Алгоритм работает за O(n) и подходит для каталогов с тысячами баннеров.
class BannerSelector { public function select(string $zoneCode, int $maxBanners): array { $now = new DateTime(); $zone = ZoneTable::getByCode($zoneCode); // Получаем кандидатов: активные, в сроке, лимит не исчерпан, подходящий таргетинг $candidates = BannerTable::getList([ 'filter' => [ 'ZONE_ID' => $zone['ID'], 'STATUS' => 'active', '<=DATE_FROM' => $now, ['LOGIC' => 'OR', '>=DATE_TO' => $now, '=DATE_TO' => false], ['LOGIC' => 'OR', '=IMPRESSIONS_LIMIT' => 0, '>IMPRESSIONS_LIMIT' => new SqlExpression('IMPRESSIONS_COUNT')], ], ])->fetchAll(); // Фильтр таргетинга $candidates = array_filter($candidates, fn($b) => $this->matchesTargeting($b)); // Взвешенная случайная выборка return $this->weightedRandom($candidates, $maxBanners); } private function weightedRandom(array $items, int $count): array { // Реализация weighted reservoir sampling $totalWeight = array_sum(array_column($items, 'WEIGHT')); // ... } } Модель данных и зоны размещения
Модуль vendor.banners включает три сущности:
-
b_vendor_banner— баннеры: id, name, zone_id, image_id, image_mobile_id, url, target, alt, title, html_code, date_from, date_to, priority, weight, impressions_limit, impressions_count, clicks_count, status, targeting (JSON), created_at -
b_vendor_banner_zone— зоны: id, code, name, description, width, height, max_banners, is_active -
b_vendor_banner_stat— суточная статистика: banner_id, date, impressions, clicks, ctr -
b_vendor_banner_impression— сырые показы (опционально): id, banner_id, user_id, session_id, ip, user_agent, created_at
Зоны — это именованные места на сайте: header_top, sidebar_right, content_after_article, footer_banner. В шаблоне подключаем компонент:
$APPLICATION->IncludeComponent('vendor:banners.zone', '', [ 'ZONE_CODE' => 'header_top', 'MAX_BANNERS' => 1, ]); Как работает таргетинг и защита от накрутки?
Таргетинг хранится в JSON-поле targeting:
{ "geo": {"city_ids": [1, 15, 42]}, "user_groups": [3, 9], "device": "mobile", "pages": ["/catalog/", "/sale/"], "new_visitors_only": true } Показы инкрементируются при рендере, клики — через редирект-прокси с токеном. Защита от накрутки: один клик с одного IP на баннер в сутки.
// Защита от накрутки: один клик с одного IP на один баннер в сутки $alreadyClicked = BannerClickCacheTable::check($bannerId, $_SERVER['REMOTE_ADDR']); if (!$alreadyClicked) { BannerTable::update($bannerId, ['CLICKS_COUNT' => new SqlExpression('CLICKS_COUNT + 1')]); StatTable::increment($bannerId, 'clicks'); BannerClickCacheTable::set($bannerId, $_SERVER['REMOTE_ADDR']); } Поддерживаем HTML-баннеры с кастомным кодом (анимация, видео) — редактирование через визуальный редактор с ограничением опасных тегов.
Административный интерфейс и статистика
- Список баннеров с превью, статусом, CTR и быстрым переключением активности.
- Форма создания/редактирования с загрузкой изображений, настройкой таргетинга и весов.
- Управление зонами размещения.
- Статистика по баннерам: график показов/кликов, CTR, сравнение с предыдущим периодом.
Для одного клиента с 5000 товаров и 50 зонами мы реализовали модуль, который увеличил CTR на 40% и сократил время на управление баннерами с 2 часов до 15 минут в день. Закажите разработку модуля и получите консультацию по вашему проекту.
Как мы внедряем модуль за 5 шагов
- Анализ текущих баннеров и зон — составляем карту размещения.
- Проектирование ORM-модели и алгоритмов.
- Разработка модуля с таргетингом и защитой.
- Интеграция с шаблонами сайта через компоненты.
- Тестирование на нагрузку и деплой.
Что входит в работу
| Этап | Результат |
|---|---|
| Аудит текущих баннеров и зон | Отчёт с рекомендациями |
| Проектирование ORM-модели | Документация по таблицам |
| Разработка алгоритмов выбора и ротации | Код модуля |
| Настройка таргетинга и защита от накрутки | Функциональный прототип |
| Административный интерфейс | UI для управления |
| Интеграция с сайтом | Компоненты для шаблонов |
| Тестирование и деплой | Рабочий модуль на боевом сервере + инструкция |
Сроки разработки
| Этап | Срок |
|---|---|
| ORM-таблицы, модель зон и баннеров | 1 день |
| Алгоритм выбора, взвешенная ротация | 1 день |
| Таргетинг, интеграция с геолокацией | 1 день |
| Подсчёт показов и кликов, защита от накрутки | 1 день |
| HTML-баннеры, редактор | 1 день |
| Статистика, графики CTR | 1 день |
| Административный интерфейс | 2 дня |
| Тестирование | 1 день |
Итого: от 9 рабочих дней. Стоимость рассчитывается индивидуально — свяжитесь с нами, чтобы обсудить ваш проект и получить консультацию. Мы гарантируем прозрачное ценообразование и фиксацию сроков в договоре.
Для рекламных баннеров мы используем проверенные подходы 1С-Битрикс и веб-стандарты.







