Зв'язка 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 тижнів після отримання доступу. Отримайте консультацію — оцінимо ваш проєкт індивідуально.
ЄМІАС — державна система охорони здоров'я Москви.







