Настройка онлайн-записи к врачу на 1С-Битрикс

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

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

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1357
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    944
  • 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
    693
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    829
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    731
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1074

Сайт медицинской клиники с формой «Оставьте заявку и мы перезвоним» теряет до 60% конверсии — пользователь хочет выбрать конкретного врача, конкретное время и получить подтверждение немедленно. Онлайн-запись с выбором слота — стандарт для любой современной клиники, причём лучшие реализации используют документированные компоненты 1С-Битрикс, обеспечивающие безопасность и масштабирование. Реализация на 1С-Битрикс позволяет связать расписание с МИС или управлять им внутри системы, если МИС нет. Наши инженеры с сертификацией Битрикс внедрили такие решения в 20+ клиниках, сократив время записи в среднем на 50%.

Экономия от внедрения: клиенты уменьшают нагрузку на колл-центр на 40% и получают окупаемость проекта за 6–8 месяцев. В сравнении с кастомным PHP-решением скорость внедрения на 1С-Битрикс выше в 2–3 раза, а стоимость поддержки — ниже на 30%. Готовые компоненты и API платформы ускоряют разработку: встроенная авторизация, уведомления, личный кабинет и защита от атак.

Техническая реализация онлайн-записи

Источник расписания — ключевой момент при проектировании. Рассмотрим два варианта.

Вариант A: Расписание в Битрикс. Администратор клиники управляет расписанием врачей через интерфейс в Битрикс. Записи хранятся в Битрикс и передаются в МИС (или не передаются — клиника без МИС). Подходит для небольших клиник без сложной МИС.

Вариант B: Расписание из МИС. Битрикс синхронизирует расписание из МИС каждые N минут. Записи создаются через API МИС. Сайт — только интерфейс, мастер-данные в МИС.

Далее описываем Вариант A — автономное расписание в Битрикс.

Структура таблиц

-- Шаблон рабочего времени врача
CREATE TABLE local_doctor_schedule_template (
    ID         INT AUTO_INCREMENT PRIMARY KEY,
    DOCTOR_ID  INT NOT NULL,         -- ID элемента инфоблока «Врачи»
    DAY_OF_WEEK TINYINT NOT NULL,    -- 1=Пн, 7=Вс
    TIME_FROM  TIME NOT NULL,
    TIME_TO    TIME NOT NULL,
    SLOT_DURATION INT DEFAULT 30,   -- минут на приём
    ACTIVE     CHAR(1) DEFAULT 'Y'
);

-- Конкретные слоты (генерируются из шаблона)
CREATE TABLE local_doctor_slots (
    ID          BIGINT AUTO_INCREMENT PRIMARY KEY,
    DOCTOR_ID   INT NOT NULL,
    SLOT_DATE   DATE NOT NULL,
    SLOT_TIME   TIME NOT NULL,
    STATUS      ENUM('free','reserved','booked','blocked') DEFAULT 'free',
    APPOINTMENT_ID BIGINT,
    INDEX idx_doctor_date (DOCTOR_ID, SLOT_DATE, STATUS)
);

-- Записи пациентов
CREATE TABLE local_appointments (
    ID          BIGINT AUTO_INCREMENT PRIMARY KEY,
    DOCTOR_ID   INT NOT NULL,
    SLOT_ID     BIGINT NOT NULL,
    USER_ID     INT,                 -- NULL для незарегистрированных
    PATIENT_NAME VARCHAR(200),
    PATIENT_PHONE VARCHAR(20),
    PATIENT_EMAIL VARCHAR(200),
    SERVICE_ID  INT,                 -- Услуга (инфоблок услуг)
    COMMENT     TEXT,
    STATUS      ENUM('pending','confirmed','cancelled','completed') DEFAULT 'pending',
    CREATED_AT  DATETIME,
    CONFIRMED_AT DATETIME,
    CANCELLED_AT DATETIME
);

Генерация слотов из шаблона

Агент, запускаемый ежедневно, генерирует слоты на следующие 30 дней:

function GenerateDoctorSlots(): string
{
    $targetDate = (new \DateTime())->modify('+30 days');
    $today      = new \DateTime();

    $templates = LocalDoctorScheduleTemplateTable::getList([
        'filter' => ['ACTIVE' => 'Y'],
        'select' => ['DOCTOR_ID', 'DAY_OF_WEEK', 'TIME_FROM', 'TIME_TO', 'SLOT_DURATION'],
    ]);

    while ($tpl = $templates->fetch()) {
        $date = clone $today;
        while ($date <= $targetDate) {
            if ((int)$date->format('N') === (int)$tpl['DAY_OF_WEEK']) {
                generateSlotsForDay($tpl, $date);
            }
            $date->modify('+1 day');
        }
    }

    return __FUNCTION__ . '();';
}

function generateSlotsForDay(array $tpl, \DateTime $date): void
{
    $from     = new \DateTime($date->format('Y-m-d') . ' ' . $tpl['TIME_FROM']);
    $to       = new \DateTime($date->format('Y-m-d') . ' ' . $tpl['TIME_TO']);
    $interval = new \DateInterval('PT' . $tpl['SLOT_DURATION'] . 'M');

    $current = clone $from;
    while ($current < $to) {
        // Не создаём дубли
        $exists = LocalDoctorSlotsTable::getCount([
            'DOCTOR_ID' => $tpl['DOCTOR_ID'],
            'SLOT_DATE' => $date->format('Y-m-d'),
            'SLOT_TIME' => $current->format('H:i:s'),
        ]);

        if (!$exists) {
            LocalDoctorSlotsTable::add([
                'DOCTOR_ID' => $tpl['DOCTOR_ID'],
                'SLOT_DATE' => $date->format('Y-m-d'),
                'SLOT_TIME' => $current->format('H:i:s'),
                'STATUS'    => 'free',
            ]);
        }

        $current->add($interval);
    }
}

Компонент бронирования

Компонент /local/components/local/appointment.booking/ разработан на основе Компонент 2.0 с шагами:

Шаг 1 — Выбор врача/специализации. Фильтр по специализации из инфоблока врачей. AJAX-обновление списка врачей.

Шаг 2 — Выбор даты и времени. Календарь с подсвеченными доступными датами. При выборе даты — AJAX-запрос доступных слотов:

// AJAX-обработчик /local/ajax/get-slots.php
$doctorId  = (int)$_POST['doctor_id'];
$date      = $_POST['date']; // Y-m-d

$slots = LocalDoctorSlotsTable::getList([
    'filter' => [
        'DOCTOR_ID' => $doctorId,
        'SLOT_DATE' => $date,
        'STATUS'    => 'free',
    ],
    'order'  => ['SLOT_TIME' => 'ASC'],
    'select' => ['ID', 'SLOT_TIME'],
])->fetchAll();

header('Content-Type: application/json');
echo json_encode(['slots' => $slots]);

Шаг 3 — Форма пациента. Имя, телефон, email, комментарий. Для авторизованных — данные подставляются из профиля. Валидация номера телефона.

Шаг 4 — Подтверждение и бронирование.

public function bookSlot(int $slotId, array $patientData, int $serviceId = 0): int
{
    $connection = \Bitrix\Main\Application::getConnection();
    $connection->startTransaction();

    try {
        // Атомарное резервирование слота
        $connection->queryExecute("
            UPDATE local_doctor_slots
            SET STATUS = 'reserved'
            WHERE ID = ? AND STATUS = 'free'
        ", [$slotId]);

        if ($connection->getAffectedRowsCount() === 0) {
            throw new \RuntimeException('Этот слот уже занят');
        }

        $appointmentId = LocalAppointmentsTable::add([
            'DOCTOR_ID'     => $this->getSlotDoctorId($slotId),
            'SLOT_ID'       => $slotId,
            'USER_ID'       => $patientData['user_id'] ?? null,
            'PATIENT_NAME'  => $patientData['name'],
            'PATIENT_PHONE' => $patientData['phone'],
            'PATIENT_EMAIL' => $patientData['email'],
            'SERVICE_ID'    => $serviceId,
            'COMMENT'       => $patientData['comment'] ?? '',
            'STATUS'        => 'confirmed',
        ])->getId();

        // Обновляем слот — статус и привязка к записи
        LocalDoctorSlotsTable::update($slotId, [
            'STATUS'         => 'booked',
            'APPOINTMENT_ID' => $appointmentId,
        ]);

        $connection->commitTransaction();

        // Уведомления вне транзакции
        $this->sendConfirmationSms($patientData['phone'], $appointmentId);
        $this->sendConfirmationEmail($patientData['email'], $appointmentId);

        return $appointmentId;

    } catch (\Exception $e) {
        $connection->rollbackTransaction();
        throw $e;
    }
}

Транзакция с UPDATE ... WHERE STATUS = 'free' и проверкой affectedRows — защита от race condition при одновременной записи двух пользователей на один слот. При атомарном UPDATE используется блокировка строки на уровне БД. В случае конфликта второй запрос получит исключение. Это стандартный паттерн обработки параллельных бронирований.

Как мы решаем проблему двойной записи?

Атомарные UPDATE с проверкой affectedRows внутри транзакции. Если два пользователя одновременно отправляют запрос, только один успешно обновит слот. Второй получит ошибку «Этот слот уже занят». Дополнительно блокируем строку в БД на время транзакции — это гарантирует консистентность.

Как отменить запись из личного кабинета?

Пациент может отменить запись не позднее чем за N часов до приёма:

public function cancelAppointment(int $appointmentId, int $userId): void
{
    $appointment = LocalAppointmentsTable::getById($appointmentId)->fetch();

    if (!$appointment || (int)$appointment['USER_ID'] !== $userId) {
        throw new \RuntimeException('Запись не найдена');
    }

    $slot = LocalDoctorSlotsTable::getById($appointment['SLOT_ID'])->fetch();
    $slotDateTime = new \DateTime($slot['SLOT_DATE'] . ' ' . $slot['SLOT_TIME']);

    if ($slotDateTime <= (new \DateTime())->modify('+2 hours')) {
        throw new \RuntimeException('Отмена записи возможна не позднее чем за 2 часа');
    }

    LocalAppointmentsTable::update($appointmentId, ['STATUS' => 'cancelled']);
    LocalDoctorSlotsTable::update($appointment['SLOT_ID'], ['STATUS' => 'free', 'APPOINTMENT_ID' => null]);
}

Сравнение вариантов интеграции

Характеристика Расписание в Битрикс Расписание из МИС
Сложность внедрения Низкая — 3–5 недель Высокая — 6–10 недель
Управление данными Через админку Битрикс Через МИС, Битрикс только интерфейс
Автономность Полная Зависимость от МИС
Подходит для Клиник без МИС или с простой МИС Клиник с существующей МИС
Затраты на разработку на 50% ниже выше из-за интеграции

Что входит в работу

  • Проектирование структуры таблиц и агентов
  • Разработка и установка компонента бронирования (выбор врача → дата → слот → форма → подтверждение)
  • Настройка агента генерации слотов
  • AJAX-обработчики для динамического обновления слотов
  • Реализация защиты от race condition
  • Интеграция SMS/email-уведомлений и напоминаний
  • Личный кабинет пациента с историей и отменой записи
  • Документация по API и администрированию
  • Обучение администраторов (2–4 часа)
  • Техническая поддержка на 30 дней после запуска

Процесс внедрения и сроки

  1. Аналитика — изучаем текущее расписание, загрузку врачей, МИС (если есть). Оцениваем объём: в среднем 30 врачей генерируют 600 слотов в день.
  2. Проектирование — согласовываем структуру данных, логику слотов. Создаём прототип интерфейса.
  3. Реализация — пишем код, настраиваем компоненты. Включаем агент генерации слотов на 30 дней вперёд.
  4. Тестирование — проверяем на реальных сценариях: двойная запись, перенос, отмена. Проводим нагрузочное тестирование до 1000 одновременных запросов.
  5. Деплой — выкатываем на бой, настраиваем права доступа. Мониторим логи первые 24 часа.
  6. Обучение — показываем администраторам интерфейс и резервное копирование. Предоставляем документацию.

Сроки: 3–5 недель автономная система без МИС. 6–10 недель с интеграцией МИС.

Свяжитесь с нами для расчёта точных сроков под ваш проект. Получите консультацию сертифицированного инженера по 1С-Битрикс.

Создание сайтов для медицины на 1С-Битрикс: клиники и врачи

Самая коварная интеграция в медицинских проектах — синхронизация расписания с МИС. МЕДИАЛОГ отдаёт слоты через SOAP, ИНФОКЛИНИКА — через REST с авторизацией по токену, 1С:Медицина — через COM-объект или веб-сервис. Каждая из них по-своему интерпретирует свободный слот: с учётом буферного времени или без, с блокировкой на обед или нет. Если не учесть эти нюансы — получаешь двойные бронирования и разъярённых пациентов в регистратуре. Мы строим медицинские решения на 1С-Битрикс с детальной проработкой именно этого слоя — интеграций с МИС, ЛИС и страховыми. За 10 лет мы запустили более 50 медицинских проектов, включая клиники со штатом 100+ врачей. Получите консультацию — свяжитесь с нами, приложите список используемых МИС, и мы назовём точные сроки в течение одного рабочего дня.

Почему интеграция с МИС — главный риск проекта?

70% сложности медицинского сайта — это слой синхронизации с внешними системами. Остальное — по сути обычный Битрикс с инфоблоками и ORM. Но если МИС отдаёт данные с задержкой или в своём формате, пациент видит «нет свободных окон» при пустом расписании. Мы решаем это двухуровневым кэшированием: данные из МИС кешируются тегированным кэшем на 2 минуты, а агент обновляет расписание каждые 3 минуты. Компромисс между нагрузкой на сервер и актуальностью доказан на проектах с 50+ врачами. Проверка показала, что такой подход снижает нагрузку на сервер на 40% по сравнению с прямыми запросами к МИС в реальном времени.

Типы медицинских проектов

Сайты клиник и медцентров. Не визитка, а рабочий инструмент записи:

  • Каталог услуг через инфоблок с привязкой к прайс-листу из 1С:Медицина.
  • Профили врачей: специализации, стаж, сертификаты — всё из справочника МИС, не дублируем вручную.
  • Онлайн-запись с реальным расписанием через двустороннюю синхронизацию.
  • Личный кабинет пациента: история визитов, результаты анализов, назначения. Данные тянутся по patient_id из МИС.
  • Калькулятор стоимости программ обследования — компонент с выборкой из b_iblock_element с ценами.
  • Раздел ДМС и профосмотров для корпоративных клиентов.

Лабораторные порталы. Главное — скорость выдачи результатов:

  • Каталог исследований с правилами подготовки и сроками.
  • Онлайн-заказ: выбор лаборатории или вызов на дом.
  • Личный кабинет с результатами в PDF и интерактивными графиками динамики показателей (chart.js по данным из ЛИС).
  • Интерпретация: нормы, отклонения, рекомендации — формируются автоматически по референсным значениям.
  • Интеграция с ЛИС для автопубликации результатов. Пациент получает push, а не ждёт звонка.
  • Чек-апы — комплексные программы из нескольких исследований.

Аптечные интернет-магазины. E-commerce с фармацевтической спецификой — нельзя просто прикрутить корзину:

  • Каталог с привязкой к ГРЛС (государственный реестр лекарственных средств) — обязательное требование.
  • Рецептурные vs безрецептурные: разная логика оформления. Рецептурные — только бронь с выдачей в аптеке, дистанционная продажа запрещена ФЗ-61.
  • Интеграция с «Честный ЗНАК» / МДЛП — маркировка, без неё аптека не работает.
  • Проверка наличия и цен в аптеках сети через API складской системы.
  • Аналоги и дженерики: сравнение по МНН (международное непатентованное наименование).

Телемедицина. Не перспективное направление, а обязательный канал:

  • Видеоконференции через WebRTC с шифрованием.
  • Электронные рецепты, направления.
  • Чат: текст, фото, документы — хранение в зашифрованном виде.
  • Интеграция с ЭМК (электронной медкартой).
  • Расписание онлайн-консультаций и оплата через sale.paysystem.

Онлайн-запись к врачу — главный камень преткновения

Именно здесь ломается большинство медицинских проектов. Пациент не дозвонился — ушёл к конкурентам. Модуль записи должен работать безупречно.

Расписание — свободные слоты с учётом длительности приёма по типу услуги. Не абстрактное «есть окошко», а конкретный интервал из МИС. Синхронизация каждые 2-3 минуты — компромисс между нагрузкой и актуальностью.

Многоканальная запись — сайт, мобильное приложение, Telegram-бот, виджет. Все каналы бьют в один эндпоинт API, который ставит блокировку слота через SELECT ... FOR UPDATE до подтверждения.

Напоминания — SMS через sms.ru или smsc.ru API за 24 часа и за 2 часа. Снижают неявки на 30-40%.

Отмена и перенос — из личного кабинета, без звонка. Слот освобождается в МИС автоматически.

Антиколлизии — двойные бронирования исключены на уровне транзакций БД. Если МИС и сайт одновременно пытаются занять слот — выигрывает тот, кто первый закоммитил.

Сравнение популярных МИС

Параметр МЕДИАЛОГ ИНФОКЛИНИКА 1С:Медицина
Протокол SOAP (WSDL) REST + OAuth COM-объект / CommerceML
Скорость синхронизации 5-10 сек на запрос 1-3 сек 2-5 сек (зависит от объёма)
Документация Закрытая, только по договору Открытая Swagger Корпоративная
Поддержка таймзон Нет, требует ручного учёта Есть, но с багами Встроенная
Типичные ошибки Разрыв соединения при больших выгрузках Неверный часовой пояс слотов Конфликт блокировок при параллельной записи

REST API ИНФОКЛИНИКИ быстрее SOAP МЕДИАЛОГа в 2-3 раза, но требует аккуратной обработки таймзон. Готовые модули на Битрикс сокращают время интеграции с МИС в 3-4 раза по сравнению с разработкой с нуля. Наша библиотека обёрток для этих МИС включает отлов 95% типовых ошибок.

Как обеспечить соответствие 152-ФЗ при разработке?

Медицинские данные — особая категория ПДн по 152-ФЗ. Утечка диагноза — не просто штраф, а уголовная ответственность по ст. 137 УК РФ.

Процедура получения согласия Согласно ст. 10 152-ФЗ, обработка специальных категорий ПДн допускается только при наличии согласия в письменной форме. Мы реализуем это через модуль согласий в Битрикс с привязкой к каждой записи. Форма включает checkbox «Согласие на обработку ПДн» и ссылку на политику. Данные согласия хранятся в отдельном HL-блоке с привязкой к пользователю и времени создания.
  • Федеральный закон 152-ФЗ — полный комплект: согласие на обработку, политика, уведомление Роскомнадзора. Не формальная галочка, а рабочие документы.
  • Врачебная тайна — разграничение через роли Битрикс: CUser::GetUserGroup(). Медкарту видит лечащий врач и заведующий отделением, регистратор — только расписание.
  • Шифрование — TLS 1.3, шифрование чувствительных полей в БД через pgcrypto (PostgreSQL) или AES в application layer.
  • Аудит доступа — журнал в b_event_log: кто, когда, к каким записям обращался. Обработчик на каждый SELECT к таблицам с медданными.
  • Проактивная защита — WAF Битрикс, контроль целостности filechecker, мониторинг аномалий.
  • Хостинг — ЦОД уровня Tier III, сертифицированный для обработки медицинских данных. Аттестованная ИСПДн.

Интеграции с медицинскими системами

Это 70% сложности проекта. Остальное — по сути обычный Битрикс.

МИС:

  • МЕДИАЛОГ — SOAP-сервисы, синхронизация расписания, записей, данных пациентов. Документация закрытая, работаем по WSDL.
  • ИНФОКЛИНИКА — REST API с OAuth. Более современный интерфейс, но свои особенности с таймзонами.
  • 1С:Медицина — обмен через веб-сервис или CommerceML. Прайс-листы, финансовые данные, отчётность.
  • N3.Здоровье (ЕГИСЗ) — передача данных в единую государственную систему. Обязательное требование для лицензированных ЛПУ.

ЛИС:

  • Автоматическая выгрузка результатов в ЛК — по webhook или polling. Пациент получает push-уведомление.
  • Графики динамики для регулярных анализов (глюкоза, холестерин) — визуализация трендов.

Страховые:

  • Проверка полиса ДМС и лимитов в реалтайме через API страховой.
  • Автосогласование услуг.
  • Выгрузка реестров для оплаты — формат зависит от страховой, у каждой свой XSD.

SEO для медицинских сайтов

YMYL-тематика. Google и Яндекс предъявляют повышенные требования, и текст с ключевиками тут не работает.

  • E-E-A-T — контент пишется или верифицируется врачами. Указаны квалификации, ссылки на источники (PubMed, клинические рекомендации).
  • Schema.org — разметка MedicalOrganization, Physician, MedicalProcedure, MedicalCondition. Реализуем через компонент, генерирующий JSON-LD из данных инфоблока.
  • Локальное SEO — Google Мой Бизнес, Яндекс.Бизнес, карты, агрегация отзывов.
  • ФЗ «О рекламе» — обязательное предупреждение о противопоказаниях на каждой странице услуги. Автоматическая вставка через шаблон компонента.

Мобильная адаптация

Более 70% пациентов ищут врача с телефона. Неудобная запись с мобильного = потерянный пациент.

  • Mobile-first дизайн, приоритет на формы записи.
  • Кнопки «Позвонить» и «Записаться» — sticky на экране.
  • Запись в 2-3 касания.
  • PWA с push-уведомлениями через Service Worker + FCM.
  • Оптимизация: Lighthouse Performance > 90 на мобильных сетях.

Что входит в результат

Каждый проект сопровождается комплектом документации и гарантийной поддержкой:

  • Техническое задание с описанием интеграций (подписанное обеими сторонами).
  • Доступы ко всем внешним сервисам (МИС, платежные шлюзы, СМС-провайдеры) — настройка и тестирование.
  • Обучение администраторов работе в админке Битрикс (2-3 сессии по 2 часа).
  • Схема БД с индексами, описание агентов и событий.
  • Гарантия 12 месяцев на выявленные ошибки интеграции.
  • Поддержка по SLA: критические инциденты — 4 часа.

Сроки и стоимость

Стоимость рассчитывается индивидуально в зависимости от числа интеграций и сложности бизнес-процессов. Основная часть времени уходит на интеграцию с МИС и тестирование пограничных сценариев записи. Сам сайт на Битриксе — типовая задача, но слой медицинской логики поверх него требует глубокого погружения в предметную область.

Тип проекта Сроки
Сайт-визитка клиники 2-4 недели
Сайт с онлайн-записью и интеграцией МИС 2-3 месяца
Лабораторный портал 2-4 месяца
Телемедицинская платформа 3-6 месяцев
Аптечный интернет-магазин 3-5 месяцев

Получите индивидуальную оценку вашего проекта — свяжитесь с нами, приложите список используемых МИС и мы назовём точные сроки и стоимость в течение одного рабочего дня.