Как настроить простой звонок (Click-to-Call) из 1С через Asterisk и восстановить доступ к Web-интерфейсу FreePBX после настройки?

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

Рассмотрим распространенную задачу интеграции 1С:CRM (или любой другой конфигурации на платформе 1С:Предприятие 8) с IP-телефонией на базе Asterisk (FreePBX). Часто пользователям не требуются громоздкие решения с установкой софтфонов на каждый компьютер. Достаточно простой функции: менеджер нажимает на номер телефона в карточке клиента, и его настольный аппарат начинает звонить, соединяя с клиентом.

Проанализируем три основных подхода к решению этой задачи, обсудим примеры программного кода и разберем критическую ошибку настройки, из-за которой может пропасть доступ к администрированию АТС.

Вариант 1: Использование Asterisk REST Interface (ARI)

Это современный и наиболее предпочтительный метод для платформы 1С, так как он базируется на HTTP-запросах. 1С отлично умеет работать с HTTP-сервисами, и для этого не требуются внешние компоненты или сложные библиотеки.

Разберем пример реализации, предложенный в обсуждении. Суть метода заключается в отправке POST-запроса на сервер Asterisk для создания нового канала связи.

Для реализации нам понадобятся следующие данные:

  1. IP-адрес сервера Asterisk.
  2. Порт ARI (обычно 8088).
  3. API Key или логин/пароль для авторизации.
  4. Внутренний номер сотрудника (Endpoint).
  5. Номер телефона клиента.

Посмотрим на пример кода на встроенном языке 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).

Вариант 2: Call Files (Файловый метод)

Если по каким-то причинам использование HTTP-запросов невозможно (например, старая версия платформы или запрет администратора на включение ARI), рассмотрим классический метод через .call файлы.

Механизм работы следующий:

  1. 1С формирует текстовый файл определенной структуры.
  2. Файл помещается в специальную директорию на сервере Asterisk: /var/spool/asterisk/outgoing/.
  3. Asterisk мгновенно подхватывает файл, удаляет его и инициирует звонок согласно инструкциям внутри.

В 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 может попытаться прочитать его до того, как запись завершится, что приведет к ошибке.

Вариант 3: Asterisk Manager Interface (AMI) и решение проблем с Web-интерфейсом

Третий способ — подключение через 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-адрес подсети, мы запретили локальные подключения. В результате веб-морда потеряла связь с ядром телефонии.

Как правильно настроить manager.conf

Чтобы и 1С работала, и Web-интерфейс не ломался, не редактируйте секцию [general] или пользователя admin, который используется системой. Создайте отдельного пользователя для 1С.

Рассмотрим правильный алгоритм действий:

  1. Верните настройки permit для локального пользователя в исходное состояние (разрешите 127.0.0.1).
  2. Откройте файл /etc/asterisk/manager_custom.conf (или добавьте в конец manager.conf).
  3. Добавьте нового пользователя специально для интеграции:

[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С:

← На главную