Как настроить маршрутизацию звонков на ответственного менеджера в 1С:УНФ и Манго Офис?

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

Интеграция IP-телефонии с учетной системой — один из важнейших шагов автоматизации любого отдела продаж. В программе 1С:Управление нашей фирмой (УНФ) заявлена встроенная возможность автоматической маршрутизации входящих вызовов на ответственного сотрудника, закрепленного за клиентом. На практике же многие пользователи сталкиваются с тем, что при включении заветного флага «Маршрутизировать входящие на ответственных» звонки продолжают распределяться по стандартной схеме АТС, игнорируя настройки 1С.

В этой статье мы подробно разберем, почему данный функционал не работает «из коробки» в типовых релизах 1С:УНФ, проанализируем исходный код интеграции с Манго Офис и пошагово решим проблему с помощью доработки конфигурации и правильной настройки личного кабинета АТС.

Выясняем причину: почему типовой механизм не работает

Проведем технический аудит подсистемы телефонии в 1С:УНФ. Если мы откроем конфигуратор и обратимся к общему модулю ТелефонияСервер, то обнаружим крайне интересную картину. Экспортная процедура МаршрутизироватьВызовМанго, которая должна отвечать за передачу команды перенаправления звонка в API Манго, выглядит следующим образом:


Процедура МаршрутизироватьВызовМанго(call_id, ВнутреннийНомер) Экспорт
    // Код формирования и отправки POST-запроса к Манго АТС
КонецПроцедуры

Однако эта процедура находится внутри жестко ограниченной области #Область УстаревшиеПроцедуры. Более того, глобальный поиск по конфигурации показывает, что в типовом коде нет ни одного вызова этой процедуры! Разработчики фирмы 1С при переносе и упрощении кода (который исторически базируется на решениях от «Рарус») фактически вырезали вызов маршрутизации из обработчиков входящих вебхуков, оставив лишь пустую настройку в интерфейсе пользователя.

Дополнительно в коде присутствуют ошибки сериализации JSON-данных при попытке ручного вызова этой процедуры, а также баги в сопоставлении идентификаторов записи разговоров (например, путаница между recording_id и call_id в функции СсылкаНаЗаписьРазговораMangoOffice общего модуля ТелефонияПереопределяемый).

Таким образом, чтобы заставить маршрутизацию работать, нам необходимо решить две задачи: программную (вернуть отправку API-команд в 1С) и организационно-техническую (настроить тайминги в АТС Манго).

---

Шаг 1. Настройка временных задержек в личном кабинете «Манго Офис»

Прежде чем приступать к написанию кода в 1С, необходимо устранить фундаментальную проблему рассинхронизации АТС и веб-сервера. Проанализируем стандартное поведение виртуальной АТС при поступлении звонка:

  1. Клиент совершает вызов на многоканальный номер компании.
  2. АТС Манго моментально (менее чем за 1 секунду) принимает решение, на кого направить вызов согласно стандартной схеме распределения.
  3. Одновременно АТС отправляет вебхук о начале звонка на ваш веб-сервер IIS или Apache, где опубликована база 1С.
  4. База 1С тратит время на получение вебхука, авторизацию пользователя, поиск контрагента по номеру телефона, определение ответственного и отправку ответного HTTP-запроса с командой POST /commands/route. В среднем этот процесс занимает от 2 до 5 секунд.

К моменту, когда 1С отправляет команду перенаправления вызова, АТС Манго уже направила звонок первому свободному оператору, и перехватить его становится невозможно. Чтобы решить эту проблему, создадим временной буфер.

Выполним следующие настройки в личном кабинете Манго Офис:

  1. Перейдем в раздел настроек схемы распределения входящих вызовов.
  2. Перед блоком непосредственного распределения вызова на группу менеджеров добавим элемент «Голосовое приветствие» (IVR) или автоинформатор удержания вызова.
  3. Загрузим аудиофайл с тишиной или приветственной музыкой длительностью не менее 10–15 секунд.
  4. Критически важно: в параметрах этого приветствия установим флаг «Ожидать окончания» = Да.

Благодаря этой настройке у системы 1С появится окно в 10–15 секунд, в течение которого АТС будет проигрывать клиенту музыку и ожидать внешних управляющих команд от нашей учетной системы.

---

Шаг 2. Разработка расширения для 1С:УНФ

Для того чтобы вернуть в программу возможность управления звонками, мы не будем изменять типовую конфигурацию, а создадим чистое и безопасное расширение. Разберем алгоритм его работы.

Нам необходимо перехватить обработку входящего вебхука от Манго Офис в модуле 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 без каких-либо ошибок сериализации.

---

Шаг 3. Альтернативные варианты интеграции

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

  1. Использование No-code коннекторов. Вы можете интегрировать 1С и Манго через облачные сервисы-прослойки (такие как Albato или Api Monster). Эти системы перехватывают вебхук о звонке, сами делают быстрый запрос по API в вашу 1С для поиска ответственного и мгновенно возвращают команду распределения вызова обратно в АТС. Плюс такого решения — высокая скорость настройки. Минус — зависимость от работоспособности сторонних облачных сервисов и ежемесячная абонентская плата.
  2. Переход на профессиональные панели телефонии. Существуют готовые программные продукты сторонних разработчиков (например, «Панель телефонии МИКО» или полнофункциональные решения от компании «Рарус»). Они встраиваются в вашу 1С:УНФ и содержат готовые, постоянно обновляемые модули интеграции со всеми популярными АТС, включая Манго Офис. Все функции маршрутизации, записи звонков и открытия карточек клиентов в таких панелях работают стабильно и поддерживаются разработчиками в актуальном состоянии под новые релизы платформы 1С.

Таким образом, мы детально разобрали особенности интеграции телефонии в 1С:УНФ, выяснили причину неработоспособности стандартного флага маршрутизации звонков на ответственных и научились решать эту проблему как программным путем, так и с помощью изменения схемы распределения звонков в АТС.

← На главную