Розробка модуля запису на прийом 1С-Бітрікс
Запис на прийом — спрощена версія бронювання з прив'язкою до конкретного спеціаліста та часового слота. Медичні клініки, перукарні, автосервіси, юридичні консультації. Скрізь одна схема: клієнт вибирає послугу, спеціаліста, дату та час, отримує підтвердження.
Відмінність від бронювання ресурсів
При бронюванні резервується об'єкт (кімната, автомобіль). При записі на прийом — час конкретного спеціаліста. Спеціаліст — це користувач Бітрікс із прив'язаним розкладом. Один спеціаліст може приймати кількох клієнтів на день у різні години. Розклад змінюється: вихідні, відпустки, перенесення.
Структура даних
Модуль vendor.appointment:
-
b_vendor_appt_staff— спеціалісти: id, user_id (→b_user), name, photo_file_id, services (JSON масив ID послуг), is_active -
b_vendor_appt_service— послуги: id, name, duration_minutes, iblock_element_id, is_active -
b_vendor_appt_schedule— робочий розклад: id, staff_id, day_of_week (0–6), time_from, time_to, slot_duration_minutes -
b_vendor_appt_exception— винятки з розкладу: id, staff_id, date, type (day_off/custom), custom_from, custom_to -
b_vendor_appt_appointment— записи: id, staff_id, service_id, user_id, date, time_from, time_to, status, notes, created_at
Генерація доступних слотів
Слоти генеруються «на льоту» — зберігати їх у БД недоцільно. При запиті доступності:
public function getAvailableSlots(int $staffId, string $date): array
{
$dayOfWeek = (int) (new \DateTime($date))->format('N') % 7;
$schedule = StaffScheduleTable::getList([
'filter' => ['=STAFF_ID' => $staffId, '=DAY_OF_WEEK' => $dayOfWeek],
])->fetch();
if (!$schedule) return [];
// Перевіряємо винятки
$exception = ExceptionTable::getList([
'filter' => ['=STAFF_ID' => $staffId, '=DATE' => $date],
])->fetch();
if ($exception && $exception['TYPE'] === 'day_off') return [];
$slots = $this->generateSlots(
$exception['CUSTOM_FROM'] ?? $schedule['TIME_FROM'],
$exception['CUSTOM_TO'] ?? $schedule['TIME_TO'],
(int) $schedule['SLOT_DURATION_MINUTES']
);
// Віднімаємо зайняті слоти
$booked = AppointmentTable::getList([
'filter' => ['=STAFF_ID' => $staffId, '=DATE' => $date, '!STATUS' => 'cancelled'],
'select' => ['TIME_FROM', 'TIME_TO'],
])->fetchAll();
return $this->subtractBooked($slots, $booked);
}
Запис за один потік
На фронтенді — триступеневий віджет:
- Вибір послуги (картки або список з інфоблоку)
- Вибір спеціаліста + дата + час (AJAX-оновлення слотів при зміні дати)
- Контактні дані + підтвердження
Кожен крок — AJAX-запит, дані зберігаються в сесії до фінального підтвердження. Після підтвердження створюється запис у b_vendor_appt_appointment і надсилаються сповіщення.
Захист від подвійного запису
Між кроком «користувач вибрав слот» і «користувач підтвердив» минає час. За цей час слот може зайняти інший користувач. Рішення — тимчасове блокування:
// При виборі слота — м'яке блокування на 10 хвилин
$lockKey = "appt_lock_{$staffId}_{$date}_{$timeFrom}";
\Bitrix\Main\Application::getInstance()->getManagedCache()->set($lockKey, $userId, 600);
При фінальному збереженні перевіряється: блокування належить поточному користувачу, плюс транзакційна перевірка в БД.
Інтеграція з CRM
Опціонально: при створенні запису автоматично створюється лід або контакт у CRM. Якщо користувач уже є в CRM (пошук за email/телефоном), запис прив'язується до існуючого контакту через b_crm_contact. Запис у CRM:
$crmContactId = $this->findOrCreateCrmContact($appointmentData);
\Bitrix\Crm\Activity\Entity\PhoneCallTable::add([
'OWNER_TYPE_ID' => \CCrmOwnerType::Contact,
'OWNER_ID' => $crmContactId,
'SUBJECT' => 'Запис на прийом: ' . $service['NAME'],
'START_TIME' => new DateTime($date . ' ' . $timeFrom),
'END_TIME' => new DateTime($date . ' ' . $timeTo),
'RESPONSIBLE_ID'=> $staff['USER_ID'],
]);
Управління розкладом
Спеціаліст може управляти своїм розкладом через особистий кабінет або адміністративний розділ:
- Змінити робочі години на конкретний день
- Закрити день повністю (відпустка, лікарняний)
- Переглянути список своїх записів на день/тиждень
- Скасувати або перенести запис із сповіщенням клієнта
Адміністративний розділ для менеджерів: зведений календар по всіх спеціалістах, ручне створення записів (для телефонних звернень), статистика із завантаженості.
Сповіщення
- SMS через шлюз (налаштовується в модулі) при створенні та за годину до прийому
- Email із деталями запису та посиланням на скасування
- Сповіщення спеціалісту в Bitrix24 (якщо використовується) або по email
Терміни розробки
| Етап | Термін |
|---|---|
| Модель даних, розклади, винятки | 2 дні |
| Генерація слотів, перевірка зайнятості | 2 дні |
| Триступеневий віджет запису | 3 дні |
| Захист від подвійного запису | 1 день |
| Особистий кабінет спеціаліста | 2 дні |
| Інтеграція з CRM (опціонально) | 1 день |
| Сповіщення (email + SMS) | 1 день |
| Тестування | 1 день |
Разом: 13 робочих днів. SMS-шлюз підключається окремо залежно від провайдера.







