Рассмотрим распространенную задачу интеграции 1С:CRM (или любой другой конфигурации на платформе 1С:Предприятие 8) с IP-телефонией на базе Asterisk (FreePBX). Часто пользователям не требуются громоздкие решения с установкой софтфонов на каждый компьютер. Достаточно простой функции: менеджер нажимает на номер телефона в карточке клиента, и его настольный аппарат начинает звонить, соединяя с клиентом.
Проанализируем три основных подхода к решению этой задачи, обсудим примеры программного кода и разберем критическую ошибку настройки, из-за которой может пропасть доступ к администрированию АТС.
Это современный и наиболее предпочтительный метод для платформы 1С, так как он базируется на HTTP-запросах. 1С отлично умеет работать с HTTP-сервисами, и для этого не требуются внешние компоненты или сложные библиотеки.
Разберем пример реализации, предложенный в обсуждении. Суть метода заключается в отправке POST-запроса на сервер Asterisk для создания нового канала связи.
Для реализации нам понадобятся следующие данные:
Посмотрим на пример кода на встроенном языке 1С:
// Создаем HTTP соединение с сервером телефонии
// IP адрес и порт должны соответствовать вашим настройкам ari.conf
http = Новый HTTPСоединение("192.168.0.128", 8088, , , , Ложь);
// Формируем строку запроса
// context=from-internal — контекст, в котором будет совершаться вызов (важно для прав доступа)
// endpoint=PJSIP/ — технология и номер линии инициатора (наш телефон)
// extension= — номер, куда звоним
// callerId= — подпись звонка
СтрокаЗапроса = "ari/channels?context=from-internal&endpoint=PJSIP/" + Линия + "&extension=" + НомерТелефона + "&api_key=12345&callerId=""1C""";
// Формируем POST запрос
httpPost = Новый HTTPЗапрос(СтрокаЗапроса);
// Отправляем запрос и получаем ответ
Попытка
ОтветСервера = http.ОтправитьДляОбработки(httpPost);
Если ОтветСервера.КодСостояния <> 200 Тогда
Сообщить("Ошибка при вызове: " + ОтветСервера.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Не удалось соединиться с сервером телефонии: " + ОписаниеОшибки());
КонецПопытки;
Важное замечание по безопасности: Как справедливо заметили участники обсуждения, протокол ARI позволяет управлять станцией. Если ваш сервер телефонии смотрит в интернет, обязательно используйте HTTPS, сложные пароли и ограничение доступа по IP-адресам в файерволе (iptables/fail2ban).
Если по каким-то причинам использование HTTP-запросов невозможно (например, старая версия платформы или запрет администратора на включение ARI), рассмотрим классический метод через .call файлы.
Механизм работы следующий:
/var/spool/asterisk/outgoing/.В 1С это можно реализовать двумя путями: либо напрямую подключаться по FTP/SSH и класть файл, либо дергать промежуточный скрипт (например, на PHP), который создаст этот файл локально на сервере телефонии.
Пример структуры .call файла, который должен сформировать скрипт:
Channel: PJSIP/101 ; Внутренний номер менеджера
Callerid: 101 ; Что будет написано на экране
MaxRetries: 2 ; Количество попыток дозвона
RetryTime: 60 ; Время между попытками
WaitTime: 30 ; Сколько ждать поднятия трубки
Context: from-internal ; Контекст для исходящего
Extension: 89001234567 ; Номер клиента
Priority: 1
Нюанс реализации: При создании таких файлов критически важно сначала создать файл во временной директории (например, /tmp/), а затем переместить его командой mv в папку outgoing. Если записывать файл сразу в целевую папку, Asterisk может попытаться прочитать его до того, как запись завершится, что приведет к ошибке.
Третий способ — подключение через TCP-сокет к порту 5038 (AMI). Это позволяет не только звонить, но и получать события о входящих звонках. Однако именно при настройке этого метода часто возникает проблема, с которой столкнулся автор темы.
Проанализируем ситуацию: пользователь настроил доступ для 1С в файле /etc/asterisk/manager.conf, изменив строку permit.
Было:
permit=127.0.0.1/255.255.255.0
Стало:
permit=192.168.1.0/255.255.255.0
Последствие: 1С начала звонить, но Web-интерфейс FreePBX перестал работать, выдавая ошибку соединения ("Unable to connect to Asterisk Manager").
Причина: Веб-интерфейс FreePBX сам является клиентом AMI. Для отображения статусов, управления звонками и применения настроек он подключается к Asterisk по адресу 127.0.0.1 (localhost). Изменив permit на внешний IP-адрес подсети, мы запретили локальные подключения. В результате веб-морда потеряла связь с ядром телефонии.
Чтобы и 1С работала, и Web-интерфейс не ломался, не редактируйте секцию [general] или пользователя admin, который используется системой. Создайте отдельного пользователя для 1С.
Рассмотрим правильный алгоритм действий:
permit для локального пользователя в исходное состояние (разрешите 127.0.0.1)./etc/asterisk/manager_custom.conf (или добавьте в конец manager.conf).
[1c_user]
secret = ваш_сложный_пароль
deny = 0.0.0.0/0.0.0.0
permit = 192.168.1.0/255.255.255.0 ; Разрешаем доступ только из подсети 1С
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user
После сохранения изменений не забудьте перезагрузить настройки Asterisk командой в консоли сервера: asterisk -rx "manager reload".
Для реализации простого функционала "нажал — позвонил" в 1С:
127.0.0.1, иначе потеряете управление через FreePBX. Всегда создавайте отдельных пользователей под задачи интеграции.