Интеграция корпоративного чата Jivo (ранее Jivosite) с системой 1С — это отличный способ автоматизировать обработку лидов. Клиент пишет на сайте, оператор отвечает, а вся история переписки, контакты и UTM-метки автоматически попадают в CRM-систему на базе 1С. Это избавляет менеджеров от ручного копирования данных и исключает потерю потенциальных клиентов.
В этой статье мы подробно разберем, как спроектировать надежную архитектуру обмена данными, какие методы API нам понадобятся, и как написать собственный HTTP-сервис в 1С для обработки вебхуков от Jivo. Мы также проанализируем основные технические сложности (например, доступность базы 1С в режиме 24/7) и выясним, как их обойти.
Перед тем как приступать к написанию кода, давайте рассмотрим, какими путями можно связать эти две системы. Архитектура решения зависит от требований к надежности и доступности вашей базы 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С отключена на сутки.
Минусы: требуется разработка и поддержка промежуточного звена.
Для реализации интеграции нам потребуется настроить CRM-вебхуки в панели управления Jivo. Давайте проанализируем структуру JSON-пакета, который Jivo присылает при возникновении события окончания чата. Обычно этот пакет содержит следующие ключевые узлы:
Давайте теперь детально разберем процесс создания приемника вебхуков непосредственно в конфигураторе 1С. Предположим, мы работаем в современной конфигурации на платформе 1С:Предприятие 8.3 с использованием управляемых форм.
Шаг 1. Создание HTTP-сервиса в конфигураторе
Откроем конфигуратор, найдем ветку Общие -> HTTP-сервисы и добавим новый сервис:
ИнтеграцияJivojivoВнутри созданного сервиса добавим Шаблон URL:
WebhookReceiver/webhookДля этого шаблона добавим метод POST, так как именно этим методом Jivo шлет нам информацию:
PostWebhookPOSTPostWebhookОбработкаМетодаШаг 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;
КонецЕсли;
НовоеСобытие.Описание = ТекстПереписки;
НовоеСобытие.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
После написания кода базы 1С необходимо опубликовать ее на веб-сервере (IIS или Apache). Убедитесь, что ваш веб-сервер имеет белый IP-адрес и доступен из внешней сети интернет. Для локального тестирования и отладки вы можете воспользоваться утилитами туннелирования (например, ngrok).
Для проверки правильности разбора JSON-пакета выполните следующие действия:
https://yourdomain.com/yourbase/hs/jivo/webhook.Таким образом, мы спроектировали и реализовали базовый механизм интеграции чата Jivo с информационной базой 1С. Данное решение можно легко масштабировать под любые бизнес-требования: добавлять автоматическое назначение ответственного менеджера, привязывать чаты к существующим сделкам и заказам клиентов, а также отправлять уведомления в Telegram при поступлении новых сообщений.