Интеграция IP-телефонии с учетной системой — один из важнейших шагов автоматизации любого отдела продаж. В программе 1С:Управление нашей фирмой (УНФ) заявлена встроенная возможность автоматической маршрутизации входящих вызовов на ответственного сотрудника, закрепленного за клиентом. На практике же многие пользователи сталкиваются с тем, что при включении заветного флага «Маршрутизировать входящие на ответственных» звонки продолжают распределяться по стандартной схеме АТС, игнорируя настройки 1С.
В этой статье мы подробно разберем, почему данный функционал не работает «из коробки» в типовых релизах 1С:УНФ, проанализируем исходный код интеграции с Манго Офис и пошагово решим проблему с помощью доработки конфигурации и правильной настройки личного кабинета АТС.
Проведем технический аудит подсистемы телефонии в 1С:УНФ. Если мы откроем конфигуратор и обратимся к общему модулю ТелефонияСервер, то обнаружим крайне интересную картину. Экспортная процедура МаршрутизироватьВызовМанго, которая должна отвечать за передачу команды перенаправления звонка в API Манго, выглядит следующим образом:
Процедура МаршрутизироватьВызовМанго(call_id, ВнутреннийНомер) Экспорт
// Код формирования и отправки POST-запроса к Манго АТС
КонецПроцедуры
Однако эта процедура находится внутри жестко ограниченной области #Область УстаревшиеПроцедуры. Более того, глобальный поиск по конфигурации показывает, что в типовом коде нет ни одного вызова этой процедуры! Разработчики фирмы 1С при переносе и упрощении кода (который исторически базируется на решениях от «Рарус») фактически вырезали вызов маршрутизации из обработчиков входящих вебхуков, оставив лишь пустую настройку в интерфейсе пользователя.
Дополнительно в коде присутствуют ошибки сериализации JSON-данных при попытке ручного вызова этой процедуры, а также баги в сопоставлении идентификаторов записи разговоров (например, путаница между recording_id и call_id в функции СсылкаНаЗаписьРазговораMangoOffice общего модуля ТелефонияПереопределяемый).
Таким образом, чтобы заставить маршрутизацию работать, нам необходимо решить две задачи: программную (вернуть отправку API-команд в 1С) и организационно-техническую (настроить тайминги в АТС Манго).
---
Прежде чем приступать к написанию кода в 1С, необходимо устранить фундаментальную проблему рассинхронизации АТС и веб-сервера. Проанализируем стандартное поведение виртуальной АТС при поступлении звонка:
POST /commands/route. В среднем этот процесс занимает от 2 до 5 секунд.К моменту, когда 1С отправляет команду перенаправления вызова, АТС Манго уже направила звонок первому свободному оператору, и перехватить его становится невозможно. Чтобы решить эту проблему, создадим временной буфер.
Выполним следующие настройки в личном кабинете Манго Офис:
Благодаря этой настройке у системы 1С появится окно в 10–15 секунд, в течение которого АТС будет проигрывать клиенту музыку и ожидать внешних управляющих команд от нашей учетной системы.
---
Для того чтобы вернуть в программу возможность управления звонками, мы не будем изменять типовую конфигурацию, а создадим чистое и безопасное расширение. Разберем алгоритм его работы.
Нам необходимо перехватить обработку входящего вебхука от Манго Офис в модуле HTTP-сервиса телефонии. При получении события старта звонка (обычно это статус Approve или аналогичный в зависимости от настроек интеграции) расширение должно выполнить поиск клиента.
Рассмотрим пример кода, который необходимо поместить в расширение для поиска ответственного и отправки команды маршрутизации:
&НаСервере
Функция ОпределитьОтветственногоПоНомеру(НомерТелефона)
ОчищенныйНомер = УправлятьТелефонией.ОчиститьНомерТелефона(НомерТелефона);
// Ищем контрагента или лид в базе данных
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| Контрагенты.Ответственный.ФизическоеЛицо.КодКомпьютернойТелефонии КАК ВнутреннийНомер
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Телефон ОКОЛО &НомерТелефона";
Запрос.УстановитьПараметр("НомерТелефона", ОчищенныйНомер);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.ВнутреннийНомер;
КонецЕсли;
Возврат Неопределено;
КонецФункции
После определения внутреннего номера сотрудника необходимо сформировать правильный POST-запрос к API Манго. Нам понадобится использовать URL вида https://telephony.mango-office.ru/v1/commands/route. Обратите внимание, что для успешной авторизации запроса вам понадобятся уникальный ключ (API Key) и подпись (Sign), генерируемая по алгоритму SHA-256. Разберем пример процедуры отправки команды:
&НаСервере
Процедура ОтправитьКомандуМаршрутизацииВМанго(ИдентификаторВызова, ВнутреннийНомер)
Если ПустаяСтрока(ВнутреннийНомер) Тогда
Возврат;
КонецЕсли;
АдресРесурса = "/v1/commands/route";
ПараметрыСоединения = ПолучитьПараметрыПодключенияМанго(); // получаем API Key и Секретный ключ
// Формируем тело запроса согласно требованиям Mango API
ТелоЗапроса = Новый Структура;
ТелоЗапроса.Вставить("command_id", Строка(Новый УникальныйИдентификатор));
ТелоЗапроса.Вставить("call_id", ИдентификаторВызова);
Получатель = Новый Структура;
Получатель.Вставить("extension", ВнутреннийНомер);
ТелоЗапроса.Вставить("to", Получатель);
// Преобразуем тело запроса в JSON без лишних пробелов и переносов
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТелоЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Вычисляем подпись SHA-256 для авторизации запроса
СтрокаДляПодписи = ПараметрыСоединения.ApiKey + СтрокаJSON + ПараметрыСоединения.Salt;
Подпись = ПолучитьХэшSHA256(СтрокаДляПодписи);
// Выполняем HTTP-запрос
НТТРСоединение = Новый HTTPСоединение("telephony.mango-office.ru", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
НТТРЗапрос = Новый HTTPЗапрос(АдресРесурса);
НТТРЗапрос.Заголовки.Вставить("Content-Type", "application/json");
// Передаем параметры авторизации в теле или в URL в зависимости от настроек схемы
ФормаОтправки = "v_key=" + ПараметрыСоединения.ApiKey + "&sign=" + Подпись + "&json=" + СтрокаJSON;
НТТРЗапрос.УстановитьТелоИзСтроки(ФормаОтправки, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Попытка
Ответ = НТТРСоединение.ОтправитьДляОбработки(НТТРЗапрос);
Если Ответ.КодСостояния <> 200 Тогда
ЗаписьЖурналаРегистрации("Телефония.Манго", УровеньЖурналаРегистрации.Предупреждение,,,,,
"Ошибка маршрутизации. Код ответа: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Телефония.Манго", УровеньЖурналаРегистрации.Ошибка,,,,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Данный код полностью компенсирует «устаревшие» участки кода типовой конфигурации УНФ и отправляет актуальную структуру JSON в Mango API без каких-либо ошибок сериализации.
---
Если в штате вашей компании нет программиста 1С для поддержки кастомного расширения, либо если вы не хотите усложнять процесс обновления конфигурации, проанализируем альтернативные способы решения проблемы:
Таким образом, мы детально разобрали особенности интеграции телефонии в 1С:УНФ, выяснили причину неработоспособности стандартного флага маршрутизации звонков на ответственных и научились решать эту проблему как программным путем, так и с помощью изменения схемы распределения звонков в АТС.