Интеграция IP-АТС Asterisk и 1С

Интеграция IP-АТС Asterisk и 1С
Задать вопрос
Наши специалисты ответят на любой интересующий вопрос по услуге

Вопросы интеграции офисной АТС и систем CRM (управления отношениями с клиентами) очень актуальны для многих активно развивающихся предприятий.

Решения на данную тему не очень много.

В основе всех лежит один и тот же механизм - интерфейсы управления, которые поддерживает Asterisk - MAPI и AGI.

Предлагаю вашему вниманию одно из таких решений:

1. Нам понадобится компонента asterisk.dll, которую можно скачать по ссылке.

Для инсталяции компоненты нам необходимо разместить ее (распакованной) в BIN каталоге 1C на ПК оператора:

c:\Program Files\1cv81\bin

Далее необходимо выполнить команду:

Regsvr32 asterisk.dll

Далее в редакторе конфигурации 1С Предприятие необходимо в главном модуле добавить строки для подключения компоненты:

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
       ЗагрузитьВнешнююКомпоненту("asterisk.dll");  
      Астериск = Новый ("AddIn.asterisk"); 
Исключение
      Сообщить ("Попытка загрузить asterisk.dll накрылась медным тазом!", СтатусСообщения.Внимание);
КонецПопытки; 

Пользователь, Пароль - замените на данные пользователя АТС.

Если все указано правильно, вы увидите "Пользователь", "Экстены" и "Состояние". Так же есть возможность указать какому пользователю соотвествует номер, перед выходом из программы желательно сохранить настройки.

Укажите "Ваш номер" и "Куда звонить", а так же укажите "Канал", "Контекст". После выполнения кнопки звонить, АТС наберет Вас и начнет соединять с номером "Куда звонить".

Так же Если все сделанно правильно, то в 1С станет доступны четыре свойтсва и шесть методов:

  • Версия - Version - Строка - Инфа о версии компоненты
  • Копирайт - Copyright - Строка - Инфа о копирайте
  • Хинт - Hint - ComSafeArray - Массив с текущим значением хинтов
  • Статус - Status - Строка - Текущее состояние операций компоненты
Свойство «Хинт» представляет собой многомерный массив ComSafeArray следующей структуры: Екстеншион - Код состояния - Описание.
  • 0 - Idle
  • 1 - InUse
  • 2 - Busy
  • 3 - Unavailable
  • 4 - Ringing
  • 5 - InUse&Ringing
  • 6 - Hold
  • 7 - InUse&Hold
  • -1 - Error
Метод "Открыть"
Открыть(Хост, Порт, Логин, Пароль) 
Open(Хост, Порт, Логин, Пароль)

Открывает подключение к Asterisk Manager.

Передаваемые параметры:

  • Хост – строка с именем хоста. Допускается указание либо имени либо ip адреса. Обязателен.
  • Порт – число, номер порта на котором висит Manager. Не обязателен. По умолчанию 5038
  • Логин – строка с именем пользователя Asterisk Manager. Обязателен.
  • Пароль – строка с паролем пользователя Asterisk Manager. Обязателен.

Возвращает «Истина» в случае успешного подключения, «Ложь» - в случае облома.

В свойство «Статус» при этом пишется сообщение об успешном подключении либо о причине облома.

Пример:

Рез = Астериск.Открыть("sip.digium.com",5038,"mark","spencer");
Если Рез Тогда
    Сообщить("ОК");
Иначе
    Сообщить("Shit!");
КонецЕсли;
Сообщить(Астериск.Статус); 

Метод "Закрыть"

Закрыть() 
Close () 

Закрывает подключение к Asterisk Manager. Параметров нет. Нифига не возвращает.

В свойство «Статус» делает запись 'OK: Порт закрыт'.

Метод "ПоулучитьХинт"

ПолучитьХинт(ПоказатьДохлые)
GetHint(ПоказатьДохлые)

Получает один хинт в виде массива ComSafeArray. Хинт пишется в свойство «Хинт».

Передаваемые параметры:

ПоказатьДохлые – булево. Истина – будут выдены экстены с состоянием «Unavailable», Ложь – нет.

Обязателен.

Возвращает «Истина», если получение хинта успешно, Ложь – если накрылось. В «Статус» делается соответствующий комментарий по текущему событию.

Пример использования, с преобразованием ComSafeArray в Таблицу Значений:

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Экстен");
ТЗ.Колонки.Добавить("КодСостояния");
ТЗ.Колонки.Добавить("Состояние");
Если Не Астериск.ПолучитьХинт(Ложь) Тогда
     Сообщить(Астериск.Статус); 
     Возврат;
КонецЕсли; 

ТабЭкстенов.Очистить(); 
Массив = Астериск.Хинт.Выгрузить(); // Получаем массив из ComSafeArray методом Выгрузить()
Для Н=1 по Массив[0].Количество() Цикл  
      ТабЭкстенов.Добавить();         
КонецЦикла;

ТЗ.ЗагрузитьКолонку(Массив[0],"Экстен");
ТЗ.ЗагрузитьКолонку(Массив[1],"КодСостояния");
ТЗ.ЗагрузитьКолонку(Массив[2],"Состояние"); 

В результате получаем Таблицу Значений вида: Внутренний номер - Статус

Числовые значения массива «КодСостояния» хорошо использовать для анализа. Например – для пометки цветом.

Функа ПолучитьХинт(ПоказатьДохлые) выполняется в общем потоке приложения 1С, т.е. после вызова функи и до окончания ее работы другой код 1С выполняться не может.

Этого эффекта лишен следующий метод:

Метод "ЗапусититьМонитор"

ЗапуститьМониторХинтов(Период, ПоказатьДохлые,Режим)  
StartHintsMonitor (Период, ПоказатьДохлые,Режим)

Периодически получает хинт в виде массива ComSafeArray. Хинт пишется в свойство «Хинт».

Выполняется в изолированном потоке, что дает возможность после вызова функи продолжать выполнять код программы 1С, вызвавшую функу. При получении хинта (или ошибки получения) вызывает

Внешнее Событие.

Передаваемые параметры:

Период – целое положительное число. Время в секундах между запросами хинтов. Минимально – 1.

Обязателен.

ПоказатьДохлые – булево. Истина – будут выдены экстены с состоянием «Unavailable», Ложь – нет.

Обязателен.

Режим – булево. Работать по таймеру либо по событию Ложь – работа по таймеру, Истина – по событию.

В случае работы по таймеру (значение Ложь) Внешнее Событие будет вызываться каждый Период интервал времени, вне зависимости изменилось ли состояние экстенов или нет.

В случае работы по событию (значение Истина) опрос состояния экстенов будет призводится каждый Период интервал времени, а вот Внешние Событие будет вызваться только тогда, когда в состоянии экстенов произошли какие-либо изменения. Автор рекомендует использовать именно этот режим, как наиболее щадящий ресурсы. (Ну нафига, спрашивается, обрабатывать внешние события, если ничего не происходит?)

Обязателен.

Ничего не возвращает. Может использоваться как процедура.

Повторный вызов при живом потоке оный не прерывает, а лишь передает ему новые значения параметров.

Поток продолжает свое выполнение с новыми параметрами.

Вызываемое Внешнее Событие может быть обработано процедурой 1С

ВнешнееСобытие(Источник, Событие, Данные), при этом получаемые данные:

Источник: “asterisk”;

Событие: “Hints: OK” если хинт получен успешно либо “ Hints: Err”, если произошла ошибка.

Данные: Время и дата получения хинта (в строковом представлении)

Пример:

// Подготовка таблицы значений: 
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Экстен");
ТЗ.Колонки.Добавить("КодСостояния");
ТЗ.Колонки.Добавить("Состояние");

// Запуск монитора:
Астериск.ЗапуститьМониторХинтов(1, Ложь, Истина);
// Код 1С продолжает работаеть
//…..
//…..

//Обработчик внешнего события: 
Процедура ВнешнееСобытие ( Источник, Событие, Данные )
     Если Событие = "Hints: OK" Тогда
          ТЗ.Очистить();
          Массив = Астериск.Хинт.Выгрузить(); 
          Для Н=1 по Массив[0].Количество()
               ТЗ.Добавить();             
         КонецЦикла;
         ТЗ.ЗагрузитьКолонку(Массив[0],"Экстен");
         ТЗ.ЗагрузитьКолонку(Массив[1],"КодСостояния");
         ТЗ.ЗагрузитьКолонку(Массив[2],"Состояние");      
         Сообщить( "Состояние экстенов на "+Данные);
     КонецЕсли;
КонецПроцедуры

Метод "ОстановитьМонитор"

ОстановитьМониторХинтов()
StopHintsMonitor()

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

Метод "Оригиниация"

Оригинация (Откуда, Куда, Канал, Контекст)
Originate (Откуда, Куда, Канал, Контекст)

Совершает оригинацию звонка из Откуда в Куда через Канал, используя Контекст

Передаваемые параметры:

Откуда –строка.Тлф. номер, с которого пойдет звонок. Обязателен.

Куда –строка. Тлф. номер, куда пойдет звонок. Обязателен.

Канал – строка. Канал, который будет использован для оригинации.

Не обязателен. По умолчанию “Zap/g1/”

Контекст – Контекст, в котором будет отрабатывать оригинация.

Не обязателен. По умолчанию “internal-dialplan”

Правила использования нотации телефонных номеров подчиняются правилам, определенным в использованном Контексте.

На этом все. Спасибо за внимание!

Если статья оказалась полезной - поделись ссылкой с друзьями - кнопки ниже!

Цель нашей компании - предоставление высококачественных ИТ-услуг предприятиям малого и среднего бизнеса.