Разработка доски объявлений на 1С-Битрикс под ключ

Разработка доски объявлений на 1С-Битрикс Доска объявлений — не просто «список товаров». Пользователи сами создают контент, нужна модерация, гибкий поиск с фильтрами, управление статусами и сроками. Без готового решения приходится строить эту логику с нуля. Мы уже реализовали такие проекты, поэто
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Разработка доски объявлений на 1С-Битрикс под ключ
Средний
~1-2 недели

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1460
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1019
  • Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    764
  • Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    882
  • Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    809
  • Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1165

Разработка доски объявлений на 1С-Битрикс

Доска объявлений — не просто «список товаров». Пользователи сами создают контент, нужна модерация, гибкий поиск с фильтрами, управление статусами и сроками. Без готового решения приходится строить эту логику с нуля. Мы уже реализовали такие проекты, поэтому знаем типичные грабли: например, замедление поиска при 50 000 объявлениях или проблемы с кэшированием при большом числе VIP-объявлений. Стоимость исправления таких ошибок может быть сопоставима с начальной разработкой, поэтому важно заложить правильную архитектуру с первого дня. Неправильное проектирование может обойтись в около $900–1.3k, поэтому мы рекомендуем тщательно подходить к выбору технологий.

Наш подход — использовать инфоблоки, HL-блоки, компоненты 2.0 и тегированное кэширование. > Согласно официальной документации, компонент 2.0 позволяет кэшировать отдельные части шаблона, что критично для производительности. В этой статье разберём ключевые блоки доски: от структуры данных до агента истечения срока. Если вы планируете запустить доску объявлений — получите консультацию: мы подготовим ТЗ и рассчитаем сроки.

Как устроена структура инфоблока объявлений?

Инфоблок — основное хранилище. Символьный код: classifieds. Тип: ADS. Обязательные свойства:

Свойство Код Тип
Цена PRICE Число
Тип сделки DEAL_TYPE Список (Продам/Куплю/Обменяю/Отдам)
Город CITY Справочник (HL-блок)
Телефон продавца PHONE Строка
Статус AD_STATUS Список (Активно/Модерация/Отклонено/Истекло)
Дата истечения EXPIRE_DATE Дата
Просмотры VIEW_COUNT Число
VIP IS_VIP Флаг
Пользователь USER_ID Число (FK на b_user)
Фотографии PHOTOS Файл (множественное)
Дата создания DATE_CREATE Дата (автоматически)

Раздел инфоблока — категория объявлений (Транспорт, Недвижимость и т.д.). Иерархия разделов — дерево через b_iblock_section. Такая структура обеспечивает быстрый поиск и фильтрацию по категориям.

Размещение объявления пользователем: пошаговая инструкция

Форма добавления объявления — страница /ads/add/. Процесс состоит из нескольких шагов:

  1. Авторизация: если пользователь не авторизован, его перенаправляет на /auth/.
  2. Заполнение формы: пользователь вводит название, описание, цену, категорию, загружает фотографии.
  3. Валидация: проверка обязательных полей, формата телефона, размеров изображений.
  4. Отправка на модерацию: объявление сохраняется с флагом ACTIVE='N' и статусом MODERATION. Модераторы получают уведомление.
  5. Подтверждение: после успешного сохранения пользователь видит сообщение об успехе.

Ключевой момент: пользователь загружает контент — нужна защита от спама и обязательная модерация.

// /local/components/local/ads.add/class.php namespace Local\Ads; class AdsAddComponent extends \CBitrixComponent { public function executeComponent(): void { if (!$GLOBALS['USER']->IsAuthorized()) { LocalRedirect('/auth/?backurl=/ads/add/'); return; } if ($this->request->isPost() && check_bitrix_sessid()) { $this->addAd(); } $this->includeComponentTemplate(); } private function addAd(): void { $el = new \CIBlockElement(); // Обработка загруженных фотографий $photos = []; if (!empty($_FILES['PHOTOS']['tmp_name'])) { foreach ($_FILES['PHOTOS']['tmp_name'] as $i => $tmpName) { if (is_uploaded_file($tmpName)) { $photos[] = [ 'name' => $_FILES['PHOTOS']['name'][$i], 'size' => $_FILES['PHOTOS']['size'][$i], 'tmp_name' => $tmpName, 'type' => $_FILES['PHOTOS']['type'][$i], ]; } } } $adId = $el->Add([ 'IBLOCK_ID' => CLASSIFIEDS_IBLOCK_ID, 'NAME' => htmlspecialchars($this->request->getPost('title')), 'DETAIL_TEXT' => htmlspecialchars($this->request->getPost('description')), 'IBLOCK_SECTION_ID' => (int)$this->request->getPost('category_id'), 'ACTIVE' => 'N', // Изначально неактивно, до модерации 'PROPERTY_VALUES' => [ 'PRICE' => (float)$this->request->getPost('price'), 'DEAL_TYPE' => $this->request->getPost('deal_type'), 'PHONE' => htmlspecialchars($this->request->getPost('phone')), 'USER_ID' => $GLOBALS['USER']->GetID(), 'AD_STATUS' => 'MODERATION', 'EXPIRE_DATE' => date('d.m.Y', strtotime('+30 days')), 'VIEW_COUNT' => 0, 'PHOTOS' => $photos, ], ]); if ($adId) { $this->arResult['SUCCESS'] = true; $this->arResult['AD_ID'] = $adId; // Уведомить модераторов $this->notifyModerators($adId); } else { $this->arResult['ERROR'] = $el->LAST_ERROR; } } } 

Как работает модерация объявлений?

Страница модератора — стандартный список элементов инфоблока с фильтром по AD_STATUS = MODERATION. Действия модератора меняют статус и активность:

// Одобрить объявление $el = new \CIBlockElement(); $el->Update($adId, ['ACTIVE' => 'Y']); \CIBlockElement::SetPropertyValues($adId, CLASSIFIEDS_IBLOCK_ID, 'ACTIVE', 'AD_STATUS'); // Отклонить с причиной \CIBlockElement::SetPropertyValues($adId, CLASSIFIEDS_IBLOCK_ID, [ 'AD_STATUS' => 'REJECTED', 'REJECT_REASON' => $reason, ]); $el->Update($adId, ['ACTIVE' => 'N']); // Уведомить пользователя $event = new \Bitrix\Main\Mail\Event([ 'EVENT_NAME' => 'AD_MODERATION_RESULT', 'LID' => SITE_ID, 'C_FIELDS' => [ 'AD_ID' => $adId, 'STATUS' => $status, 'REASON' => $reason, ], ]); $event->send(); 

Модератор может также отредактировать объявление, изменить цену или категорию. Все действия логируются.

Поиск и фильтрация

Фильтр объявлений — критическая часть UX. Для простого поиска — стандартный CIBlockElement::GetList() с фильтром. Для нагруженного проекта (более 100 000 объявлений) — фасетный поиск Битрикс (модуль search) или интеграция с ElasticSearch. Фасетный поиск работает в 3–5 раз быстрее стандартного при сложных фильтрах.

Пример фильтра с диапазоном цен:

$filter = [ 'IBLOCK_ID' => CLASSIFIEDS_IBLOCK_ID, 'ACTIVE' => 'Y', 'SECTION_ID' => $categoryId, '>PROPERTY_PRICE' => $priceMin, '<PROPERTY_PRICE' => $priceMax, 'PROPERTY_CITY' => $cityId, 'PROPERTY_AD_STATUS' => 'ACTIVE', ]; $sort = ['PROPERTY_IS_VIP' => 'DESC', 'DATE_ACTIVE_FROM' => 'DESC']; 

VIP-объявления всегда наверху через сортировку по флагу IS_VIP DESC. При 500 000 объявлениях мы рекомендуем использовать поисковый индекс с инкрементальным обновлением.

Истечение срока объявлений

Агент проверяет просроченные объявления раз в сутки. Регистрация агента и метод обработки:

// Регистрация агента в /local/php_interface/init.php \CAgent::AddAgent( 'Local\\Ads\\ExpireAgent::run();', 'local.ads', 'N', 86400, // Раз в сутки ); // Метод агента class ExpireAgent { public static function run(): string { $today = date('d.m.Y'); $result = \CIBlockElement::GetList( [], [ 'IBLOCK_ID' => CLASSIFIEDS_IBLOCK_ID, 'ACTIVE' => 'Y', '<PROPERTY_EXPIRE_DATE' => $today, ], false, false, ['ID', 'PROPERTY_USER_ID'] ); while ($ad = $result->Fetch()) { $el = new \CIBlockElement(); $el->Update($ad['ID'], ['ACTIVE' => 'N']); \CIBlockElement::SetPropertyValues($ad['ID'], CLASSIFIEDS_IBLOCK_ID, 'EXPIRED', 'AD_STATUS'); // Уведомить пользователя } return 'Local\\Ads\\ExpireAgent::run();'; } } 

Для каталога в 1 000 000 объявлений агент может выполняться дольше 5 минут. В таких случаях мы запускаем агент частями по 1000 записей и используем блокировки.

Личный кабинет пользователя

Страница /personal/ads/ — список объявлений текущего пользователя:

$myAds = \CIBlockElement::GetList( ['DATE_CREATE' => 'DESC'], [ 'IBLOCK_ID' => CLASSIFIEDS_IBLOCK_ID, 'PROPERTY_USER_ID' => $GLOBALS['USER']->GetID(), ], false, ['nPageSize' => 20], ['ID', 'NAME', 'ACTIVE', 'PROPERTY_AD_STATUS', 'PROPERTY_EXPIRE_DATE', 'PROPERTY_VIEW_COUNT'] ); 

Действия пользователя: редактировать, деактивировать, продлить срок (если объявление истекло), удалить. Также отображается статистика просмотров и контактов.

Счётчик просмотров

При каждом открытии детальной страницы — инкрементировать счётчик. Через AJAX, чтобы не замедлять начальный рендер и не считать ботов: отправляем POST-запрос с ad_id, получаем текущее значение через CIBlockElement::GetProperty, обновляем PROPERTY_VIEW_COUNT. Для высоконагруженных проектов (более 10 000 просмотров в час) рекомендуем асинхронную очередь или Redis, чтобы не блокировать запись на каждом просмотре.

Что входит в работу?

При заказе доски объявлений под ключ мы предоставляем:

  • подробное техническое задание с прототипом;
  • настройку инфоблоков, HL-блоков и агентов;
  • разработку кастомных компонентов и AJAX-обработчиков;
  • интеграцию с платёжными системами и сервисами доставки (СДЭК, Почта России);
  • документацию и обучение персонала;
  • 2 недели гарантийной поддержки после запуска.

Сроки разработки

Вариант Состав Срок
Базовая доска Инфоблок, размещение, список, фильтр 8–12 дней
С модерацией и ЛК + Модерация, личный кабинет, агент истечения 12–18 дней
Полнофункциональная + VIP-объявления, поиск, уведомления, статистика 20–30 дней

Свяжитесь с нами, чтобы получить консультацию и точную оценку вашего проекта. Наши инженеры имеют 5+ лет опыта в разработке на 1С-Битрикс и гарантируют безопасность данных. Закажите разработку доски объявлений, которая будет стабильно работать под нагрузкой и приносить прибыль.