Розробка модуля запису на прийом 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Розробка модуля запису на прийом 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Розробка модуля запису на прийом 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);
}

Запис за один потік

На фронтенді — триступеневий віджет:

  1. Вибір послуги (картки або список з інфоблоку)
  2. Вибір спеціаліста + дата + час (AJAX-оновлення слотів при зміні дати)
  3. Контактні дані + підтвердження

Кожен крок — 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-шлюз підключається окремо залежно від провайдера.