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

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка модуля записи на прием 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1175
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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 Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Разработка модуля записи на прием 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 с деталями записи и ссылкой на отмену
  • Уведомление специалисту в Битрикс24 (если используется) или по email

Сроки разработки

Этап Срок
Модель данных, расписания, исключения 2 дня
Генерация слотов, проверка занятости 2 дня
Трёхшаговый виджет записи 3 дня
Защита от двойной записи 1 день
Личный кабинет специалиста 2 дня
Интеграция с CRM (опционально) 1 день
Уведомления (email + SMS) 1 день
Тестирование 1 день

Итого: 13 рабочих дней. SMS-шлюз подключается отдельно в зависимости от провайдера.