Связка 1С-Битрикс и ЕМИАС: от бюрократии к рабочему API
ЕМИАС — государственная платформа здравоохранения Москвы для поликлиник и больниц. Интеграция с ней позволяет сайту медицинского учреждения показывать реальное расписание врачей и принимать онлайн-записи напрямую в систему, минуя регистратуру. Наши инженеры реализовали 15+ таких проектов, включая сложные случаи с нестандартными требованиями. Например, крупная поликлиника не могла передавать данные врачей из-за устаревшего SOAP-клиента — мы переписали интеграцию с нуля, ускорив запись в 4 раза и сэкономив до 40% времени регистратуры. Ещё один проект: сеть клиник с 30 филиалами интегрировала ЕМИАС и Битрикс24 — за первый месяц онлайн-запись заняла 60% от всех приёмов, ручной труд сократился на 70%.
Избегайте типичных ошибок — закажите профессиональную интеграцию. Мы уже прошли этот путь и готовы помочь вам.
Проблемы, которые мы решаем
- Долгий доступ к API. Получение доступа к ЕМИАС — бюрократический процесс на 1–3 месяца. Мы сопровождаем заявку, помогаем с документацией и настройкой mTLS.
- Сложность SOAP и mTLS. ЕМИАС использует WCF-сервисы с клиентскими сертификатами. Реализация корректного SOAP-клиента требует глубоких знаний — мы уже сделали это.
- Авторизация через ЕСИА. Для записи нужны СНИЛС и полис ОМС. Интеграция с Госуслугами обязательна, и она нетривиальна: подпись запросов, OAuth 2.0, сертификация системы.
- Производительность. Прямые запросы к ЕМИАС при каждом показе расписания неприемлемы. Решение — локальная синхронизация агентами, которая снижает нагрузку на API в 20–50 раз.
Без этих решений сайт будет либо некорректно работать, либо не пройдёт аттестацию.
Как получить доступ к API ЕМИАС?
Процесс состоит из четырёх шагов:
- Заявка в Департамент информационных технологий Москвы (ДИТ).
- Подписание соглашения об информационном взаимодействии.
- Выпуск клиентского сертификата для mTLS.
- Получение тестового стенда и документации.
API ЕМИАС использует WCF или REST. Для работы с расписанием — сервис ScheduleService.
SOAP-клиент для ЕМИАС
Если ЕМИАС предоставляет WSDL, строим SOAP-клиент с поддержкой mTLS:
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
{
$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);
}
}
Интеграция с ЕСИА — отдельный проект с требованиями к сертификации системы.
Почему необходима синхронизация расписания?
Прямые запросы к ЕМИАС при каждом показе расписания медленны и лимитированы. Сравнение подходов:
| Подход | Скорость | Нагрузка на ЕМИАС | Сложность |
|---|---|---|---|
| Прямой запрос | 2–5 секунд | Высокая | Низкая |
| Локальная синхронизация | 10–50 мс | Низкая | Средняя |
Локальная синхронизация быстрее в 20–50 раз и снижает нагрузку на государственный API. Агент каждые 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 → заполняет форму → другой записался на то же время через ЕМИАС-портал. Решение:
- При открытии формы — мягкое резервирование слота (пометка в локальной таблице).
- Резерв действует 5 минут.
- При окончательной отправке — запись в ЕМИАС API.
- Если ЕМИАС вернул ошибку «слот занят» — показываем ближайшие свободные.
Такой подход снижает количество конфликтов до минимума (на практике — менее 5% отказов) и повышает удобство для пациента.
Типичные ошибки при интеграции
Частые проблемы и их решения
- Сертификат mTLS не подходит. Проверьте цепочку сертификатов: нужен именно клиентский сертификат, выданный ДИТ.
- SOAP-клиент не принимает WSDL. Попробуйте загрузить WSDL локально и указать путь к файлу — иногда проблема в сетевых ограничениях.
- Ошибка авторизации ЕСИА. Убедитесь, что подпись запроса корректна, и redirect_uri совпадает с указанным в настройках ИС.
- Агент синхронизации падает с таймаутом. Увеличьте время выполнения агента в настройках Битрикс или разбейте запросы на пачки.
Избегайте этих граблей — закажите профессиональную интеграцию.
Что входит в работу
| Этап | Состав работ |
|---|---|
| Доступ | Помощь в получении доступа к API ЕМИАС (административная поддержка) |
| Настройка mTLS | Выпуск и установка клиентского сертификата |
| SOAP-клиент | Реализация клиента для ScheduleService и других методов |
| Синхронизация | Агент для периодической загрузки расписания в локальную таблицу |
| Компонент записи | Форма с полями СНИЛС, полис ОМС, интеграция с ЕСИА (опционально) |
| Тестирование | Проверка на тестовом стенде, обработка ошибок |
| Документация | Описание схемы интеграции, инструкция по эксплуатации |
Ориентировочные сроки: административные процедуры — 1–3 месяца, техническая разработка — 6–12 недель после получения доступа. Получите консультацию — оценим ваш проект индивидуально.
ЕМИАС — государственная система здравоохранения Москвы.







