Інтеграція 1С-Бітрікс з 1С:Медицина

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Інтеграція 1С-Бітрікс з 1С:Медицина
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Інтеграція 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 тижнів.