Интеграция 1С-Битрикс с медицинской информационной системой (МИС)

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Интеграция 1С-Битрикс с медицинской информационной системой (МИС)
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1173
  • 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С Предприятие для компании МИРСАНБЕЛ
    745
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Интеграция 1С-Битрикс с медицинской информационной системой (МИС)

Сайт частной клиники принимает онлайн-записи к врачам. МИС (медицинская информационная система) — это операционная система клиники: расписание врачей, история болезни, электронная медкарта, учёт услуг, касса. Задача: запись с сайта должна автоматически попадать в расписание МИС, а данные о свободных слотах — отображаться на сайте в реальном времени.

Рынок МИС неоднороден: Инфоклиника, 1С:Медицина, qMS, Medesk, Ренессанс-М, ArchiMed+, Medods — у каждой свой API (или его отсутствие). Архитектура интеграции зависит от конкретной МИС.

Типовые сценарии интеграции

Сценарий A: МИС предоставляет REST/SOAP API. Сайт напрямую обращается к API МИС для получения расписания и записи пациента. Самый чистый вариант, но не все МИС его поддерживают.

Сценарий B: Промежуточный брокер. МИС публикует расписание в промежуточной базе (PostgreSQL или MySQL), сайт читает оттуда. Запись на сайте создаёт заявку в промежуточной таблице, МИС забирает её по cron.

Сценарий C: Интеграционная шина. Для крупных клиник с несколькими МИС и множеством систем — отдельный интеграционный сервис (например, на базе RabbitMQ или Apache Kafka), который синхронизирует данные между системами.

Для одной клиники с одной МИС — сценарий A или B.

Интеграция через REST API МИС (на примере 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, // Y-m-d
            '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 МИС при каждом посещении страницы врача — плохая идея: МИС может быть медленной или иметь ограничения на число запросов. Кешируем расписание:

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');

    // Записи через 24 часа без отправленного напоминания
    $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-записи в МИС.

Состав работ

  • Анализ API конкретной МИС (разные для каждого вендора)
  • PHP-клиент API МИС с обработкой ошибок
  • Кеширование расписания, инвалидация при записи
  • Компонент онлайн-записи на сайте
  • Таблица записей в Битрикс, SMS/email уведомления
  • Очередь pending-записей при недоступности МИС

Сроки: 5–8 недель при наличии документированного API МИС. 8–14 недель при интеграции через промежуточную базу или разработке API на стороне МИС.