Разработка сайта салона красоты на 1С-Битрикс
Сайт салона красоты работает как ресепшен, который никогда не уходит на обед. Клиент выбирает услугу, видит свободного мастера, записывается на удобное время — и всё это без звонка. Если записи нет онлайн, салон теряет тех, кто ищет «маникюр рядом» в 11 вечера и готов забронировать прямо сейчас.
Разберём реализацию на 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. За сутки до визита — напоминание через агент Битрикса. Если клиент не подтверждает — запись переходит в статус unconfirmed, и администратор решает, освободить ли слот.
Интеграция с YCLIENTS и 1С:Салон красоты
Большинство салонов уже используют систему учёта. Две самые распространённые:
YCLIENTS. Облачная платформа с REST API. Основные эндпоинты: /api/v1/book_record/ (создание записи), /api/v1/book_dates/ (доступные даты), /api/v1/book_times/ (доступные слоты). При интеграции с YCLIENTS сайт Битрикса не рассчитывает слоты самостоятельно — он запрашивает их через 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. Фотографии до/после отображаются слайдером с разделителем — популярный паттерн для бьюти-индустрии.
Важно: фото портфолио должны быть сжаты. Клиенты салонов чаще заходят с мобильных — 10 фото по 5 МБ каждое убьют конверсию. Битрикс умеет ресайзить через 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 недель |
| Салон с собственной системой записи | + расчёт слотов в Битриксе, SMS-напоминания, сертификаты | 10-14 недель |
| Сеть салонов | + мультисайтовость, единая клиентская база, лояльность, интеграция с 1С | 16-22 недели |
На что обратить внимание
Скорость загрузки страницы каталога критична — клиент сравнивает несколько салонов и уходит, если страница грузится больше 2 секунд. Кэширование компонентов Битрикса ('CACHE_TIME' => 3600) обязательно для каталога и портфолио. Страницу онлайн-записи кэшировать нельзя — данные о слотах должны быть актуальными.







