Розробка сайту салону краси на 1С-Бітрікс
Сайт салону краси працює як ресепшн, який ніколи не йде на обід. Клієнт вибирає послугу, бачить вільного майстра, записується на зручний час — і все це без дзвінка. Якщо записи немає онлайн, салон втрачає тих, хто шукає «манікюр поруч» о 23:00 ночі і готовий забронювати прямо зараз.
Розберемо реалізацію на 1С-Бітрікс: від каталогу послуг до механіки онлайн-запису з розрахунком вільних слотів.
Каталог послуг: структура інфоблоків
Послуги салону організовуються в інфоблоці з ієрархією розділів: «Перукарня», «Манікюр і педикюр», «Косметологія», «Масаж». Кожен розділ може містити підрозділи — «Стрижки», «Фарбування», «Доглядові процедури».
Властивості елемента інфоблока «Послуги»:
| Властивість | Тип | Призначення |
|---|---|---|
| PRICE_FROM | number | Ціна «від» (залежить від майстра) |
| DURATION_MIN | number | Тривалість у хвилинах |
| MASTER_LINK | E (множинне) | Прив'язка до майстрів, які надають послугу |
| CATEGORY_TAGS | string (множинне) | Теги: «для наречених», «новинка» |
| CONTRAINDICATIONS | HTML | Протипоказання (для косметології) |
| PREPARATION | HTML | Підготовка до процедури |
Ціна «від» — це свідоме рішення. У салонах ціна залежить від категорії майстра (стажер, стиліст, топ-стиліст). Точна ціна розраховується після вибору майстра — для цього потрібна проміжна таблиця «майстер — послуга — ціна».
Реалізується через Highload-блок MasterServicePrice з полями: UF_MASTER_ID, UF_SERVICE_ID, UF_PRICE. При виборі послуги на фронті підтягуються всі майстри з їхніми цінами через DataManager::getList().
Онлайн-запис зі слотами майстрів
Це ключовий функціонал сайту і найскладніший у реалізації. Клієнт очікує простий інтерфейс: вибрав послугу, вибрав майстра, побачив вільні вікна, натиснув «Записатися». За цією простотою — багаторівнева логіка розрахунку доступності.
Крок 1: вибір послуги. Клієнт вибирає з каталогу. Система визначає тривалість (DURATION_MIN) і список майстрів, які надають цю послугу (MASTER_LINK).
Крок 2: вибір конкретного майстра або «будь-який вільний». Якщо клієнт вибирає конкретного майстра — працюємо з його графіком. Якщо «будь-який» — перебираємо всіх майстрів послуги і показуємо об'єднаний набір слотів.
Крок 3: розрахунок вільних слотів. Тут починається інженерна частина.
Дані для розрахунку зберігаються в трьох Highload-блоках:
MasterSchedule — робочий графік майстра:
-
UF_MASTER_ID— ID майстра -
UF_DATE— дата -
UF_WORK_START— початок смини (HH:MM) -
UF_WORK_END— кінець смини -
UF_BREAK_START— початок перерви -
UF_BREAK_END— кінець перерви
MasterBooking — існуючі записи:
-
UF_MASTER_ID,UF_DATE,UF_TIME_START,UF_TIME_END,UF_CLIENT_ID,UF_SERVICE_ID,UF_STATUS
MasterDayOff — відпустки, хворобілі, вихідні.
Алгоритм розрахунку вільних слотів для конкретного майстра на конкретну дату:
- Отримати робочий графік з
MasterSchedule. Якщо запису немає або дата вMasterDayOff— майстер недоступний - Сформувати масив робочих хвилин: від
UF_WORK_STARTдоUF_WORK_END, виключаючи перерву - Отримати всі записи з
MasterBookingзі статусомconfirmedабоpending - Вичесть з робочих хвилин займані інтервали
- У залишених вільних інтервалах знайти вікна, тривалість яких >=
DURATION_MINпослуги - Розбити ці вікна на слоти з кроком 15 або 30 хвилин (налаштовується)
// Псевдокод розрахунку слотів
$freeIntervals = subtractIntervals($workIntervals, $bookedIntervals);
$slots = [];
foreach ($freeIntervals as $interval) {
$start = $interval['start'];
while ($start + $serviceDuration <= $interval['end']) {
$slots[] = $start;
$start += $stepMinutes;
}
}
Буфер між записами. Між процедурами часто потрібен технічний перерив — 5-15 хвилин на прибирання кабінету або підготовку інструментів. Буфер додається до DURATION_MIN при розрахунку слотів, але не показується клієнту.
Конкурентний доступ. Два клієнти одночасно бачать один і той же вільний слот. Перший натискає «Записатися» — слот блокується. Другий отримує повідомлення «час займаний, виберіть інший». Блокування реалізується через транзакцію: INSERT в MasterBooking + перевірка відсутності перетинів в одній транзакції.
Підтвердження запису. Після бронювання клієнт отримує SMS (модуль messageservice) та email. За добу до візиту — нагадування через агент Bitrix. Якщо клієнт не підтверджує — запис переходить у статус unconfirmed, і адміністратор вирішує, звільнити ли слот.
Інтеграція з YCLIENTS та 1С:Салон краси
Більшість салонів уже використовують систему обліку. Дві найпоширеніші:
YCLIENTS. Хмарна платформа з REST API. Основні ендпоінти: /api/v1/book_record/ (створення запису), /api/v1/book_dates/ (доступні дати), /api/v1/book_times/ (доступні слоти). При інтеграції з YCLIENTS сайт Bitrix не розраховує слоти самостійно — він запитує їх через API. Highload-блоки MasterSchedule та MasterBooking в цьому випадку не потрібні: YCLIENTS є мастер-системою.
Мінус: залежність від стороннього API. Якщо YCLIENTS лежить — на сайті немає запису. Рішення — кешування останнього відомого розкладу і fallback на форму «залишити заявку».
1С:Салон краси. Обмін через HTTP-сервіси 1С або файловий обмін (XML). Синхронізація майстрів, послуг, записів. Зазвичай працює з затримкою 5-15 хвилин — не real-time.
Портфолія робіт майстрів
Інфоблок «Портфолія» з прив'язкою до майстра та послуги. Ключові властивості:
-
PHOTO_BEFORE/PHOTO_AFTER— файлові властивості -
MASTER_LINK— прив'язка до майстра -
SERVICE_LINK— прив'язка до послуги -
DESCRIPTION— що було зроблено
На сторінці майстра портфолія фільтрується за MASTER_LINK. На сторінці послуги — за SERVICE_LINK. Фотографії до/після відображаються слайдером з розділювачем — популярний паттерн для beauty-індустрії.
Важливо: фото портфолія мають бути стиснені. Клієнти салонів частіше заходять з мобільних — 10 фото по 5 МБ кожне убивають конверсію. Bitrix вміє ресайзити через CFile::ResizeImageGet(), але краще налаштувати WebP-конвертацію на рівні nginx або через обробник події OnFileSave.
Подарункові сертифікати та акції
Подарункові сертифікати реалізуються через модуль sale. Сертифікат — це товар у каталозі з номіналом. При покупці генерується унікальний код, який зберігається у властивостях замовлення (\Bitrix\Sale\Order → propertyCollection). Код відправляється покупцю на email у вигляді PDF.
При використанні сертифіката в салоні код вводиться при оформленні замовлення — спрацьовує купон скидки модуля sale.discount. Баланс сертифіката зменшується на суму послуги.
Акції — простіше: окремий інфоблок з датою початку/закінчення, прив'язкою до послуг, текстом умов. Виводяться на головній та в каталозі через фільтр <=DATE_ACTIVE_FROM / >=DATE_ACTIVE_TO.
Програма лояльності
Бонусні бали можна реалізувати двома способами:
Через sale.discount. Модуль підтримує накопичувальні скидки та правила на основі суми покупок. Обмеження — немає гнучкого нарахування балів за конкретні дії (рекомендація друга, відзив, день народження).
Через кастомний модуль. Highload-блок LoyaltyBalance з полями UF_USER_ID, UF_POINTS, UF_HISTORY (сеіалізований лог операцій). При кожній оплаті обробник OnSaleOrderPaid нараховує бали за формулою (зазвичай 3-10% від суми). При списанні — перевірка балансу та зменшення суми замовлення.
Терміни реалізації
| Масштаб | Склад | Термін |
|---|---|---|
| Один салон, до 10 майстрів | Каталог, запис (через YCLIENTS API), портфолія, акції | 6-8 тижнів |
| Салон з власною системою запису | + розрахунок слотів у Bitrix, SMS-нагадування, сертифікати | 10-14 тижнів |
| Мережа салонів | + мультисайтовість, єдина клієнтська база, лояльність, інтеграція з 1С | 16-22 тижні |
На що звернути увагу
Швидкість завантаження сторінки каталогу критична — клієнт порівнює кілька салонів і йде, якщо сторінка грузиться більше 2 секунд. Кешування компонентів Bitrix ('CACHE_TIME' => 3600) обов'язково для каталогу та портфолія. Сторінку онлайн-запису кешувати не можна — дані про слоти мають бути актуальними.







