При запуске онлайн-записи в медицинском центре на 1С-Битрикс часто сталкиваются с одной проблемой: 1С:Медицина не отдаёт данные в реальном времени. Врачи ведут расписание в 1С, а на сайте оно не обновляется часами. Синхронизация через файловый обмен или прямые запросы к базе 1С приводит к ошибкам и задержкам. Мы решаем это через HTTP-сервисы — современный протокол, который обеспечивает бесшовное взаимодействие систем.
1С:Медицина — семейство конфигураций для медицинских организаций: «Больница», «Поликлиника», «Медицинская лаборатория». Конфигурации работают на платформе 1С:Предприятие 8 и, в отличие от большинства других МИС, хорошо знакомы разработчикам, работающим с экосистемой 1С. Наш опыт — более 10 лет интеграций 1С-Битрикс с МИС, реализовано свыше 50 проектов в медицинских учреждениях. Стоимость разработки зависит от сложности конфигурации и количества синхронизируемых справочников, но правильно спроектированная интеграция позволяет сократить операционные затраты клиники за счёт автоматизации записи.
Почему 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С (встроенный язык):
Функция ПолучитьРасписание(Запрос)
Ответ = Новый 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С в инфоблок Битрикс. Ключевой параметр — уникальный идентификатор врача (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 недель. Правильно спроектированная интеграция даёт экономию бюджета на поддержке и снижает затраты на администрирование. Получите предварительную оценку вашего проекта — мы проанализируем конфигурацию и предложим решение. Свяжитесь с нами.







