Онлайн-запись к врачу: синхронизация Битрикс и МИС
Сайт частной клиники принимает онлайн-записи к врачам. МИС — медицинская информационная система — операционная система клиники: расписание врачей, история болезни, электронная медкарта, учёт услуг, касса. МИС — медицинская информационная система. Задача: запись с сайта должна автоматически попадать в расписание МИС, а свободные слоты — отображаться на сайте в реальном времени. Каждый час простоя или ручного переноса данных стоит до 30% потерянных пациентов — мы это видели не раз.
Рынок МИС неоднороден: Инфоклиника, 1С:Медицина, qMS, Medesk, Ренессанс-М, ArchiMed+, Medods — у каждой свой API (или его отсутствие). Архитектура интеграции 1С-Битрикс с МИС зависит от конкретной системы. Мы гарантируем подбор оптимального сценария и реализацию под ключ с полным тестированием.
Типовые сценарии интеграции
Сценарий A: МИС предоставляет REST/SOAP API. Сайт напрямую обращается к API МИС для получения расписания и записи пациента. Самый чистый вариант, но не все МИС его поддерживают.
Сценарий B: Промежуточный брокер. МИС публикует расписание в промежуточной базе (PostgreSQL или MySQL), сайт читает оттуда. Запись на сайте создаёт заявку в промежуточной таблице, МИС забирает её по cron.
Сценарий C: Интеграционная шина. Для крупных клиник с несколькими МИС и множеством систем — отдельный интеграционный сервис (например, на базе RabbitMQ или Apache Kafka), который синхронизирует данные между системами.
Какой сценарий интеграции выбрать?
Выбор сценария определяется бюджетом, количеством систем и требованиями к задержкам. Ниже — сравнение ключевых параметров:
| Параметр | REST API | Промежуточная база | Интеграционная шина |
|---|---|---|---|
| Скорость внедрения | 5–8 недель | 8–14 недель | от 12 недель |
| Задержка данных | реальное время | 1–5 минут | реальное время |
| Нагрузка на МИС | высокая | низкая (вычитывается) | сбалансированная |
| Отказоустойчивость | зависит от МИС | высокая (кэш в БД) | высокая (очередь) |
REST API в 2–3 раза быстрее внедряется и даёт данные в реальном времени, но требует стабильного эндпоинта. Промежуточная база подходит для МИС без API или с жёсткими лимитами. Интеграционная шина — для сложных ландшафтов.
Почему интеграция через REST API — оптимальный выбор?
REST API — самый быстрый и прозрачный способ интеграции. В 90% случаев мы используем именно его: клиент получает данные в реальном времени, а кодовая база остается чистой. Ниже пример реализации для Medesk — одной из популярных МИС.
class MedeskApiClient { private string $apiKey; private string $baseUrl = 'https://api.medesk.net/api/v2'; public function getDoctorSchedule(int $doctorId, string $dateFrom, string $dateTo): array { return $this->request('GET', '/schedules', [ 'doctor_id' => $doctorId, 'from' => $dateFrom, 'to' => $dateTo, 'include' => 'free_slots', ]); } public function createAppointment(array $patientData, int $slotId): array { return $this->request('POST', '/appointments', [ 'slot_id' => $slotId, 'patient' => [ 'first_name' => $patientData['name'], 'last_name' => $patientData['surname'], 'phone' => $patientData['phone'], 'email' => $patientData['email'], 'birth_date' => $patientData['birth_date'], ], 'comment' => $patientData['comment'] ?? '', 'source' => 'website', ]); } public function cancelAppointment(int $appointmentId, string $reason = ''): array { return $this->request('DELETE', "/appointments/{$appointmentId}", [ 'reason' => $reason, ]); } private function request(string $method, string $path, array $data = []): array { $url = $this->baseUrl . $path; if ($method === 'GET' && $data) { $url .= '?' . http_build_query($data); } $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', "Authorization: Bearer {$this->apiKey}", ], CURLOPT_POSTFIELDS => in_array($method, ['POST', 'PUT', 'PATCH']) ? json_encode($data) : null, ]); $response = json_decode(curl_exec($ch), true); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode >= 400) { \Bitrix\Main\Diag\Debug::writeToFile( "MIS API Error {$httpCode}: " . json_encode($response), 'MIS', '/local/logs/mis-integration.log' ); throw new \RuntimeException("MIS API error: {$httpCode}"); } return $response ?? []; } } Почему кеширование расписания критично?
Прямое обращение к API МИС при каждом посещении страницы врача — плохая идея: МИС может быть медленной или иметь ограничения на число запросов (например, 100 запросов в минуту). Кеширование снижает нагрузку на МИС в 10–20 раз и ускоряет загрузку страницы до 200 мс. Детали реализации:
class DoctorScheduleService { private MedeskApiClient $mis; public function getAvailableSlots(int $doctorId, string $date): array { $cacheKey = "doctor_slots_{$doctorId}_{$date}"; $cacheTtl = 180; // 3 минуты — баланс актуальности и нагрузки $cache = \Bitrix\Main\Data\Cache::createInstance(); if ($cache->initCache($cacheTtl, $cacheKey, '/mis/slots/')) { return $cache->getVars()['slots']; } $schedule = $this->mis->getDoctorSchedule($doctorId, $date, $date); $slots = $this->formatSlots($schedule); $cache->startDataCache(); $cache->endDataCache(['slots' => $slots]); return $slots; } public function bookSlot(int $slotId, array $patientData): array { $result = $this->mis->createAppointment($patientData, $slotId); // Инвалидируем кеш расписания для этого врача $date = date('Y-m-d'); $doctorId = $this->getSlotDoctorId($slotId); \Bitrix\Main\Data\Cache::clearByTag("doctor_slots_{$doctorId}_{$date}"); // Сохраняем запись в Битрикс $this->saveAppointmentInBitrix($result, $patientData); return $result; } } Хранение записей в Битрикс
Записи дублируем в Битрикс — для истории, уведомлений и работы без МИС при её недоступности:
class AppointmentTable extends \Bitrix\Main\ORM\Data\DataManager { public static function getTableName(): string { return 'local_mis_appointments'; } public static function getMap(): array { return [ new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new \Bitrix\Main\ORM\Fields\IntegerField('USER_ID'), new \Bitrix\Main\ORM\Fields\IntegerField('MIS_APPOINTMENT_ID'), new \Bitrix\Main\ORM\Fields\IntegerField('DOCTOR_ID'), new \Bitrix\Main\ORM\Fields\DatetimeField('APPOINTMENT_TIME'), new \Bitrix\Main\ORM\Fields\StringField('STATUS'), // booked|confirmed|cancelled|completed new \Bitrix\Main\ORM\Fields\StringField('SERVICE_NAME'), new \Bitrix\Main\ORM\Fields\StringField('PATIENT_PHONE'), new \Bitrix\Main\ORM\Fields\DatetimeField('CREATED_AT'), ]; } } Уведомления пациенту
После записи — SMS и email-подтверждение через Битрикс. За 24 часа и за 2 часа до приёма — напоминания. Напоминания реализуются через агент Битрикс, который каждый час проверяет записи:
function SendMisAppointmentReminders(): string { $now = new \Bitrix\Main\Type\DateTime(); $in24h = (new \DateTime())->modify('+24 hours'); $in2h = (new \DateTime())->modify('+2 hours'); $appointments = AppointmentTable::getList([ 'filter' => [ 'STATUS' => 'booked', '>=APPOINTMENT_TIME' => \Bitrix\Main\Type\DateTime::createFromTimestamp($in2h->getTimestamp()), '<=APPOINTMENT_TIME' => \Bitrix\Main\Type\DateTime::createFromTimestamp($in24h->getTimestamp()), 'REMINDER_24H_SENT' => 'N', ], ]); while ($row = $appointments->fetch()) { SmsService::send($row['PATIENT_PHONE'], "Напоминаем о записи к врачу " . date('d.m.Y H:i', strtotime($row['APPOINTMENT_TIME'])) ); AppointmentTable::update($row['ID'], ['REMINDER_24H_SENT' => 'Y']); } return __FUNCTION__ . '();'; } Обработка ошибок МИС
МИС может быть недоступна (технические работы, проблемы с сервером). Стратегия: если МИС недоступна — сохраняем заявку в таблицу local_mis_pending_appointments со статусом pending, отображаем пациенту «Запись принята, мы свяжемся с вами для подтверждения». Агент раз в 5 минут пробует отправить pending-записи в МИС. При повторных сбоях заявка переводится в статус manual — оператор связывается с пациентом. Мы внедряем такой механизм в каждом проекте и гарантируем нулевую потерю заявок.
Как гарантировать нулевую потерю заявок?
Если МИС недоступна, заявка сохраняется в таблице local_mis_pending_appointments со статусом pending. Агент каждые 5 минут повторно отправляет заявку. После 10 неудачных попыток статус меняется на manual, и оператор связывается с пациентом. Такая схема работает во всех проектах и исключает потерю заявок.
Что входит в работу
- Анализ документации API конкретной МИС и выбор сценария
- Разработка PHP-клиента API с обработкой ошибок и ретраями
- Кеширование расписания с инвалидацией при записи
- Компонент онлайн-записи на сайте (кастомный под дизайн клиники)
- Таблица записей в Битрикс с синхронизацией статусов
- Настройка SMS/email уведомлений (подтверждение + напоминания)
- Организация очереди pending-записей при недоступности МИС
- Тестирование на нагрузку и отказоустойчивость
- Документация по эксплуатации и обучение администраторов
Как мы интегрируем МИС за 5 шагов?
- Анализ API МИС и согласование сценария (1–2 недели).
- Разработка клиента API и резервного хранилища (3–6 недель).
- Интеграция компонента записи на сайте (1–2 недели).
- Настройка уведомлений и очереди ошибок (1 неделя).
- Нагрузочное тестирование и обучение персонала (1–2 недели).
Сроки: от 5 до 14 недель в зависимости от сложности. Закажите интеграцию с гарантией нулевой потери заявок — наши сертифицированные специалисты с 10-летним опытом подберут решение.
| Этап | Длительность |
|---|---|
| Анализ и проектирование | 1–2 недели |
| Разработка и тестирование | 3–6 недель |
| Внедрение и обучение | 1–2 недели |
| Гарантийная поддержка | 1 месяц после запуска |
Получите бесплатную консультацию и оценку вашего проекта — мы подберем оптимальный сценарий интеграции и предложим сроки.







