Бренды
Акции
Услуги
  • Разработка сайтов на 1С Битрикс
Компания
  • О компании
  • Сертификаты
  • Документы
  • Реквизиты
Блог
Контакты
Галерея
    +7 4912 99-38-48
    +7 4912 99-38-48
    Заказать звонок
    E-mail
    mail@rbs62.ru
    Адрес
    г. Рязань. Касимовское шоссе, д 57
    Режим работы
    Пн. – Пт.: с 9:00 до 18:00
    Заказать звонок
    РязБизнесСофт
    1С-Битрикс
    Лаборатория Касперского
    Мой Офис
    • 1С-Битрикс
      • 1С-Битрикс Управление сайтом
        • Лицензии
        • Переход на другую лицензию
        • Продление
    • Лаборатория Касперского
    • Мой Офис
    Каталог
    По всему сайту
    По каталогу
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    1С-Битрикс
    РязБизнесСофт
    Каталог
    По всему сайту
    По каталогу
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    РязБизнесСофт
    Телефоны
    +7 4912 99-38-48
    Заказать звонок
    0
    0
    0
    РязБизнесСофт
    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    • +7 4912 99-38-48
      • Назад
      • Телефоны
      • +7 4912 99-38-48
      • Заказать звонок
    • mail@rbs62.ru
    • г. Рязань. Касимовское шоссе, д 57
    • Пн. – Пт.: с 9:00 до 18:00
    Главная
    –
    Статьи
    –
    Разработка Битрикс
    –Как синхронизировать статус оплаты заказа из 1С-Битрикс со сделкой в Битрикс24

    Как синхронизировать статус оплаты заказа из 1С-Битрикс со сделкой в Битрикс24

    В процессе автоматизации интернет-магазина часто возникает задача: после успешной оплаты заказа на сайте нужно обновить соответствующую сделку в CRM Битрикс24. Однако стандартная интеграция не всегда синхронизирует статусы автоматически. В этой статье я расскажу, как решить эту проблему с помощью обработчика события и REST API.

    Проблема: оплата прошла, а сделка не обновилась

    Ситуация знакома многим: вы настроили модуль PayKeeper для приёма платежей, оплата успешно проходит, статус заказа в интернет-магазине меняется на «Оплачен», но в карточке сделки Битрикс24 ничего не меняется. Менеджеры вынуждены проверять оплату вручную, что снижает эффективность работы.

    Стандартная интеграция «Обмен с 1С-Битрикс Управление сайтом» обновляет только статус заказа на сайте, но не передаёт изменения в CRM. Для полноценной синхронизации требуется написать собственный обработчик.

    Архитектура решения

    Наше решение основано на двух ключевых элементах:

    1. Событие OnSaleOrderStatusChange — срабатывает при изменении статуса заказа в 1С-Битрикс.

    2. REST API Битрикс24 — позволяет обновлять данные сделки удалённо через вебхук.

    Связь заказа и сделки хранится в поле ORIGIN_ID, которое является идентификатором элемента во внешней системе.

    Пошаговая реализация

    Шаг 1. Настройка вебхука в Битрикс24

    Для работы с API необходимо создать вебхук с правами на чтение и обновление сделок:

    1. Зайдите в Битрикс24 → Настройки → Интеграции → Вебхуки.

    2. Создайте новый вебхук.

    3. В правах выберите:

    - crm.deal.list — для поиска сделки по ID заказа

    - crm.deal.update — для обновления сделки

    4. Скопируйте полученный URL — он понадобится в коде.

    Шаг 2. Подготовка файла init.php

    Модуль PayKeeper требует подключения обработчика событий для полноценной работы. Откройте файл /local/php_interface/init.php (или /bitrix/php_interface/init.php) и добавьте строку:

    include_once $_SERVER["DOCUMENT_ROOT"] . '/bitrix/modules/sale/handlers/paysystem/paykeeper/eventhandler.php';
    

    Это обязательное условие для корректной работы модуля.

    Шаг 3. Код обработчика события

    Вот готовый обработчик, который при изменении статуса заказа на «Оплачен» обновляет соответствующую сделку:

    <?php
    /**
     * Обработчик события смены статуса заказа
     * При изменении статуса на "Оплачен" обновляет сделку в Битрикс24
     */
    
    AddEventHandler("sale", "OnSaleOrderStatusChange", "UpdateBitrix24DealOnPay");
    
    function UpdateBitrix24DealOnPay($ID, $event)
    {
        // НАСТРОЙТЕ ЭТИ ПАРАМЕТРЫ
        $webhookUrl = 'https://ваш_битрикс24.bitrix24.ru/rest/1/ваш_вебхук/';
        
        // Что менять в сделке при оплате
        $updateFields = [
            'STAGE_ID' => 'WON',                    // Меняем стадию на "Успешно завершена"
            'UF_CRM_ПОЛЕ_ОПЛАТЫ' => 'Y'             // Отметка об оплате
        ];
        
        // Проверяем, что статус изменился на "Оплачен" (F)
        if ($event->getNewValue() !== "F") {
            return;
        }
        
        $orderId = $ID;
        
        // Логируем начало обработки
        file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/bx24_sync.log", 
            date('Y-m-d H:i:s') . " - Заказ #$orderId: статус изменен на 'Оплачен'\n", 
            FILE_APPEND);
        
        // --- Шаг 1: Ищем сделку по ORIGIN_ID ---
        $result = callRest($webhookUrl . 'crm.deal.list', [
            'filter' => ['ORIGIN_ID' => (string)$orderId],
            'select' => ['ID', 'TITLE', 'STAGE_ID']
        ]);
        
        if (isset($result['error'])) {
            file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/bx24_sync.log", 
                date('Y-m-d H:i:s') . " - Ошибка поиска: " . $result['error_description'] . "\n", 
                FILE_APPEND);
            return;
        }
        
        if (empty($result['result'])) {
            file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/bx24_sync.log", 
                date('Y-m-d H:i:s') . " - Сделка для заказа #$orderId не найдена\n", 
                FILE_APPEND);
            return;
        }
        
        $dealId = $result['result'][0]['ID'];
        
        // --- Шаг 2: Обновляем сделку ---
        $updateResult = callRest($webhookUrl . 'crm.deal.update', [
            'id' => $dealId,
            'fields' => $updateFields
        ]);
        
        if (isset($updateResult['error'])) {
            file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/bx24_sync.log", 
                date('Y-m-d H:i:s') . " - Ошибка обновления #$dealId: " . $updateResult['error_description'] . "\n", 
                FILE_APPEND);
            return;
        }
        
        file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/bx24_sync.log", 
            date('Y-m-d H:i:s') . " - ✅ Сделка #$dealId успешно обновлена!\n", 
            FILE_APPEND);
    }
    
    /**
     * Вспомогательная функция для выполнения REST-запросов
     */
    function callRest($url, $params = [])
    {
        $curl = curl_init();
        curl_setopt_array($curl, [
            CURLOPT_SSL_VERIFYPEER => 0,
            CURLOPT_POST => 1,
            CURLOPT_HEADER => 0,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_URL => $url,
            CURLOPT_POSTFIELDS => http_build_query($params),
        ]);
        
        $response = curl_exec($curl);
        curl_close($curl);
        
        return json_decode($response, true);
    }
    ?>
    

    Ключевые моменты кода:

    - OnSaleOrderStatusChange — событие, которое срабатывает при смене статуса заказа.

    - Поиск сделки ведётся по полю ORIGIN_ID, которое хранит ID заказа из интернет-магазина.

    - callRest — универсальная функция для отправки REST-запросов.

    - Логирование помогает отлаживать работу обработчика в файле /bx24_sync.log.

    Шаг 4. Тестирование

    Перед внедрением в продакшен обязательно протестируйте:

    1. Создайте тестовый заказ на сайте.

    2. Проверьте, что в сделке заполнено поле ORIGIN_ID (должен быть ID заказа).

    3. Измените статус заказа на «Оплачен» через админку.

    4. Проверьте лог-файл /bx24_sync.log на наличие ошибок.

    5. Убедитесь, что в сделке обновились нужные поля.

    Возможные проблемы и их решение

    Проблема: Файл init.php не подключается

    Решение: Проверьте, что файл лежит в /local/php_interface/ или /bitrix/php_interface/

    Проблема: Сделка не найдена

    Решение: Убедитесь, что в сделке заполнено поле ORIGIN_ID — именно по нему ведётся поиск

    Проблема: Статус не меняется на «Оплачен»

    Решение: Проверьте настройки модуля PayKeeper: выберите нужный статус в поле «Статус заказа после оплаты»

    Проблема: Ошибка авторизации вебхука

    Решение: Проверьте права вебхука: нужны crm.deal.list и crm.deal.update

    Заключение

    Мы разобрали, как настроить автоматическую синхронизацию статуса оплаты из 1С-Битрикс в сделки Битрикс24. Решение использует стандартное событие OnSaleOrderStatusChange и REST API, что делает его надёжным и гибким для дальнейшей доработки.

    При правильной настройке менеджеры больше не будут тратить время на ручную проверку оплат — сделки будут обновляться автоматически в момент изменения статуса заказа.

    Назад к списку
    • Все публикации 15
      • Информационная безопасность 2
      • Новости 2
      • Полезные сервисы 2
      • Разработка Битрикс 9
    Подпишитесь на рассылку наших новостей и акций
    Подписаться
    Подписаться
    на новости и акции
    Интернет-магазин
    Каталог
    Акции
    Бренды
    Услуги
    Компания
    О компании
    Сертификаты
    Документы
    Реквизиты
    Информация
    Реквизиты
    Магазины
    Возможности
    Помощь
    Условия оплаты
    Условия доставки
    Гарантия на товар
    Вопрос-ответ
    Обзоры
    Контакты
    +7 4912 99-38-48
    +7 4912 99-38-48
    Заказать звонок
    E-mail
    mail@rbs62.ru
    Адрес
    г. Рязань. Касимовское шоссе, д 57
    Режим работы
    Пн. – Пт.: с 9:00 до 18:00
    mail@rbs62.ru
    г. Рязань. Касимовское шоссе, д 57
    © 2026 РязБизнесСофт
    Конфиденциальность
    Оферта
    Разработано в
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Галерея Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры