+7(3843)99-33-88

1С+Asterisk

Какая самая распространенная система IP-телефонии? Правильно — Asterisk.
Какая самая распространенная учетная система? Правильно — 1С.
А если их подружить, тогда — профит.

Предисловие

Возможно, статья написана излишне подробно — не обессудьте. Хотелось, чтобы было понятно всем, да и множество важных деталей упустить не хотелось. 

Условия.

Начнем «дружить» 1С и Asterisk. Возьмем самый тяжелый случай со стороны 1С — версию 7.7, а со стороны Asterisk версию 1.6.2.x. 

Чего мы хотим:

    1. Функцию исходящего звонка из 1С.
    2. Знать в 1С-е номер звонящего при входящем звонке.

Как будем строить.

У Asterisk-а есть свой API, через который мы и будем подключаться к нему. Называется он AMI — Asterisk Management Interface. Со стороны 1С будем использовать механизм внешних компонент.

Выбор внешней компоненты.

Google в помощь, ищем готовые внешние компоненты. Находим Asterisk.dll, находим Obeliks, находим VVSAst.dll, находим ROM-Asterisk.dll. Смотрим, анализируем… Возможно, в будущем захочется развить нашу систему, поэтому смотрим еще и на масштабируемость и наличие универсальных методов отправки команд в Asterisk. 

Asterisk.dll только для 1С версии 8.х, к тому же у этой ВК нет универсального метода отправки команд в AMI, она может только позвонить и все. Не подходит. 🙁

Obeliks — ограничения функциональности в шареварной версии. Каждый час перезагрузка, разговор 3 минуты. Снятие ограничений только в платной версии. Не подходит. 🙁

VVSAst.dll — для версии 7.7 ограничений нет, для 8.х — платно. Есть универсальные методы отправки команд в AMI. Подходит частично — только для 7.7 🙁

ROM-Asterisk.dll — полностью свободная и для 7.7, и для 8.х. Есть универсальные методы отправки команд в AMI. Есть мощная система фильтрации. Подходит для всех версий.

Подключение внешней компоненты.

Компонента ROM-Asterisk саморегистрирующаяся, загружается через ЗагрузитьВнешнююКомпоненту(). 

Функция _АстерискЗагрузитьВК()Экспорт;
    Попытка
        ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"ROM-Asterisk.dll");
    _Телефония = СоздатьОбъект("AddIn.ROM-Asterisk");
        Возврат 1;
    Исключение
        Сообщить("Не удалось загрузить внешнюю компоненту для связи с Asterisk");
    КонецПопытки;
    Возврат 0;
КонецФункции 


Дальше, нам нужна еще одна предопределенная процедура — ОбработкаВнешнегоСобытия() 

Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
    Если Источник="ROM-Asterisk" Тогда
        Сообщить(Данные);
        Возврат;
    КонецЕсли;
КонецПроцедуры


Теперь, нам нужно будет выполнить настройку со стороны Asterisk-а, а уже затем будем продолжать разбираться с 1С. 

Настройка доступа со стороны Asterisk

Теперь, выполняем настройку со стороны Asterisk. Для простоты, IP адрес нашего Asterisk-a статический 192.168.1.100, подключения будут выполняться из той же подсети 192.168.1.0/24 

Настройка доступа к AMI

Заходим на консоль или же подключаемся через SSH к Asterisk-у. Нас интересует файл /etc/asterisk/manager.conf 
[general] 

enabled=yes              ; возможность работать с AMI (по-умолчанию no)
port=5038                ; на порту TCP 5038
bindaddr=192.168.1.0     ; принимать соединения в лок. сети (0.0.0.0 - все)
timestampevents = no     ; Отправлять в пакетах событий временную метку
displayconnects = yes    ; Отображать факт подключения пользователя к AMI
allowmultiplelogin = yes ; Разрешить несколько подключений с одним именем

Настройка пользователя

Перейдем к секции, которая отвечает за пользователя: 

[admin]                            ; имя пользователя
secret=passwd1234                  ; пароль пользователя AMI
deny=0.0.0.0/0.0.0.0               ; запретить все ip-адреса
permit=192.168.1.0/255.255.255.0   ; разрешить соединение с подсети
read=system, call, log, verbose, command, agent, user   ; список классов событий
write=system, call,log, verbose, command, agent, user   ; список классов команд

Проверка

Проверяем. Заходим на порт 5038, используя PuTTY. Если все хорошо, то увидим приветствие Asterisk. Вводим команду: 

Action: login
Username: admin
Secret: passwd1234

В конце дважды нажимаем Enter. Asterisk на это должен ответить: 

Response: Success
Message: Authentication accepted

Значит, все замечательно — получилось 🙂 

Окончательная настройка 1С

Выполним окончательную настройку 1С. Переходим к 1С-у, к глобальному модулю. Напишем пару сервисных функций и будем уже слушать наш Asterisk. Для начала, сделаем переменную _Телефония глобальной и экспортной. Мы уже инициализировали эту переменную в функции _АстерискЗагрузитьВК() 

Перем _Телефония Экспорт;

Напишем функцию для организации подключения к AMI 

Функция _АстерискСоединиться(IP,Port=5038)Экспорт
    _Телефония.Connect(IP,Port);
    Если _Телефония.Connected=0 Тогда
        Сообщить("Ошибка соединения");
        Возврат 0;
    КонецЕсли;
    Возврат 1;
КонецФункции


Нужна универсальная функция, которая позволяет выполнять произвольную команду в AMI. 

Функция _АстерискВыполнитьКоманду(ТекстКоманды) Экспорт;
    Если _Телефония.Connected=0 Тогда
        Сообщить("Соединение не установлено");
        Возврат 0;
    КонецЕсли;

    ТекстКоманды=ТекстКоманды+РазделительСтрок;
    Флаг=_Телефония.ВыполнитьКоманду(ТекстКоманды);
    Если Флаг=0 Тогда
            Сообщить("Asterisk. Выполнение команды. Ошибка: "+КодОшибки);
            Сообщить("Asterisk. ТекстКоманды: "+ТекстКоманды);
    КонецЕсли;
    Возврат Флаг;
КонецФункции

Теперь, нужна функция авторизации. Выше, мы авторизовались из командной строки, теперь сделаем тоже самое из 1С. 

Функция _АстерискАвторизоваться(Юзер,Хеш)Экспорт
    CRLF=РазделительСтрок;
    ТекстКоманды="Action: login"+CRLF+
    "Username: "+Юзер+CRLF+
    "Secret: "+Хеш+CRLF;

    Если _АстерискВыполнитьКоманду(ТекстКоманды)=0 Тогда
        Возврат 0;
    КонецЕсли;
    Возврат 1;
КонецФункции


Напишем функцию прослушивания событий AMI 

Процедура _АстерискСлушать() Экспорт;
    Если _Телефония.Connected=0 Тогда
        Сообщить("Соединение не установлено");
        Возврат;
    КонецЕсли;
    _Телефония.РежимПрослушивания(1);
КонецПроцедуры


Осталось только вызвать все эти процедуры и функции. Сделаем это ПриНачалеРаботыСистемы(), добавим в эту процедуру строки: 

Если _АстерискЗагрузитьВК()=1 Тогда
    Если _Телефония.Connected=0 Тогда
        Если _АстерискСоединиться("192.168.1.100",5038)=0 Тогда
            Сообщить("Не удалось соединиться с сервером Астериск");
            Возврат;
        КонецЕсли;

        АмиПользователь="admin";
        АмиХешПароля="password1234";
        Если _АстерискАвторизоваться(АмиПользователь,АмиХешПароля)=0 Тогда
            Сообщить("Не удалось авторизоваться на сервере Астериск");
            Возврат;
        КонецЕсли;
    КонецЕсли;
    _АстерискСлушать();
КонецЕсли;


Загружаем 1С в режиме «Предприятие». Если все сделано правильно, то в строке сообщений появится куча всяких интересных событий AMI. Как минимум, мы должны увидеть событие своей успешной авторизации. Если это случилось — поздравляю, вы слышите Asterisk 

А что дальше?

Слышать Asterisk — это прекрасно, но этого мало. С помощью написанного выше, мы можем,не только слушать события, но и выполнять любые команды, доступные в Asterisk AMI. Все необходимые для этого функции 1С у нас уже есть. 

Например, для совершения исходящего звонка, можно воспользоваться командой Originate.

    ТекстКоманды="Action: Originate"+CRLF+
    "Channel: SIP/"+СокрЛП(Источник)+CRLF+
    "Context: from-internal"+CRLF+
    "Exten: "+СокрЛП(Приемник)+CRLF+
    "Priority: 1"+CRLF+
    "Callerid: "+СокрЛП(Источник)+CRLF+
    "Timeout: 30000"+CRLF+
    "Async: true"+CRLF;


Пример, вы можете посмотреть в обработке Originate, которая есть в составе конфигурации. 

Полный список команд Asterisk AMI можно посмотреть на сайте Asterisk.org, либо в русскоязычной версии справки voip.rus.net.

Форум поддержки внешней компоненты ROM-Asterisk.dll: http://simplit.com.ua/forum/viewforum.php?f=5

Описание внешней компоненты и примера: http://simplit.com.ua/index.php/ip-phone-menu/ipphone-integration-menu/204-1cphone-free

Загрузить готовый пример: http://simplit.com.ua/index.php/downloads-top-menu/category/3-integration?download=10%3Arom-asterisk

Автор статьи: oleg rizvanov

Метки: >

Обсуждение закрыто.