Как реализовать интеграцию 1С и Asterisk для совершения звонков

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

Интеграция учетной системы 1С с IP-АТС Asterisk — это одна из наиболее востребованных задач при автоматизации бизнес-процессов. Она позволяет сократить время на набор номера, автоматически открывать карточки клиентов при входящих вызовах и сохранять историю разговоров. В данной статье мы подробно разберем, как реализовать механизм исходящего звонка (Click-to-Call) и какие архитектурные подходы существуют для полноценного взаимодействия двух систем.

Варианты взаимодействия 1С и Asterisk

Прежде чем переходить к написанию кода, проанализируем основные способы «общения» 1С с телефонной станцией. Существует несколько основных интерфейсов:

  1. ARI (Asterisk REST Interface) — современный способ управления каналами и мостами через HTTP-запросы в формате REST. Именно этот метод чаще всего выбирают для простых задач, таких как инициация звонка.
  2. AMI (Asterisk Manager Interface) — классический протокол управления через TCP-сокеты. Он отлично подходит для получения событий в реальном времени (например, чтобы 1С узнала, что клиент поднял трубку).
  3. AJAM (Asterisk JSON/JavaScript Action Manager) — надстройка над AMI, позволяющая работать с ним через HTTP-протокол.
  4. AGI (Asterisk Gateway Interface) — используется для управления логикой звонка внутри диалплана Asterisk, когда сама АТС обращается к 1С за инструкциями.

Рассмотрим подробнее реализацию наиболее популярного сценария — выполнение исходящего вызова через ARI.

Реализация исходящего звонка через ARI

Суть метода заключается в том, что 1С отправляет HTTP-запрос на сервер Asterisk. Тот, в свою очередь, сначала совершает вызов на внутренний номер сотрудника (например, на его настольный IP-телефон или софтфон), а когда сотрудник поднимает трубку, система начинает набор внешнего номера клиента.

Для реализации этого алгоритма в 1С нам потребуется объект HTTPСоединение и правильно сформированный HTTPЗапрос. Разберем пример кода:


Процедура НабратьНомер(НомерТелефона)
    
    // 1. Получаем настройки подключения (обычно хранятся в константах или справочнике)
    СерверАстериск = "192.168.1.50";
    Порт = 8088;
    КлючAPI = "my_super_secret_key_12345";
    
    // 2. Определяем внутреннюю линию текущего пользователя
    // Линия должна быть настроена в Asterisk (например, PJSIP/101)
    Линия = ПолучитьЛиниюТекущегоПользователя(); 
    
    Если ЗначениеЗаполнено(Линия) Тогда
        
        // Создаем соединение с сервером
        // Использование защищенного соединения зависит от настроек http.conf в Asterisk
        HTTPСоединение = Новый HTTPСоединение(СерверАстериск, Порт, , , , Ложь);
        
        // Формируем строку запроса для ARI
        // Параметры:
        // endpoint - внутренний номер сотрудника (технология/номер)
        // extension - номер, на который нужно позвонить
        // context - контекст в диалплане для исходящих звонков
        // callerId - идентификатор, который увидит сотрудник на экране телефона
        ПутьЗапроса = "ari/channels?context=from-internal" 
                    + "&endpoint=PJSIP%2F" + Линия 
                    + "&extension=" + НомерТелефона 
                    + "&api_key=" + КлючAPI 
                    + "&callerId=""1C_Call""";
        
        Запрос = Новый HTTPЗапрос(ПутьЗапроса);
        
        Попытка
            ОтветСервера = HTTPСоединение.ОтправитьДляОбработки(Запрос);
            
            Если ОтветСервера.КодСостояния = 200 ИЛИ ОтветСервера.КодСостояния = 201 Тогда
                Сообщить("Вызов инициирован успешно.");
            Иначе
                Сообщить("Ошибка Asterisk. Код ответа: " + ОтветСервера.КодСостояния);
                Сообщить(ОтветСервера.ПолучитьТелоКакСтроку());
            КонецЕсли;
        Исключение
            Сообщить("Не удалось связаться с сервером телефонии: " + КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
        КонецПопытки;
        
    КонецЕсли;
    
КонецПроцедуры

В данном коде важно обратить внимание на параметр endpoint. В современных версиях Asterisk чаще используется драйвер PJSIP, поэтому строка выглядит как PJSIP/101. Если ваша станция настроена на старом драйвере chan_sip, следует указывать SIP/101.

Настройка внутренних линий пользователей

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

Обычно в 1С создается либо дополнительный реквизит в справочнике Пользователи, либо отдельный регистр сведений «Настройки телефонии». Выясним, почему регистр предпочтительнее:

Функция ПолучитьЛиниюТекущегоПользователя() в нашем примере должна обращаться к этим данным и возвращать строку с номером (например, "105").

Работа через интерфейс AJAM (rawman)

Иногда возникают задачи, требующие более глубокого управления вызовами, чем позволяет стандартный ARI. В этом случае программисты используют rawman — интерфейс доступа к AMI через HTTP. Проанализируем типичный пример авторизации в этом интерфейсе:


Соединение = Новый HTTPСоединение(IP, Port, , , , 60);
Запрос = Новый HTTPЗапрос("/asterisk/rawman?action=login&username=" + User + "&secret=" + Password);
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    // Получаем Cookie для поддержки сессии в последующих запросах
    Cookie = Ответ.Заголовки.Получить("Set-Cookie");
КонецЕсли;

Важное замечание: При работе с AJAM пользователи часто сталкиваются с ошибкой «209». Выясним причину: это внутренний код Asterisk, который часто означает отсутствие активной сессии или ошибку прав доступа в файле manager.conf. Если вы получаете Internet error: Timeout exceeded, проверьте, открыт ли порт (обычно 8088) в брандмауэре сервера Asterisk и разрешены ли внешние подключения в http.conf.

Расширение возможностей: Входящие звонки и маршрутизация

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

  1. Идентификация клиента: При поступлении звонка Asterisk отправляет событие (через AMI). 1С ловит это событие, ищет номер в справочнике Контрагенты и выводит на экран «Карточку входящего звонка».
  2. Умная маршрутизация: С помощью FastAGI Asterisk может в момент звонка спросить у 1С: «За каким менеджером закреплен этот номер?». 1С проверяет данные в базе и возвращает номер сотрудника. В итоге клиент попадает сразу к своему менеджеру, минуя секретаря.
  3. Запись разговоров: После завершения вызова в 1С можно сохранять ссылку на аудиофайл. Для этого 1С считывает уникальный ID звонка (LinkedID) и сопоставляет его с файлом в хранилище Asterisk.

Технические настройки сервера Asterisk

Чтобы ваш код в 1С заработал, системный администратор должен подготовить сервер телефонии. Проанализируем ключевые настройки:

В файле http.conf необходимо включить веб-сервер:


[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088

В файле ari.conf нужно создать пользователя, под которым 1С будет выполнять запросы:


[1c_user]
type = user
read_only = no
password = my_super_secret_key_12345

Если используется AMI/AJAM, соответствующие доступы настраиваются в manager.conf. Обязательно проверьте права (read и write), чтобы разрешить выполнение команд originate (инициация вызова).

Использование готовых решений

Если задача стоит шире, чем просто кнопка «Позвонить», стоит обратить внимание на готовые панели телефонии. Рассмотрим их преимущества:

Выясним, когда стоит писать свое решение, а когда покупать готовое. Если вам нужен только Click-to-Call — достаточно нескольких процедур на 1С и настройки ARI. Если же требуется сложная аналитика, работа с очередями и автоматическое открытие форм — готовые модули сэкономят сотни часов разработки. В качестве альтернативы собственной разработке под Asterisk можно использовать готовое расширение для интеграции 1С с облачной телефонией Билайн.

Таким образом, мы разобрали основы интеграции 1С и Asterisk. Начиная с простых HTTP-запросов к интерфейсу ARI, вы можете постепенно наращивать функционал, внедряя обработку событий AMI и сложные скрипты маршрутизации AGI, создавая единую коммуникационную среду для вашего бизнеса. Если вы рассматриваете другие популярные платформы телефонии, в качестве примера реализации схожей логики подойдет модуль интеграции 1С с Comagic для определения номера и открытия карточки.

← На главную