Интеграция офисной телефонии с CRM-системами на базе 1С давно стала стандартом для эффективного бизнеса. Однако классические схемы интеграции строятся вокруг стационарных или облачных АТС (например, Asterisk, Mango Office, МегаФон и др.), работающих по протоколу SIP. Но как быть в ситуации, когда менеджеры работают «в полях», совершают и принимают звонки на свои личные или рабочие мобильные номера напрямую через GSM-сеть, минуя офисную АТС? Нам необходим механизм, который позволит зафиксировать сам факт звонка, оперативно передать эту информацию в 1С и открыть карточку клиента на экране компьютера менеджера.
В этой статье мы подробно проанализируем существующие подходы к решению этой задачи: от готовых коммерческих сервисов и мобильной платформы 1С до технологии FMC и создания собственного Android-приложения.
Вопреки распространенному мнению, специализированный софт для интеграции мобильных телефонов с 1С существует и успешно применяется. Подобные системы состоят из двух частей: мобильного приложения-клиента на смартфоне сотрудника и модуля интеграции (обработки) на стороне 1С.
Давайте рассмотрим наиболее популярные и проверенные решения:
Важное ограничение: Все подобные приложения стабильно работают исключительно на операционной системе Android. Из-за жесткой политики безопасности Apple и закрытости операционной системы iOS, перехватывать входящие и исходящие GSM-звонки сторонними программами в фоновом режиме на iPhone технически невозможно. Если ваши сотрудники используют iPhone, этот способ вам не подойдет.
Если вы используете современные типовые конфигурации, например, 1С:Управление нашей фирмой (1С:УНФ), то нужный функционал уже заложен разработчиками фирмы «1С» непосредственно в платформу.
Давайте разберем по шагам, как это работает:
Событие с типом Телефонный звонок.Если вам требуется абсолютная надежность, запись всех разговоров, поддержка абсолютно любых мобильных телефонов (включая iOS-устройства и даже простые кнопочные аппараты) без установки каких-либо программ на телефон и без использования мобильного интернета, вашим выбором должна стать технология FMC.
Проанализируем суть этой технологии:
Операторы сотовой связи («МегаФон», «Билайн», «МТС», «Теле2») предоставляют услугу интеграции мобильных номеров с виртуальными АТС. Сотрудникам выдаются специальные корпоративные FMC SIM-карты.
Когда сотрудник совершает вызов или принимает звонок через обычную сотовую сеть GSM, этот звонок физически маршрутизируется не напрямую сотовым оператором, а сначала направляется в вашу корпоративную виртуальную или локальную АТС (например, Asterisk) как вызов с внутреннего добавочного номера.
Поскольку звонок в конечном итоге проходит через АТС, стандартные панели телефонии для 1С (такие как решения от МИКО, Itgrix или встроенные софтфоны) перехватывают это событие точно так же, как если бы менеджер сидел в офисе за SIP-телефоном. При этом у сотрудника на мобильном телефоне не расходуется интернет-трафик, а качество связи остается на уровне стандарта GSM.
Если вы хотите полностью контролировать процесс и не платить за сторонние сервисы, мы можем реализовать собственную систему перехвата. Задача делится на две части: разработка легковесного приложения под Android и создание принимающего HTTP-сервиса на стороне 1С.
Рассмотрим архитектуру решения подробнее:
Шаг 1. Мобильное приложение на Android.
Нам необходимо написать фоновую службу (Service), которая регистрирует системный приемник BroadcastReceiver, реагирующий на изменение состояния телефона android.intent.action.PHONE_STATE. Код приложения должен отслеживать три состояния:
RINGING — поступает входящий вызов (передается номер звонящего).OFFHOOK — трубка поднята, начался разговор.IDLE — разговор завершен (трубка повешена).При переходе телефона в любое из этих состояний наше Android-приложение отправляет асинхронный HTTP POST запрос на заранее подготовленный веб-адрес нашей базы 1С.
Шаг 2. Разработка HTTP-сервиса в 1С.
В конфигураторе 1С создадим новый объект HTTPСервис (например, с именем ПерехватЗвонков) и шаблоном URL /event.
Давайте посмотрим на пример реализации метода POST для обработки входящих данных от нашего мобильного приложения:
Функция ИмяШаблона_POST(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Получаем JSON-данные из тела запроса
СтрокаДанных = Запрос.ПолучитьТелоКакСтроку("UTF-8");
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаДанных);
ДанныеЗвонка = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Извлекаем параметры, присланные мобильным телефоном
НомерТелефона = ДанныеЗвонка.Номер;
СтатусТелефона = ДанныеЗвонка.Статус; // Напр: "RINGING", "OFFHOOK", "IDLE"
Идентификатор = ДанныеЗвонка.СотрудникИД;
// Выполняем поиск контрагента в базе данных по номеру телефона
СсылкаНаКлиента = НайтиКлиентаПоНомеру(НомерТелефона);
// Если звонок только поступает (RINGING) — выводим оповещение на экран
Если СтатусТелефона = "RINGING" Тогда
ОповеститьПользователяОЗвонке(Идентификатор, СсылкаНаКлиента, НомерТелефона);
ИначеЕсли СтатусТелефона = "IDLE" Тогда
// Если разговор завершен — регистрируем событие в базе данных
ЗафиксироватьЗвонокВИстории(Идентификатор, СсылкаНаКлиента, НомерТелефона);
КонецЕсли;
Ответ.УстановитьТелоИзСтроки("{""result"": ""success""}");
Возврат Ответ;
КонецФункции
Давайте проанализируем вспомогательную функцию поиска контрагента по номеру телефона. Чтобы поиск работал быстро, рекомендуется использовать индексированные поля или искать по регистру сведений, содержащему контактную информацию:
Функция НайтиКлиентаПоНомеру(Знач ИсходныйНомер) Экспорт
// Очищаем номер от лишних символов (скобки, дефисы, пробелы)
ОчищенныйНомер = ОчиститьНомерТелефона(ИсходныйНомер);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| ПартнерыКонтакты.Ссылка КАК Клиент
|ИЗ
| Справочник.Партнеры КАК ПартнерыКонтакты
|ГДЕ
| ПартнерыКонтакты.ВключатьВПоиск
| И ПартнерыКонтакты.НомерТелефонаПоиск ПОДОБНО &Номер";
// Ищем совпадение по последним 10 цифрам номера телефона
Запрос.УстановитьПараметр("Номер", "%" + Прав(ОчищенныйНомер, 10));
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.Клиент;
КонецЕсли;
Возврат Справочники.Партнеры.ПустаяСсылка();
КонецФункции
Для мгновенного вывода карточки на экран компьютера конкретного пользователя мы рекомендуем задействовать механизм Системы взаимодействия 1С. Через функцию СистемаВзаимодействия.ПолучитьОбсуждение() вы можете отправить невидимое сообщение в специальный канал, которое будет перехвачено на клиенте у конкретного пользователя и откроет форму звонка.
Сложности при самостоятельной разработке под Android: Основная проблема, с которой вы столкнетесь — жесткое энергосбережение в современных версиях ОС Android (начиная с Android 8.0 и выше). Система переводит фоновые приложения в режим глубокого сна (Doze Mode). Чтобы ваше приложение не "засыпало" и не пропускало звонки, вам потребуется настроить его запуск в качестве Foreground Service (службы переднего плана с постоянным уведомлением в шторке телефона) и вручную добавить его в исключения оптимизации батареи на каждом смартфоне сотрудника.
Выбор конкретного решения зависит от вашего бюджета, инфраструктуры и используемых сотрудниками мобильных устройств:
HTTPСервис.