Разработка модуля записи на прием 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 с деталями записи и ссылкой на отмену
- Уведомление специалисту в Битрикс24 (если используется) или по email
Сроки разработки
| Этап | Срок |
|---|---|
| Модель данных, расписания, исключения | 2 дня |
| Генерация слотов, проверка занятости | 2 дня |
| Трёхшаговый виджет записи | 3 дня |
| Защита от двойной записи | 1 день |
| Личный кабинет специалиста | 2 дня |
| Интеграция с CRM (опционально) | 1 день |
| Уведомления (email + SMS) | 1 день |
| Тестирование | 1 день |
Итого: 13 рабочих дней. SMS-шлюз подключается отдельно в зависимости от провайдера.







