Интеграция 1С с телефонией — одна из самых востребованных задач автоматизации бизнеса. Большинство готовых коммерческих решений на рынке требуют регулярной абонентской платы или покупки дорогостоящих лицензий на каждое рабочее место. Однако, если перед вами стоит задача реализовать простейший сценарий Click-to-call (нажатие кнопки в 1С для автоматического набора номера на софтфоне), это можно сделать абсолютно бесплатно и без лишних костылей.
В этой статье мы подробно разберем, как связать базу данных 1С, софтфон на компьютере пользователя и сервер телефонии Asterisk. Мы проанализируем различные методы интеграции — от простого запуска внешнего приложения до отправки прямых HTTP-запросов к Asterisk для работы в веб-клиенте 1С.
В оригинальной теме на форуме упоминается устаревшая программа 3CXPhone 6. Сегодня этот софтфон считается устаревшим, имеет проблемы с совместимостью на современных ОС Windows и не поддерживается разработчиками. В качестве современной, легкой и полностью бесплатной альтернативы с открытым исходным кодом мы рекомендуем использовать софтфон MicroSIP.
Программа MicroSIP поддерживает управление через параметры командной строки прямо из коробки, что позволяет без труда инициировать вызов из кода 1С. Рассмотрим, как это реализовать.
Для начала разберем простую функцию очистки телефонного номера от лишних символов (пробелов, скобок, дефисов), так как софтфоны требуют передачи чистого цифрового значения:
&НаКлиенте
Функция ОчиститьНомерТелефона(Знач ИсходныйНомер)
Результат = "";
Для Индекс = 1 По СтрДлина(ИсходныйНомер) Цикл
Символ = Сред(ИсходныйНомер, Индекс, 1);
Если Найти("0123456789+", Символ) > 0 Тогда
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
EndФункция
Теперь напишем процедуру, которая будет запускать установленный на компьютере софтфон MicroSIP и передавать ему номер для набора. Для запуска внешнего приложения в платформе 1С используется метод ЗапуститьПриложение.
&НаКлиенте
Процедура ВыполнитьЗвонокMicroSIP(НомерТелефона)
ОчищенныйНомер = ОчиститьНомерТелефона(НомерТелефона);
Если ПустаяСтрока(ОчищенныйНомер) Тогда
Предупреждение("Номер телефона пустой или содержит некорректные символы!");
Возврат;
КонецЕсли;
// Укажите корректный путь к установленному софтфону MicroSIP
ПутьКПрограмме = "C:\Program Files\MicroSIP\microsip.exe";
ПараметрыЗапуска = ОчищенныйНомер;
Попытка
ЗапуститьПриложение(ПутьКПрограмме + " " + ПараметрыЗапуска);
Исключение
ИнформацияОБОшибке = ИнформацияОбОшибке();
Предупреждение("Не удалось запустить софтфон. Проверьте правильность пути к файлу microsip.exe. Ошибка: " + КраткоеПредставлениеОшибки(ИнформацияОБОшибке));
КонецПопытки;
КонецПроцедуры
Этот способ идеально подходит, если пользователи работают в тонком или толстом клиенте 1С под управлением ОС Windows.
Чтобы не прописывать жесткие пути к исполняемому файлу софтфона на каждом компьютере пользователя, мы можем использовать механизм ассоциации протоколов в операционной системе Windows. При установке софтфоны (включая MicroSIP и 3CX) предлагают зарегистрировать себя в качестве стандартных обработчиков для протоколов tel: и sip:.
Если софтфон зарегистрирован в системе по умолчанию, процедура звонка в 1С упрощается до одной строки. Выясним, как выглядит этот код:
&НаКлиенте
Процедура ВыполнитьЗвонокПоПротоколу(НомерТелефона)
ОчищенныйНомер = ОчиститьНомерТелефона(НомерТелефона);
Если ПустаяСтрока(ОчищенныйНомер) Тогда
Возврат;
КонецЕсли;
// Формируем URI-ссылку, которую Windows перенаправит в софтфон по умолчанию
СсылкаПротокола = "tel:" + ОчищенныйНомер;
Попытка
ЗапуститьПриложение(СсылкаПротокола);
Исключение
Предупреждение("Не удалось инициировать звонок. Убедитесь, что в системе установлен обработчик протокола tel:");
КонецПопытки;
КонецПроцедуры
Использование этого подхода позволяет сделать конфигурацию 1С более гибкой, так как пользователям на разных рабочих местах можно устанавливать любые софтфоны, поддерживающие протокол tel:, без изменения программного кода в 1С.
Если пользователи работают в 1С через веб-браузер (веб-клиент), использовать запуск локальных исполняемых файлов (метод ЗапуститьПриложение) напрямую не получится из-за строгих ограничений безопасности современных браузеров. Для обхода этого ограничения пришлось бы устанавливать расширение работы с файловой системой 1С, что усложняет администрирование.
В этой ситуации лучшим решением будет перенос логики вызова на сторону сервера телефонии Asterisk с помощью механизма AJAM (Asynchronous Javascript Asterisk Manager) или классического AMI через HTTP. Схема звонка выглядит следующим образом:
Originate: сначала он отправляет вызов на внутренний SIP-номер менеджера (на его софтфон).Разберем, как настроить Asterisk для приема HTTP-запросов. В файле конфигурации http.conf на сервере Asterisk необходимо включить встроенный веб-сервер:
http.conf:
[general]
enabled=yes
bindaddr=0.0.0.0
port=8088
enablestatic=yes
Затем в файле manager.conf создаем учетную запись для интеграции из 1С с правами на генерацию вызовов:
manager.conf:
[general]
enabled = yes
webenabled = yes
[1c_user]
secret = secure_password_1c
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user,originate
После настройки Asterisk напишем функцию на сервере 1С, которая будет отправлять HTTP-запрос для совершения звонка:
&НаСервере
Функция ВыполнитьЗвонокЧерезAsteriskAJAM(ВнутреннийНомерМенеджера, НомерКлиента) Экспорт
ИмяСервера = "192.168.1.100"; // IP-адрес вашего Asterisk
ПортСервера = 8088; // Порт из http.conf
// Формируем параметры запроса авторизации и команды Originate
// Используем упрощенный интерфейс RawMan в Asterisk
ПараметрыЗапроса = "action=originate"
+ "&username=1c_user"
+ "&secret=secure_password_1c"
+ "&channel=SIP/" + ВнутреннийНомерМенеджера
+ "&exten=" + ОчиститьНомерТелефона(НомерКлиента)
+ "&context=from-internal" // Контекст для исходящих звонков в Asterisk
+ "&priority=1"
+ "&callerid=" + ВнутреннийНомерМенеджера;
HTTPСоединение = Новый HTTPСоединение(ИмяСервера, ПортСервера);
HTTPЗапрос = Новый HTTPЗапрос("/rawman?" + ПараметрыЗапроса);
Попытка
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Возврат Истина;
Иначе
ЗаписьЖурналаРегистрации("Телефония", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка Asterisk AJAM. Код ответа: " + HTTPОтвет.КодСостояния + ". Ответ: " + HTTPОтвет.ПолучитьТелоКакСтроку());
Возврат Ложь;
КонецЕсли;
Исключение
ИнформацияОБОшибке = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("Телефония", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось выполнить HTTP запрос к Asterisk. Ошибка: " + ПодробноеПредставлениеОшибки(ИнформацияОБОшибке));
Возврат Ложь;
КонецПопытки;
КонецФункции
Такой подход полностью независим от операционной системы и типа клиента 1С, позволяя совершать вызовы даже с мобильных устройств или из веб-браузеров на Linux.
Если вам требуется не просто совершать исходящие звонки по нажатию кнопки, но и отслеживать входящие вызовы в режиме реального времени (например, для автоматического открытия карточки клиента при звонке), стандартного HTTP-запроса будет недостаточно. В этом случае требуется постоянное асинхронное TCP-соединение с Asterisk AMI.
Выясним, какие бесплатные инструменты можно использовать для решения этой задачи:
Проанализировав все рассмотренные варианты интеграции, мы можем составить простую схему выбора оптимального решения для вашей компании: