Интеграция 1С-Битрикс с сервисами онлайн-записи (YCLIENTS)

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Интеграция 1С-Битрикс с сервисами онлайн-записи (YCLIENTS)
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1181
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    813
  • 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 Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Интеграция 1С-Битрикс с сервисами онлайн-записи (YCLIENTS)

YCLIENTS — отраслевая платформа для онлайн-записи в сервисные бизнесы: салоны красоты, медицинские клиники, фитнес, автосервисы. Когда сайт на 1С-Битрикс, а система управления записями — в YCLIENTS, возникает классический разрыв: клиент записывается через виджет YCLIENTS на сайте, но его данные не попадают в Битрикс CRM. Маркетинг не знает, с какого объявления пришёл клиент, лиды не создаются, история взаимодействий разрознена. Задача интеграции — синхронизировать эти системы.

Что интегрируем

YCLIENTS предоставляет REST API v2. Ключевые сущности: records (записи), clients (клиенты), services (услуги), staff (персонал), bookforms (формы записи). Для интеграции с Битрикс нас интересуют прежде всего записи и клиенты.

Сценарии:

  1. Новая запись в YCLIENTS → лид/сделка в Битрикс CRM (приоритетный)
  2. Клиент из Битрикс CRM → карточка клиента в YCLIENTS (двунаправленная синхронизация)
  3. Отмена записи в YCLIENTS → обновление сделки в Битрикс
  4. Витрина услуг YCLIENTS на сайте Битрикс — через виджет или API

YCLIENTS API: авторизация

YCLIENTS использует Bearer-токен, получаемый в обмен на логин/пароль. Токен живёт долго (несколько месяцев), храним в настройках модуля.

namespace Local\YClients;

class ApiClient
{
    private string $baseUrl = 'https://api.yclients.com/api/v1';
    private string $partnerToken; // токен партнёра YCLIENTS
    private string $userToken;    // токен конкретного пользователя

    public function __construct()
    {
        $this->partnerToken = \Bitrix\Main\Config\Option::get('local.yclients', 'partner_token');
        $this->userToken    = \Bitrix\Main\Config\Option::get('local.yclients', 'user_token');
    }

    public function request(string $method, string $path, array $data = []): array
    {
        $url = $this->baseUrl . $path;
        $ch  = curl_init();

        curl_setopt_array($ch, [
            CURLOPT_URL            => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT        => 15,
            CURLOPT_HTTPHEADER     => [
                'Authorization: Bearer ' . $this->partnerToken . ', User ' . $this->userToken,
                'Accept: application/vnd.yclients.v2+json',
                'Content-Type: application/json',
            ],
        ]);

        if ($method === 'POST') {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        } elseif ($method === 'PUT') {
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        }

        $response = json_decode(curl_exec($ch), true);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($httpCode >= 400) {
            throw new \RuntimeException("YCLIENTS API error {$httpCode}: " . ($response['meta']['message'] ?? 'unknown'));
        }

        return $response['data'] ?? $response;
    }
}

Webhook: новая запись → лид в Битрикс

YCLIENTS поддерживает вебхуки на события: record_created, record_updated, record_cancelled, client_created. Настройка в ЛК YCLIENTS: Интеграции → Webhook.

// /local/api/yclients-webhook.php
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');

$payload = json_decode(file_get_contents('php://input'), true);

// Верификация: YCLIENTS отправляет X-Yclients-Hook-Signature
$signature = $_SERVER['HTTP_X_YCLIENTS_HOOK_SIGNATURE'] ?? '';
$body      = file_get_contents('php://input');
$secret    = \Bitrix\Main\Config\Option::get('local.yclients', 'webhook_secret');

if (hash_hmac('sha256', $body, $secret) !== $signature) {
    http_response_code(403);
    exit;
}

$eventType = $payload['resource'] ?? '';
$data      = $payload['data'] ?? [];

match ($eventType) {
    'record_created'   => (new \Local\YClients\RecordHandler())->onCreate($data),
    'record_cancelled' => (new \Local\YClients\RecordHandler())->onCancel($data),
    'record_updated'   => (new \Local\YClients\RecordHandler())->onUpdate($data),
    default            => null,
};

http_response_code(200);

Обработчик записи:

namespace Local\YClients;

class RecordHandler
{
    public function onCreate(array $record): void
    {
        $client = $record['client'] ?? [];
        $phone  = $this->normalizePhone($client['phone'] ?? '');

        $services = array_map(
            fn($s) => $s['title'],
            $record['services'] ?? []
        );

        $staffName = $record['staff']['name'] ?? '—';
        $datetime  = $record['date'] ?? '';

        // Ищем существующий контакт/лид по телефону
        $existingLeadId = $this->findLeadByPhone($phone);

        $fields = [
            'TITLE'                => 'Запись YCLIENTS: ' . implode(', ', $services),
            'PHONE'                => [['VALUE' => $phone, 'VALUE_TYPE' => 'WORK']],
            'NAME'                 => $client['name'] ?? '',
            'SOURCE_ID'            => 'OTHER',
            'STATUS_ID'            => 'NEW',
            'COMMENTS'             => sprintf(
                "YCLIENTS запись #%d\nУслуга: %s\nМастер: %s\nДата: %s",
                $record['id'],
                implode(', ', $services),
                $staffName,
                $datetime
            ),
            'UF_YCLIENTS_RECORD_ID' => (string)$record['id'],
            'UF_YCLIENTS_DATE'      => $datetime,
        ];

        $lead = new \CCrmLead(false);

        if ($existingLeadId) {
            $lead->Update($existingLeadId, ['COMMENTS' => $fields['COMMENTS']], true);
        } else {
            $lead->Add($fields, true);
        }
    }

    public function onCancel(array $record): void
    {
        $ycId = (string)$record['id'];

        // Ищем лид по UF_YCLIENTS_RECORD_ID
        $res = \CCrmLead::GetList(
            [],
            ['UF_YCLIENTS_RECORD_ID' => $ycId],
            false,
            ['nTopCount' => 1],
            ['ID']
        );

        if ($row = $res->Fetch()) {
            $lead = new \CCrmLead(false);
            $lead->Update($row['ID'], ['STATUS_ID' => 'JUNK', 'COMMENTS' => 'Отменено клиентом в YCLIENTS'], true);
        }
    }
}

Синхронизация клиентов из Битрикс в YCLIENTS

При создании сделки в Битрикс (если клиент заинтересован в услуге) — автоматически создаём/обновляем клиента в YCLIENTS:

namespace Local\YClients;

class ClientSync
{
    private ApiClient $api;
    private int $companyId; // ID компании в YCLIENTS

    public function syncFromBitrix(int $bxLeadId): ?int
    {
        $lead  = \CCrmLead::GetByID($bxLeadId);
        $phone = $this->getLeadPhone($bxLeadId);

        if (!$phone) return null;

        // Ищем клиента в YCLIENTS по телефону
        $existing = $this->api->request('GET',
            "/clients/{$this->companyId}?phone=" . urlencode($phone)
        );

        $clientData = [
            'name'    => trim($lead['NAME'] . ' ' . $lead['LAST_NAME']),
            'phone'   => $phone,
            'email'   => $lead['EMAIL'] ?? '',
            'comment' => 'Источник: Битрикс CRM, лид #' . $bxLeadId,
        ];

        if (!empty($existing)) {
            // Обновляем
            $ycClientId = $existing[0]['id'];
            $this->api->request('PUT', "/client/{$this->companyId}/{$ycClientId}", $clientData);
        } else {
            // Создаём нового
            $result     = $this->api->request('POST', "/clients/{$this->companyId}", $clientData);
            $ycClientId = $result['id'];
        }

        // Сохраняем ID клиента YCLIENTS в поле лида
        $lead = new \CCrmLead(false);
        $lead->Update($bxLeadId, ['UF_YCLIENTS_CLIENT_ID' => $ycClientId], true);

        return $ycClientId;
    }
}

Виджет YCLIENTS на сайте Битрикс

Самый простой способ разместить форму записи — стандартный виджет YCLIENTS. Он вставляется через компонент Битрикс в нужном месте шаблона.

Кастомизация: виджет YCLIENTS поддерживает параметры через JS API — можно предзаполнить выбранную услугу или мастера, если пользователь перешёл с карточки товара/услуги Битрикс.

Таблица пользовательских полей

Код Привязка Назначение
UF_YCLIENTS_RECORD_ID Лид ID записи в YCLIENTS
UF_YCLIENTS_CLIENT_ID Лид, Контакт ID клиента в YCLIENTS
UF_YCLIENTS_DATE Лид Дата/время записи
UF_YCLIENTS_STAFF Лид Имя мастера
UF_YCLIENTS_SERVICE Лид Название услуги

Состав работ

  • Настройка YCLIENTS API: получение партнёрского токена, пользовательского токена
  • Webhook-эндпоинт с верификацией подписи
  • Создание/обновление лидов по входящим записям
  • Синхронизация клиентов Битрикс → YCLIENTS
  • Создание пользовательских полей в CRM
  • (Опционально) Встройка виджета YCLIENTS в шаблоны компонентов Битрикс

Сроки: базовая интеграция (webhook → лид) — 1–2 недели. Двусторонняя синхронизация клиентов и витрина услуг — 3–5 недель.