При запуску онлайн-запису в медичному центрі на 1С-Бітрікс часто стикаються з однією проблемою: 1С:Медицина не віддає дані в реальному часі. Лікарі ведуть розклад у 1С, а на сайті він не оновлюється годинами. Синхронізація через файловий обмін або прямі запити до бази 1С призводить до помилок та затримок. Ми вирішуємо це через HTTP-сервіси — сучасний протокол, який забезпечує безшовну взаємодію систем.
1С:Медицина — сімейство конфігурацій для медичних організацій: «Лікарня», «Поліклініка», «Медична лабораторія». Конфігурації працюють на платформі 1С:Підприємство 8 і, на відміну від більшості інших МІС, добре знайомі розробникам, що працюють з екосистемою 1С. Наш досвід — понад 10 років на ринку інтеграцій, реалізовано понад 50 проєктів у медичних закладах. Вартість розробки залежить від складності конфігурації та кількості синхронізованих довідників, але правильно спроєктована інтеграція дозволяє скоротити операційні витрати клініки на 20–30% за рахунок автоматизації запису. Пропонуємо рішення під ключ — оцінимо ваш проєкт безкоштовно.
Чому HTTP-сервіси краще COM-об'єкта?
COM-об'єкт — прямий виклик 1С з PHP через new COM(...). Працює лише на Windows-сервері, погано масштабується. При паралельних запитах (5+ пацієнтів одночасно) виникають блокування, падіння продуктивності в 3–5 разів порівняно з HTTP-сервісами. HTTP-сервіси не прив'язані до ОС, підтримують асинхронну обробку та кешування на стороні Бітрікс. Проміжна база даних — альтернатива, якщо 1С вже вміє вивантажувати дані в PostgreSQL/MySQL, але вона не дає двостороннього онлайн-обміну. HTTP-сервіси — кращий варіант.
| Метод | Швидкість | Надійність | Складність |
|---|---|---|---|
| HTTP-сервіси 1С | Висока | Висока | Середня |
| COM-об'єкт | Середня (падає при навантаженні) | Низька (блокування) | Низька |
| Проміжна БД | Низька (асинхронно) | Висока | Висока |
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С (вбудована мова):
Функція ОтриматиРозклад(Запит) Відповідь = Новий HTTPServisВідповідь(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С в інфоблок Бітрікс. Ключовий параметр — унікальний ідентифікатор лікаря (GUID) з 1С. Він зберігається у властивості інфоблоку, і при повторній синхронізації ми не створюємо дублі, а оновлюємо існуючі елементи. Типова помилка — втрата зв'язку між записами, коли в 1С змінюється ідентифікатор. Ми використовуємо службову властивість DOCTYPE_GUID та логіку пошуку за ним.
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С:Медицина та Бітрікс?
| Дані | Напрямок | Періодичність |
|---|---|---|
| Лікарі (ПІБ, спец., кабінет) | 1С → Бітрікс | По події (зміна в 1С) |
| Розклад (слоти часу) | 1С → Бітрікс | Рідше: кожні 5-15 хвилин |
| Новий запис пацієнта | Бітрікс → 1С | Миттєво (онлайн) |
| Скасування запису | Бітрікс → 1С | Миттєво |
| Послуги та ціни | 1С → Бітрікс | За розкладом (раз на добу) |
Що входить в роботу
- Аналіз конкретної конфігурації 1С:Медицина та доступних регістрів
- Розробка HTTP-сервісу на стороні 1С (спільно з 1С-розробником)
- PHP-клієнт для HTTP-сервісу з кешуванням (теговане кешування)
- Синхронізація довідника лікарів в інфоблок Бітрікс
- Компонент онлайн-запису з формою (валідація, вибір слоту)
- Сповіщення пацієнту по SMS/email після запису
- Документація по інтеграції та навчання
- Гарантійна підтримка 3 місяці
Чек-лист типових етапів проєкту:
- Аудит конфігурації 1С:Медицина та схеми даних
- Проєктування REST API (HTTP-сервіс)
- Розробка та тестування HTTP-сервісу в 1С
- Створення PHP-клієнта та компонентів Бітрікс
- Інтеграційне тестування (до 2 тижнів)
- Запуск та супровід (3 місяці гарантії)
Терміни: 6–10 тижнів за наявності 1С-розробника в команді. Розробка HTTP-сервісу на стороні 1С — 2–4 тижні, PHP-частина — 3–6 тижнів. Правильно спроєктована інтеграція дає економію бюджету на підтримці та знижує витрати на адміністрування. Пишіть нам для консультації — ми проаналізуємо конфігурацію та запропонуємо рішення. Зв'яжіться з нами.







