Интеграция 1С с телефонией на базе Asterisk является одной из самых востребованных задач при автоматизации отделов продаж и служб поддержки. Рассмотрим, как реализовать полноценное взаимодействие между этими системами, используя внешнюю компоненту, работающую по технологии Native API. Мы разберем этапы подключения, инициации звонков, обработки входящих событий и работы с записями разговоров.
Для взаимодействия 1С с Asterisk чаще всего используется интерфейс AMI (Asterisk Manager Interface). Чтобы 1С могла «слушать» события сервера в реальном времени, рекомендуется использовать внешнюю компоненту BROM-Asterisk-Native (или аналогичную InnovaIT_Asterisk_Native). Эта компонента позволяет устанавливать TCP-соединение с сервером Asterisk и обмениваться командами в асинхронном режиме.
Прежде чем отправлять команды, мы должны инициализировать компоненту и пройти авторизацию. Разберем пример кода для тонкого клиента. Важно помнить, что команды Asterisk требуют четкого соблюдения синтаксиса, включая символы переноса строки CRLF (Возврат каретки + Перевод строки).
&НаКлиенте
Процедура ПодключитьсяКАТС()
ПС = Символы.ВК + Символы.ПС; // CRLF обязателен для AMI
// Подключение компоненты из макета или файла
Подключено = ПодключитьВнешнююКомпоненту("ОбщийМакет.AsteriskComponent", "Asterisk", ТипВнешнейКомпоненты.Native);
Если Подключено Тогда
ОбъектАТС = Новый("AddIn.Asterisk.ROM-Asterisk-Native");
// Устанавливаем параметры соединения
Сервер = "192.168.1.100";
Порт = "5038";
ОбъектАТС.Connect(Сервер, Порт);
// Авторизация
Логин = "admin";
Пароль = "secret_password";
ТекстКоманды = "Action: login" + ПС +
"Username: " + Логин + ПС +
"Secret: " + Пароль + ПС +
"Events: on" + ПС + ПС; // Двойной перенос в конце команды
Результат = ОбъектАТС.ВыполнитьКоманду(ТекстКоманды);
Сообщить("Авторизация: " + Результат);
КонецЕсли;
КонецПроцедуры
Обратите внимание: в файле manager.conf на стороне Asterisk для пользователя должны быть разрешены соответствующие права (read/write) и доступ с IP-адреса сервера 1С.
Функция Originate позволяет соединить два канала. Чаще всего сначала вызывается внутренний телефон менеджера, и как только он поднимает трубку, Asterisk начинает набор внешнего номера клиента. Проанализируем структуру команды:
&НаКлиенте
Процедура СовершитьЗвонок(НомерКлиента, ВнутреннийНомерМенеджера)
ПС = Символы.ВК + Символы.ПС;
// Формируем команду
ТекстКоманды = "Action: Originate" + ПС +
"Channel: PJSIP/" + ВнутреннийНомерМенеджера + ПС +
"Context: from-internal" + ПС +
"Exten: " + НомерКлиента + ПС +
"Priority: 1" + ПС +
"Callerid: 1C_Call" + ПС +
"Async: true" + ПС + ПС;
Флаг = ОбъектАТС.ВыполнитьКоманду(ТекстКоманды);
КонецПроцедуры
Выясним причину возможных неудач: если в логах Asterisk пусто, проверьте правильность протокола (PJSIP/ или SIP/) и наличие контекста from-internal. Также критически важно наличие пустого переноса строки ПС + ПС в конце текстового блока команды.
Одной из самых сложных задач является получение имени файла записи разговора сразу после его завершения. Для этого компонента должна работать в режиме прослушивания. Чтобы 1С реагировала на события, необходимо использовать метод SetRegEx для фильтрации нужных данных.
Рассмотрим порядок действий:
ОбъектАТС.РежимПрослушивания = Истина;VarSet или Hangup.ВнешнееСобытие формы.
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Разбираем данные, пришедшие от компоненты
Если Найти(Данные, "MIXMONITOR_FILENAME") > 0 Тогда
// Извлекаем путь к файлу из строки события
ИмяФайла = ИзвлечьИмяФайла(Данные);
Сообщить("Запись сохранена в: " + ИмяФайла);
КонецЕсли;
КонецПроцедуры
Если событие не приходит, проверьте настройки manager.conf. Параметр read = dialplan,call,all должен быть активен для вашей учетной записи AMI.
Если менеджеру нужно прослушать запись разговора из интерфейса 1С, мы можем инициировать звонок, где вместо внешнего абонента Asterisk воспроизведет аудиофайл с помощью приложения Playback или через специальный контекст. Разберем пример реализации через Originate:
&НаКлиенте
Процедура ПрослушатьЗапись(ПутьКФайлу, ВнутреннийНомер)
ПС = Символы.ВК + Символы.ПС;
// Убираем расширение, если Asterisk этого требует
ИмяФайлаБезРасширения = СтрЗаменить(ПутьКФайлу, ".wav", "");
ТекстКоманды = "Action: Originate" + ПС +
"Channel: PJSIP/" + ВнутреннийНомер + ПС +
"Application: Playback" + ПС +
"Data: " + ИмяФайлаБезРасширения + ПС +
"Async: true" + ПС + ПС;
ОбъектАТС.ВыполнитьКоманду(ТекстКоманды);
КонецПроцедуры
Для реализации «умной» маршрутизации, когда 1С определяет ответственного менеджера по номеру входящего клиента, используется команда Redirect. Выясним, какие параметры необходимы для успешного перенаправления:
Нам потребуется идентификатор канала (Channel), который можно получить из входящего события Newchannel или Dial Begin.
// Пример формирования команды переадресации
ТекстКоманды = "Action: Redirect" + ПС +
"Channel: " + ИдентификаторКанала + ПС +
"Exten: " + НовыйВнутреннийНомер + ПС +
"Context: from-internal" + ПС +
"Priority: 1" + ПС + ПС;
Проанализируем ситуацию с нагрузкой. Если ваша АТС обрабатывает сотни звонков одновременно, поток событий от Asterisk может замедлить работу интерфейса 1С. Чтобы этого избежать:
SetRegEx, чтобы отсекать лишние события (например, только события с конкретными внутренними номерами).Таким образом, использование AMI совместно с технологией Native API в 1С открывает широкие возможности для создания полноценного рабочего места оператора с функциями Click-to-Call, автоматическим открытием карточки клиента и управлением записями разговоров прямо из учетной системы.