Інтеграція 1С-Бітрікс з 1С:Медицина
1С:Медицина — сімейство конфігурацій для медичних організацій: «Лікарня», «Поліклініка», «Медична лабораторія». Конфігурації працюють на платформі 1С:Підприємство 8 і, на відміну від більшості інших МІС, добре знайомі розробникам, що працюють з екосистемою 1С. Інтеграція з 1С-Бітрікс — через HTTP-сервіси 1С, COM-об'єкт або обмін через проміжну базу даних.
Способи інтеграції
HTTP-сервіси 1С (переважний варіант). У конфігурації 1С:Медицина створюється HTTP-сервіс, що приймає REST-запити від 1С-Бітрікс. Це найсучасніший і найкерованіший підхід.
COM-об'єкт (тільки Windows-сервер). Прямий виклик 1С з PHP через COM — швидко при малих обсягах, але прив'язує до Windows і створює проблеми з паралелізмом.
Проміжна база даних. 1С:Медицина записує дані (розклад, результати аналізів) у спільну PostgreSQL/MySQL, 1С-Бітрікс читає звідти. Асинхронний підхід, не вимагає доопрацювання 1С, якщо вона вже вміє виконувати вивантаження.
Розглядаємо HTTP-сервіси як основний варіант.
HTTP-сервіс у 1С:Медицина
У конфігураторі 1С створюється HTTP-сервіс (Загальні → HTTP-сервіси):
Ім'я: МедичнийAPI
КореневийURL: /medapi
Версія: 1.0.0
Методи (шаблони URL):
-
GET /medapi/doctors— список лікарів -
GET /medapi/schedule/{doctorId}/{date}— розклад лікаря -
POST /medapi/appointments— створення запису -
DELETE /medapi/appointments/{id}— скасування запису
Обробник методу в 1С (вбудована мова):
Функція ОтриматиРозклад(Запит)
Відповідь = Новий HTTPСервісВідповідь(200);
Відповідь.Заголовки["Content-Type"] = "application/json; charset=utf-8";
ІдЛікаря = Запит.ПараметриURL["doctorId"];
ДатаСеансу = Дата(Запит.ПараметриURL["date"]);
// Запит до регістру розкладу
Запит1С = Новий Запит();
Запит1С.Текст = "
|ВИБРАТИ
| РозкладЛікарів.ЧасПочатку,
| РозкладЛікарів.ЧасЗакінчення,
| РозкладЛікарів.СтатусЯчейки,
| РозкладЛікарів.КабінетПоліклініки
|З
| РегістрВідомостей.РозкладЛікарів ЯК РозкладЛікарів
|ДЕ
| РозкладЛікарів.Лікар.УнікальнийІдентифікатор = &ІдЛікаря
| І РозкладЛікарів.Дата = &Дата
| І РозкладЛікарів.СтатусЯчейки = Перерахування.СтатусиЯчейокРозкладу.Вільна";
Запит1С.ВстановитиПараметр("ІдЛікаря", ІдЛікаря);
Запит1С.ВстановитиПараметр("Дата", ДатаСеансу);
Результат = Запит1С.Виконати().Вибрати();
Слоти = Новий Масив();
Поки Результат.Наступний() Цикл
ДаніСлоту = Новий Структура("start,end,cabinet");
ДаніСлоту.start = Формат(Результат.ЧасПочатку, "ДФ=HH:mm");
ДаніСлоту.end = Формат(Результат.ЧасЗакінчення, "ДФ=HH:mm");
ДаніСлоту.cabinet = Результат.КабінетПоліклініки.Номер;
Слоти.Додати(ДаніСлоту);
КінецьЦиклу;
Відповідь.ВстановитиТілоЗРядка(ЗаписатиJSON(Слоти));
Повернути Відповідь;
КінецьФункції
PHP-клієнт для HTTP-сервісу 1С:Медицина
class OneCMedicinaClient
{
private string $baseUrl; // http://1c-server:8080/медицина/hs/medapi
private string $username;
private string $password;
public function getSchedule(string $doctorGuid, string $date): array
{
return $this->request('GET', "/schedule/{$doctorGuid}/{$date}");
}
public function createAppointment(array $data): array
{
return $this->request('POST', '/appointments', [
'slotDate' => $data['date'],
'slotTime' => $data['time'],
'doctorGuid' => $data['doctor_guid'],
'patient' => [
'lastName' => $data['last_name'],
'firstName' => $data['first_name'],
'middleName' => $data['middle_name'] ?? '',
'birthDate' => $data['birth_date'],
'phone' => $data['phone'],
'email' => $data['email'],
'snils' => $data['snils'] ?? '',
],
'serviceCode' => $data['service_code'] ?? '',
]);
}
private function request(string $method, string $path, array $body = []): array
{
$ch = curl_init($this->baseUrl . $path);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_USERPWD => "{$this->username}:{$this->password}", // Basic Auth у 1С
CURLOPT_HTTPHEADER => ['Content-Type: application/json; charset=utf-8'],
CURLOPT_POSTFIELDS => $body ? json_encode($body, JSON_UNESCAPED_UNICODE) : null,
CURLOPT_TIMEOUT => 10,
]);
$json = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
throw new \RuntimeException("1C:Медицина API error {$httpCode}");
}
return json_decode($json, true) ?? [];
}
}
Важливо: 1С:Підприємство за замовчуванням не підтримує паралельні запити до однієї інформаційної бази без ліцензій клієнтських підключень. При високому навантаженні потрібен пул з'єднань або кешування на стороні 1С-Бітрікс.
Синхронізація довідників
Список лікарів, їх спеціалізації, кабінети — синхронізуємо з 1С в інфоблок 1С-Бітрікс:
class OneCMedicDoctorSync
{
public function syncDoctors(): void
{
$doctors = $this->onecClient->request('GET', '/doctors');
foreach ($doctors as $doctor) {
$existingId = $this->findDoctorByGuid($doctor['guid']);
$fields = [
'NAME' => $doctor['fullName'],
'ACTIVE' => $doctor['active'] ? 'Y' : 'N',
'IBLOCK_ID' => DOCTORS_IBLOCK_ID,
'IBLOCK_SECTION_ID' => $this->getSpecializationSectionId($doctor['specialization']),
];
$props = [
'DOCTOR_GUID' => $doctor['guid'],
'SPECIALIZATION' => $doctor['specialization'],
'CABINET_NUMBER' => $doctor['cabinet'],
'EXPERIENCE_YEARS' => $doctor['experienceYears'],
'ACADEMIC_DEGREE' => $doctor['academicDegree'],
];
if ($existingId) {
$el = new \CIBlockElement();
$el->Update($existingId, $fields);
\CIBlockElement::SetPropertyValuesEx($existingId, DOCTORS_IBLOCK_ID, $props);
} else {
$el = new \CIBlockElement();
$newId = $el->Add(array_merge($fields, ['PROPERTY_VALUES' => $props]));
}
}
}
}
Склад робіт
- Аналіз конкретної конфігурації 1С:Медицина та доступних регістрів
- Розробка HTTP-сервісу на стороні 1С (спільно з 1С-розробником)
- PHP-клієнт для HTTP-сервісу з кешуванням
- Синхронізація довідника лікарів в інфоблок 1С-Бітрікс
- Компонент онлайн-запису з формою
- Сповіщення пацієнту після запису
Терміни: 6–10 тижнів за наявності 1С-розробника в команді. Розробка HTTP-сервісу на стороні 1С — 2–4 тижні, PHP-частина — 3–6 тижнів.







