Интеграция 1С-Битрикс с ЕМИАС

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

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

Работа с ЕМИАС — это взаимодействие с государственной системой: требуется соглашение с Департаментом здравоохранения Москвы, сертификация, выпуск сертификатов доступа. Техническая интеграция строится на веб-сервисах ЕМИАС SOAP или REST.

Доступ к ЕМИАС API

Получение доступа к API ЕМИАС — административный процесс:

  1. Заявка в Департамент информационных технологий г. Москвы (ДИТ)
  2. Подписание соглашения об информационном взаимодействии
  3. Выпуск сертификата для двустороннего TLS (mTLS)
  4. Получение тестового стенда и документации

API ЕМИАС использует WCF (Windows Communication Foundation) или REST в зависимости от версии и модуля. Для работы с расписанием врачей — сервис ScheduleService.

SOAP-клиент для ЕМИАС

Если ЕМИАС предоставляет WSDL:

class EmiasClient
{
    private \SoapClient $client;
    private string $certPath;
    private string $certPassword;

    public function __construct(string $wsdlUrl, string $certPath, string $certPassword)
    {
        $this->certPath     = $certPath;
        $this->certPassword = $certPassword;

        // ЕМИАС требует mTLS — клиентский сертификат
        $context = stream_context_create([
            'ssl' => [
                'local_cert'        => $certPath,
                'passphrase'        => $certPassword,
                'verify_peer'       => true,
                'verify_peer_name'  => true,
                'cafile'            => '/etc/ssl/certs/emias-ca.crt',
            ],
        ]);

        $this->client = new \SoapClient($wsdlUrl, [
            'soap_version'  => SOAP_1_2,
            'encoding'      => 'UTF-8',
            'trace'         => false,
            'exceptions'    => true,
            'stream_context' => $context,
        ]);
    }

    public function getDoctorSchedule(string $lpuCode, int $doctorId, \DateTime $date): array
    {
        try {
            $result = $this->client->GetSchedule([
                'lpuCode'    => $lpuCode,
                'doctorId'   => $doctorId,
                'dateFrom'   => $date->format('Y-m-d'),
                'dateTo'     => $date->format('Y-m-d'),
            ]);

            return $this->parseScheduleResult($result);
        } catch (\SoapFault $e) {
            \Bitrix\Main\Diag\Debug::writeToFile(
                "EMIAS SOAP fault: {$e->faultcode} — {$e->faultstring}",
                '',
                '/local/logs/emias.log'
            );
            throw new \RuntimeException("Ошибка ЕМИАС: {$e->faultstring}");
        }
    }

    public function createAppointment(array $params): string
    {
        // Возвращает appointmentId ЕМИАС
        $result = $this->client->CreateAppointment([
            'lpuCode'     => $params['lpu_code'],
            'doctorId'    => $params['doctor_id'],
            'slotId'      => $params['slot_id'],
            'patient'     => [
                'lastName'    => $params['last_name'],
                'firstName'   => $params['first_name'],
                'middleName'  => $params['middle_name'] ?? '',
                'birthDate'   => $params['birth_date'], // DD.MM.YYYY
                'snils'       => $params['snils'],       // Обязательно для ЕМИАС
                'oms'         => $params['oms_policy'],  // Полис ОМС
            ],
        ]);

        return (string)$result->AppointmentId;
    }
}

СНИЛС и полис ОМС — обязательные поля для записи в ЕМИАС. Это принципиальное отличие от коммерческих МИС, где достаточно телефона.

Верификация пациента через Госуслуги

Поскольку ЕМИАС требует СНИЛС, интеграция с Госуслугами (ЕСИА) для авторизации пациента — логичное продолжение. Пациент авторизуется через Госуслуги → система получает его СНИЛС и данные из ЕСИА → передаёт в ЕМИАС.

class GosuslugiEsiaService
{
    // ЕСИА OAuth 2.0
    private string $clientId;    // Мнемоника ИС в ЕСИА
    private string $certPath;    // Сертификат ИС для подписи запросов

    public function getAuthUrl(string $state): string
    {
        $timestamp = date('Y.m.d H:i:s O');
        $scope     = 'openid fullname snils medical';

        // ЕСИА требует подписанный запрос
        $clientSecret = $this->signRequest(implode('', [
            $scope, $timestamp, $this->clientId, $state
        ]));

        return 'https://esia.gosuslugi.ru/aas/oauth2/ac?' . http_build_query([
            'client_id'     => $this->clientId,
            'client_secret' => $clientSecret,
            'redirect_uri'  => SITE_SERVER_NAME . '/esia/callback/',
            'scope'         => $scope,
            'response_type' => 'code',
            'state'         => $state,
            'timestamp'     => $timestamp,
            'access_type'   => 'online',
        ]);
    }

    private function signRequest(string $data): string
    {
        // Подпись через openssl с сертификатом ИС
        $pkcs7 = '';
        openssl_pkcs7_sign(
            tempnam(sys_get_temp_dir(), 'esia_'),
            tempnam(sys_get_temp_dir(), 'esia_out_'),
            file_get_contents($this->certPath),
            ['', ''],
            [],
            PKCS7_DETACHED | PKCS7_NOATTR
        );
        return base64_encode($pkcs7);
    }
}

Интеграция с ЕСИА — отдельный крупный проект с требованиями к сертификации системы.

Кеширование и синхронизация расписания

Прямые запросы к ЕМИАС при каждом показе расписания на сайте — неприемлемо с точки зрения производительности и ограничений ЕМИАС. Расписание синхронизируется в локальную таблицу каждые 5–15 минут:

class EmiasSyncAgent
{
    public function syncSchedule(): string
    {
        $doctors = $this->getActiveDoctors(); // список врачей из Битрикс
        $dateRange = [
            'from' => date('Y-m-d'),
            'to'   => date('Y-m-d', strtotime('+30 days')),
        ];

        foreach ($doctors as $doctor) {
            try {
                $schedule = $this->emiasClient->getDoctorSchedule(
                    $doctor['LPU_CODE'],
                    $doctor['EMIAS_DOCTOR_ID'],
                    new \DateTime($dateRange['from'])
                );

                $this->upsertSlots($doctor['ID'], $schedule);
            } catch (\RuntimeException $e) {
                // Логируем, не прерываем цикл по остальным врачам
                \CEventLog::Add(['SEVERITY' => 'WARNING', 'DESCRIPTION' => $e->getMessage()]);
            }
        }

        return __FUNCTION__ . '();';
    }
}

Слоты хранятся в local_emias_slots: DOCTOR_ID, SLOT_DATE, SLOT_TIME, EMIAS_SLOT_ID, IS_FREE. Сайт читает слоты из локальной таблицы, а не из ЕМИАС напрямую.

Конфликты одновременной записи

Пользователь выбрал слот на 15:00 → идёт заполнять форму → другой пользователь записался на то же время через ЕМИАС-портал. Решение:

  1. При открытии формы — «мягкое» резервирование слота (пометка в локальной таблице)
  2. Резерв действует 5 минут
  3. При окончательной отправке — запись в ЕМИАС API
  4. Если ЕМИАС вернул ошибку «слот занят» — показываем ближайшие свободные

Состав работ

  • Получение доступа к API ЕМИАС (административный процесс, не разработка)
  • Настройка mTLS, клиентский сертификат
  • SOAP-клиент ЕМИАС, парсинг расписания
  • Синхронизация расписания в локальную таблицу (агент)
  • Компонент записи с формой СНИЛС/полис ОМС
  • Интеграция с ЕСИА для авторизации (опционально, отдельный проект)
  • Обработка конфликтов одновременной записи

Сроки: административные процедуры (доступ, соглашение) — 1–3 месяца. Техническая разработка после получения доступа — 6–12 недель.