Разработка социальной сети на 1С-Битрикс
Социальная сеть — один из самых сложных типов веб-приложений по нагрузке на базу данных. Лента активностей, подписки, лайки, комментарии, уведомления в реальном времени — каждая из этих функций требует нетривиальных архитектурных решений. 1С-Битрикс имеет встроенный модуль «Социальная сеть» (socialnetwork), который покрывает значительную часть базового функционала. Вопрос — насколько глубокая кастомизация нужна.
Встроенный модуль socialnetwork
Модуль socialnetwork входит в редакции «Бизнес» и выше. Он предоставляет:
- Группы пользователей (не путать с группами доступа) — аналог сообществ.
- Ленту живой ленты (
b_sonet_log,b_sonet_log_right,b_sonet_log_event). - Систему подписок (
b_sonet_subscription). - Сообщения (
b_sonet_message). - Контакты/друзья (
b_sonet_relations). - Рабочие группы.
Если функционал встроенного модуля достаточен — используем его, не изобретаем велосипед. Если нужна глубокая кастомизация UI/UX или нестандартная логика — строим поверх или рядом.
Профиль пользователя
Расширенный профиль пользователя — через UF-поля (пользовательские поля таблицы b_user_field). Добавляются в административной части или программно:
$userType = new \CUserTypeEntity();
$userType->Add([
'ENTITY_ID' => 'USER',
'FIELD_NAME' => 'UF_AVATAR_FULL',
'USER_TYPE_ID' => 'file',
'XML_ID' => 'UF_AVATAR_FULL',
'SORT' => 100,
'MULTIPLE' => 'N',
'MANDATORY' => 'N',
'SHOW_FILTER' => 'N',
'SHOW_IN_LIST' => 'N',
'EDIT_IN_LIST' => 'Y',
'IS_SEARCHABLE' => 'N',
'SETTINGS' => ['EXTENSIONS' => 'jpg,jpeg,png,gif,webp'],
'EDIT_FORM_LABEL' => ['ru' => 'Фото профиля', 'en' => 'Profile photo'],
]);
Типовые UF-поля профиля для социальной сети: UF_ABOUT, UF_CITY, UF_WEBSITE, UF_SOCIAL_VK, UF_SOCIAL_TG, UF_INTERESTS (множественное).
Лента активностей
Встроенная живая лента Битрикс — хорошая основа. Но для кастомной социальной сети обычно нужен другой алгоритм формирования ленты. Два подхода:
Pull-модель (простая). Пользователь открывает ленту — запрос к БД собирает события от всех, на кого подписан:
// Получить ID пользователей, на которых подписан текущий
$subscriptions = \Bitrix\Socialnetwork\UserToUserTable::getList([
'filter' => [
'FROM_USER_ID' => $currentUserId,
'RELATION' => \Bitrix\Socialnetwork\UserToUserTable::RELATION_SUBSCRIBED,
],
'select' => ['TO_USER_ID'],
])->fetchAll();
$followedIds = array_column($subscriptions, 'TO_USER_ID');
$followedIds[] = $currentUserId; // Свои посты тоже в ленте
// Получить посты
$posts = FeedPostTable::getList([
'filter' => ['AUTHOR_ID' => $followedIds, 'IS_DELETED' => false],
'order' => ['CREATED_AT' => 'DESC'],
'limit' => 20,
'offset' => $page * 20,
])->fetchAll();
Push-модель (масштабируемая). При публикации поста — добавить запись в таблицу b_local_feed_{userId} для каждого подписчика. Лента пользователя = его личная таблица. Дорого при записи, быстро при чтении. Для большой аудитории (1000+ подписчиков у одного автора) — гибридная схема.
Посты и контент
HL-блок для постов:
class FeedPostTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string { return 'b_hl_social_post'; }
public static function getMap(): array
{
return [
new IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new IntegerField('AUTHOR_ID'),
new TextField('CONTENT'), // Текст поста
new StringField('CONTENT_TYPE'), // text | html
new BooleanField('IS_DELETED', ['values' => [false, true]]),
new IntegerField('LIKES_COUNT'),
new IntegerField('COMMENTS_COUNT'),
new IntegerField('REPOSTS_COUNT'),
new DatetimeField('CREATED_AT'),
new DatetimeField('UPDATED_AT'),
new StringField('PRIVACY'), // public | friends | private
];
}
}
Медиавложения к постам — отдельная таблица b_hl_social_post_media с полями: POST_ID, TYPE (image/video/file), FILE_ID (ссылка на b_file), SORT.
Лайки и реакции
Встроенный модуль socialnetwork имеет таблицу b_rating_vote для лайков. Лучше использовать её, чем изобретать свою — Битрикс автоматически отображает счётчики лайков в интерфейсах.
// Поставить лайк через API модуля rating
\Bitrix\Main\Loader::includeModule('rating');
$rating = new \CRating('BLOG_COMMENT', $postId, $authorId);
$rating->Like($currentUserId, 1);
Если нужны реакции (❤️, 😂, 😮) — отдельная таблица b_hl_social_reactions с типом реакции.
Уведомления в реальном времени
Для уведомлений без перезагрузки страницы — два варианта:
Long polling. Клиент периодически (раз в 10-30 сек) спрашивает сервер о новых уведомлениях. Просто реализовать, работает везде.
WebSocket через Битрикс Push Server. В корпоративных инсталляциях Битрикс24 доступен Push & Pull Server — WebSocket-сервер. Интеграция через JS-модуль BX.PullClient.
BX.ready(() => {
BX.PullClient.subscribe({
moduleId: 'local.social',
callback: (data) => {
if (data.command === 'new_notification') {
showNotification(data.params);
updateNotificationCounter();
}
}
});
});
На сервере при событии (лайк, комментарий, подписка):
\Bitrix\Pull\Event::add($targetUserId, [
'module_id' => 'local.social',
'command' => 'new_notification',
'params' => [
'type' => 'like',
'from_user' => $fromUserId,
'entity_id' => $postId,
'message' => $fromUserName . ' оценил ваш пост',
],
]);
\Bitrix\Pull\Event::send();
Система подписок
Отношения подписчик-автор — через \Bitrix\Socialnetwork\UserToUserTable или собственную таблицу. Важные состояния: подписан, подписка на рассмотрении (для закрытых аккаунтов), заблокирован.
Сроки разработки
| Вариант | Состав | Срок |
|---|---|---|
| На базе socialnetwork | Профили, группы, лента — через встроенный модуль | 15–25 дней |
| Кастомная соцсеть | Посты, подписки, лайки, уведомления, своя лента | 40–60 дней |
| Полная платформа | + Мессенджер, сторис, рекомендательная система | 80–120 дней |







