Интеграция 1С-Битрикс с 1С:Медицина
1С:Медицина — семейство конфигураций для медицинских организаций: «Больница», «Поликлиника», «Медицинская лаборатория». Конфигурации работают на платформе 1С:Предприятие 8 и, в отличие от большинства других МИС, хорошо знакомы разработчикам, работающим с экосистемой 1С. Интеграция с 1С-Битрикс — через HTTP-сервисы 1С, COM-объект или обмен через промежуточную базу данных.
Способы интеграции
HTTP-сервисы 1С (предпочтительно). В конфигурации 1С:Медицина создаётся HTTP-сервис, который принимает REST-запросы от Битрикс. Это самый современный и управляемый подход.
COM-объект (только Windows-сервер). Прямой вызов 1С из PHP через COM — быстро при малых объёмах, но привязывает к Windows и создаёт проблемы с параллелизмом.
Промежуточная база данных. 1С:Медицина пишет данные (расписание, результаты анализов) в общую PostgreSQL/MySQL, Битрикс читает оттуда. Асинхронный подход, не требует доработки 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С в инфоблок Битрикс:
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-сервиса с кешированием
- Синхронизация справочника врачей в инфоблок Битрикс
- Компонент онлайн-записи с формой
- Уведомления пациенту после записи
Сроки: 6–10 недель при наличии 1С-разработчика в команде. Разработка HTTP-сервиса на стороне 1С — 2–4 недели, PHP-часть — 3–6 недель.







