Розробка соціальної мережі на 1С-Bitrix
Соціальна мережа — один із найскладніших типів веб-застосунків за навантаженням на базу даних. Стрічка активностей, підписки, лайки, коментарі, сповіщення в реальному часі — кожна з цих функцій потребує нетривіальних архітектурних рішень. 1С-Bitrix має вбудований модуль «Соціальна мережа» (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 (множинне).
Стрічка активностей
Вбудована жива стрічка Bitrix — хороша основа. Але для кастомної соціальної мережі зазвичай потрібен інший алгоритм формування стрічки. Два підходи:
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 для лайків. Краще використовувати її, ніж винаходити свою — Bitrix автоматично відображає лічильники лайків в інтерфейсах.
// Поставити лайк через 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 через Bitrix Push Server. У корпоративних інсталяціях Bitrix24 доступний 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 днів |







