Как связать чат Jivo (Jivosite) с 1С: разбираем архитектуру, настройку API и создание HTTP-сервиса

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Интеграция корпоративного чата Jivo (ранее Jivosite) с системой 1С — это отличный способ автоматизировать обработку лидов. Клиент пишет на сайте, оператор отвечает, а вся история переписки, контакты и UTM-метки автоматически попадают в CRM-систему на базе 1С. Это избавляет менеджеров от ручного копирования данных и исключает потерю потенциальных клиентов.

В этой статье мы подробно разберем, как спроектировать надежную архитектуру обмена данными, какие методы API нам понадобятся, и как написать собственный HTTP-сервис в 1С для обработки вебхуков от Jivo. Мы также проанализируем основные технические сложности (например, доступность базы 1С в режиме 24/7) и выясним, как их обойти.

Архитектурные варианты интеграции Jivo и 1С

Перед тем как приступать к написанию кода, давайте рассмотрим, какими путями можно связать эти две системы. Архитектура решения зависит от требований к надежности и доступности вашей базы 1С.

Вариант 1. Прямая отправка вебхуков в 1С (HTTP-сервисы)

Это самый простой и логичный способ реализации. В Jivo настраивается событие «Завершение чата» (chat_finished). Как только диалог заканчивается, сервер Jivo отправляет POST-запрос с подробным JSON-пакетом на URL-адрес вашей базы 1С. На стороне 1С этот запрос принимает и обрабатывает специально созданный HTTPСервис.

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

Минусы: если база 1С будет временно недоступна (например, во время обновления конфигурации или из-за сбоя интернета в офисе), вебхук может потеряться. Хотя Jivo делает несколько повторных попыток отправки при ошибках сервера, при длительном отключении данные будут утеряны.

Вариант 2. Интеграция через очередь сообщений или прокси-сервер

Для высоконагруженных и критически важных систем мы рекомендуем использовать архитектуру с промежуточным буфером. В качестве буфера может выступать простой скрипт на PHP с базой данных MySQL или современный брокер сообщений (например, Yandex Message Queue или RabbitMQ).

Схема работы выглядит следующим образом: Jivo отправляет POST-запрос на веб-сервер (который работает круглосуточно с аптаймом 99.9%). Веб-сервер моментально сохраняет JSON-пакет в базу данных или очередь и возвращает Jivo успешный ответ. На стороне 1С настраивается РегламентныеЗадания, которое с определенной периодичностью (например, раз в 5 минут) обращается к этой промежуточной базе, забирает накопившиеся пакеты, разбирает их и создает документы в 1С.

Плюсы: абсолютная отказоустойчивость. Данные не потеряются, даже если 1С отключена на сутки.

Минусы: требуется разработка и поддержка промежуточного звена.

Разбираем API Jivo: какие данные мы получаем?

Для реализации интеграции нам потребуется настроить CRM-вебхуки в панели управления Jivo. Давайте проанализируем структуру JSON-пакета, который Jivo присылает при возникновении события окончания чата. Обычно этот пакет содержит следующие ключевые узлы:

  1. Информация о событии: тип события, уникальный идентификатор сессии чата.
  2. Данные клиента: имя, email, номер телефона, ID посетителя, его геолокация и IP-адрес.
  3. Данные оператора: имя сотрудника, который вел диалог в Jivo.
  4. Переписка: массив сообщений с указанием автора (клиент или оператор) и времени отправки каждого сообщения.
  5. Маркетинговые данные: UTM-метки, страница начала диалога, источник перехода.

Пошаговая настройка HTTP-сервиса в 1С

Давайте теперь детально разберем процесс создания приемника вебхуков непосредственно в конфигураторе 1С. Предположим, мы работаем в современной конфигурации на платформе 1С:Предприятие 8.3 с использованием управляемых форм.

Шаг 1. Создание HTTP-сервиса в конфигураторе

Откроем конфигуратор, найдем ветку Общие -> HTTP-сервисы и добавим новый сервис:

Внутри созданного сервиса добавим Шаблон URL:

Для этого шаблона добавим метод POST, так как именно этим методом Jivo шлет нам информацию:

Шаг 2. Разработка программного кода обработчика

Теперь перейдем в модуль созданного HTTP-сервиса и напишем логику приема и разбора JSON. Нам нужно прочитать тело запроса, преобразовать его в соответствие 1С и записать полученные данные в базу. Давайте посмотрим на пример кода:


Функция PostWebhookОбработкаМетода(Запрос)
    
    // Создаем объект ответа, по умолчанию возвращаем код 200 (ОК)
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    
    // Получаем тело POST-запроса в виде строки
    СтрокаJSON = Запрос.ПолучитьТелоКакСтроку("UTF-8");
    
    // Если тело запроса пустое, возвращаем ошибку 400 (Bad Request)
    Если ПустаяСтрока(СтрокаJSON) Тогда
        Ответ.КодСостояния = 400;
        Ответ.УстановитьТелоИзСтроки("{""status"": ""error"", ""message"": ""Empty request body""}");
        Возврат Ответ;
    КонецЕсли;
    
    // Парсим полученный JSON во временную структуру
    Чтение = Новый ЧтениеJSON;
    Попытка
        Чтение.УстановитьСтроку(СтрокаJSON);
        ДанныеЧат = ПрочитатьJSON(Чтение);
        Чтение.Закрыть();
    Исключение
        Чтение.Закрыть();
        Ответ.КодСостояния = 400;
        Ответ.УстановитьТелоИзСтроки("{""status"": ""error"", ""message"": ""Invalid JSON format""}");
        Возврат Ответ;
    КонецПопытки;
    
    // Проанализируем событие. Нас интересует окончание чата
    Если ДанныеЧат.Свойство("event_name") И ДанныеЧат.event_name = "chat_finished" Тогда
        
        // Запускаем транзакцию для безопасной записи данных в 1С
        НачатьТранзакцию();
        Попытка
            
            // Обрабатываем контактные данные клиента
            СсылкаНаКлиента = НайтиИлиСоздатьКлиентаВ1С(ДанныеЧат);
            
            // Создаем документ взаимодействия или событие
            СоздатьДокументСобытиеJivo(СсылкаНаКлиента, ДанныеЧат);
            
            ЗафиксироватьТранзакцию();
            
        Исключение
            ОтменитьТранзакцию();
            // Записываем ошибку в журнал регистрации для администратора
            ЗаписьЖурналаРегистрации("Интеграция Jivo",
                УровеньЖурналаРегистрации.Ошибка,
                ,,
                ОписаниеОшибки());
                
            Ответ.КодСостояния = 500;
            Ответ.УстановитьТелоИзСтроки("{""status"": ""error"", ""message"": ""Internal server error during DB write""}");
            Возврат Ответ;
        КонецПопытки;
        
    КонецЕсли;
    
    // Успешный ответ для сервера Jivo
    Ответ.УстановитьТелоИзСтроки("{""status"": ""success""}");
    Возврат Ответ;
    
КонецФункции

Шаг 3. Реализация функций поиска клиента и создания событий

Давайте теперь детально разберем вспомогательные функции, которые мы использовали в основном обработчике. Первая функция — НайтиИлиСоздатьКлиентаВ1С. Она анализирует переданные контакты (телефон и email), ищет совпадения в справочнике Справочники.Контрагенты (или Справочники.Партнеры), и если ничего не находит, создает новую карточку.


Функция НайтиИлиСоздатьКлиентаВ1С(ДанныеЧат)
    
    ПереданныйКлиент = ДанныеЧат.client;
    ЭлектроннаяПочта = "";
    Телефон = "";
    ИмяКлиента = "Новый клиент (Jivo)";
    
    Если ПереданныйКлиент.Свойство("email") Тогда
        ЭлектроннаяПочта = СокрЛП(ПереданныйКлиент.email);
    КонецЕсли;
    
    Если ПереданныйКлиент.Свойство("phone") Тогда
        Телефон = СокрЛП(ПереданныйКлиент.phone);
    КонецЕсли;
    
    Если ПереданныйКлиент.Свойство("client_name") И ЗначениеЗаполнено(ПереданныйКлиент.client_name) Тогда
        ИмяКлиента = СокрЛП(ПереданныйКлиент.client_name);
    КонецЕсли;
    
    // Попробуем найти клиента по email или телефону в нашей базе
    СсылкаНаКлиента = Справочники.Контрагенты.ПустаяСсылка();
    
    Если ЗначениеЗаполнено(ЭлектроннаяПочта) Или ЗначениеЗаполнено(Телефон) Тогда
        // Здесь мы пишем запрос к контактной информации контрагентов
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ РАЗРЕШЕННЫЕ
            |	Контрагенты.Ссылка КАК Ссылка
            |ИЗ
            |	Справочник.Контрагенты КАК Контрагенты
            |ГДЕ
            |	(Контрагенты.ЭлектроннаяПочта = &ЭлектроннаяПочта И &ЭлектроннаяПочта <> """")
            |	ИЛИ (Контрагенты.Телефон = &Телефон И &Телефон <> """")";
            
        Запрос.УстановитьПараметр("ЭлектроннаяПочта", ЭлектроннаяПочта);
        Запрос.УстановитьПараметр("Телефон", Телефон);
        
        РезультатЗапроса = Запрос.Выполнить();
        Если Не РезультатЗапроса.Пустой() Тогда
            Выборка = РезультатЗапроса.Выбрать();
            Выборка.Следующий();
            СсылкаНаКлиента = Выборка.Ссылка;
        КонецЕсли;
    КонецЕсли;
    
    // Если клиент не найден, создаем новую карточку
    Если СсылкаНаКлиента.Пустая() Тогда
        НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
        НовыйКонтрагент.Наименование = ИмяКлиента;
        НовыйКонтрагент.ЭлектроннаяПочта = ЭлектроннаяПочта;
        НовыйКонтрагент.Телефон = Телефон;
        НовыйКонтрагент.Комментарий = "Создан автоматически на основании чата в Jivo.";
        НовыйКонтрагент.Записать();
        СсылкаНаКлиента = НовыйКонтрагент.Ссылка;
    КонецЕсли;
    
    Возврат СсылкаНаКлиента;
    
КонецФункции

Теперь нам нужно создать документ, который зафиксирует историю нашего общения. В типовых конфигурациях 1С (таких как «1С:Управление торговлей» или «1С:CRM») для этого используется документ «Взаимодействие», «Событие» или «Электронное письмо». Давайте проанализируем пример создания документа Документы.Событие с заполнением истории сообщений:


Процедура СоздатьДокументСобытиеJivo(СсылкаНаКлиента, ДанныеЧат)
    
    НовоеСобытие = Документы.Событие.СоздатьДокумент();
    НовоеСобытие.Дата = ТекущаяДата();
    НовоеСобытие.Контрагент = СсылкаНаКлиента;
    НовоеСобытие.ВидСобытия = Перечисления.ВидыСобытий.ВходящийЗвонок; // Или создайте вид "Чат Jivo"
    НовоеСобытие.Тема = "Диалог из чата Jivo";
    
    // Собираем историю переписки в текстовое описание документа
    ТекстПереписки = "--- НАЧАЛО ДИАЛОГА ---" + Символы.ПС;
    
    Если ДанныеЧат.Свойство("messages") Тогда
        Для Каждого СтрокаСообщения Из ДанныеЧат.messages Цикл
            
            Отправитель = "Посетитель";
            Если СтрокаСообщения.Свойство("type") И СтрокаСообщения.type = "operator" Тогда
                Отправитель = "Оператор";
            КонецЕсли;
            
            ТекстСообщения = "";
            Если СтрокаСообщения.Свойство("message") Тогда
                ТекстСообщения = СтрокаСообщения.message;
            КонецЕсли;
            
            ТекстПереписки = ТекстПереписки + Отправитель + ": " + ТекстСообщения + Символы.ПС;
            
        КонецЦикла;
    КонецЕсли;
    
    ТекстПереписки = ТекстПереписки + "--- КОНЕЦ ДИАЛОГА ---" + Символы.ПС;
    
    // Добавляем маркетинговую информацию, если она есть
    Если ДанныеЧат.Свойство("page") Тогда
        ТекстПереписки = ТекстПереписки + Символы.ПС + "Страница перехода: " + ДанныеЧат.page.title;
    КонецЕсли;
    
    НовоеСобытие.Описание = ТекстПереписки;
    НовоеСобытие.Записать(РежимЗаписиДокумента.Проведение);
    
КонецПроцедуры

Как протестировать работу HTTP-сервиса?

После написания кода базы 1С необходимо опубликовать ее на веб-сервере (IIS или Apache). Убедитесь, что ваш веб-сервер имеет белый IP-адрес и доступен из внешней сети интернет. Для локального тестирования и отладки вы можете воспользоваться утилитами туннелирования (например, ngrok).

Для проверки правильности разбора JSON-пакета выполните следующие действия:

  1. Скачайте любую программу для отправки HTTP-запросов (например, Postman).
  2. Сформируйте тестовый POST-запрос на ваш опубликованный адрес: https://yourdomain.com/yourbase/hs/jivo/webhook.
  3. Вставьте тестовый JSON-шаблон в тело запроса (Body -> raw -> JSON) и отправьте его.
  4. Проверьте в конфигураторе 1С с помощью точек останова, как отрабатывает ваш HTTP-сервис, как парсится JSON и создаются ли новые элементы в справочниках и документах.

Таким образом, мы спроектировали и реализовали базовый механизм интеграции чата Jivo с информационной базой 1С. Данное решение можно легко масштабировать под любые бизнес-требования: добавлять автоматическое назначение ответственного менеджера, привязывать чаты к существующим сделкам и заказам клиентов, а также отправлять уведомления в Telegram при поступлении новых сообщений.

← На главную