Онлайн-запис до лікаря: синхронізація Бітрікс і МІС
Сайт приватної клініки приймає онлайн-записи до лікарів. МІС — медична інформаційна система — операційна система клініки: розклад лікарів, історія хвороби, електронна медкарта, облік послуг, каса. МІС — медична інформаційна система. Задача: запис з сайту має автоматично потрапляти до розкладу МІС, а вільні слоти — відображатися на сайті в реальному часі. Кожна година простою або ручного перенесення даних коштує до 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 місяць після запуску |
Отримайте безкоштовну консультацію та оцінку вашого проекту — ми підберемо оптимальний сценарій інтеграції та запропонуємо терміни.







