Астериск и 1с как подружить
Cтолкнулся с задачей интеграции 1С и Asterisk. Сразу же выяснилось, что Asterisk дает API для доступа снаружи (Asterisk Management Interface, сокращенно AMI) — мол, подключайтесь из любого приложения и работайте. Чем, собственно, активно пользуются разработчики ПО при интеграции с Asterisk.
Статья будет полезна в первую очередь для программистов 1С. Речь пойдет о библиотеке и некоторых аспектах интеграции 1С и Asterisk.
О библиотеке
Библиотека ROM-Asterisk является свободной. Реализует асинхронный неблокируемый сокет, основанный на событиях. Платформа 1С: Предприятие налагает определенные требования при разработке внешних библиотек, поэтому, DLL написана в строгом соответствии с рекомендациями 1С. Из особенностей библиотеки, хочется отметить реализацию внутри нее фильтров на базе регулярных выражений.
Особенности фильтрации событий AMI
В Asterisk, только начиная с версии 10 появилась возможность гибкой фильтрации событий AMI. До версии 10, клиент AMI вынужден обрабатывать избыточное количество событий.
Приведу пример пакета AMI при входящем звонке, чтобы было понятнее:
Event: Dial
Privilege: call,all
SubEvent: Begin
Channel: SIP/202-0000019c
Destination: SIP/200-0000019d
CallerIDNum: 202
CallerIDName: Operator202
ConnectedLineNum: 200
ConnectedLineName: Operator200
UniqueID: 1335616897.790
DestUniqueID: 1335616897.791
Dialstring: 200
Средствами Asterisk, можно установить фильтр на классы привилегий Privilege: call, dialplan, agent, и т.д. Но, нельзя ограничить клиента подпиской только на определенные типы событий внутри класса привилегий — Event: Dial, Bridge, Hangup и т.д. И уж тем более, нельзя накладывать фильтр по значению поля события — ConnectedLineNum: 200.
Хотелось, чтобы кесарю — кесарево.
Допустим, сеансу пользователя 1С необходимо отслеживать состояние его настольного IP-телефона/софтфона с внутренним номером 200 и в случае входящего звонка открыть форму «Карточка клиента».
При этом, сеанс 1С получит абсолютно все события «Event: Dial», возникшие в Asterisk. Потом, он должен их все проанализировать и выбрать только те, которые относятся к номеру 200. Куча бесполезной работы!
Фильтрация событий на стороне библиотеки
Чтобы избавить сеанс пользователя 1С от получения ненужных событий, на стороне библиотеки реализованы методы фильтрации событий. Велосипед изобретать не хотелось, поэтому, использован механизм регулярных выражений, основанный на PCRE
Пример фильтра: Dial.?200|Bridge.?200|Hangup.?200
Теперь, сеанс 1С получит внутри класса привилигий call, только события Dial, Bridge, Hangup, причем только те, в которых есть номер 200.
Настройка со стороны Asterisk
Ничего сложного. В случае использования чистого 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 ; Разрешить несколько подключений с одним именем
Секция, которая отвечает за пользователя:
[user1c] ; имя пользователя
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,command,agent ; список классов событий
write=system,call,command,agent ; список классов команд
В случае использования FreePBX версии 2.9 и выше, настройка выполняется через веб-интерфейс.
Использование в среде 1С: Предприятие
Библиотека будет работать в 1С версий 7.7, 8.1, 8.2. Единственное ограничение — запуск в режиме веб-клиента в версии 8.2. Это вынужденная мера — пришлось пожертвовать веб-клиентом 8.2 ради совместимости с версией 7.7.
Загрузка выполняется с помощью стандартных методов 1С: ЗагрузитьВнешнююКомпоненту или ПодключитьВнешнююКомпоненту.
События, полученные внешней компонентой ROM-Asterisk в среде 1С будут доступны в предопределенной процедуре ОбработкаВнешнегоСобытия
Свойства компоненты:
Подключено / Connected – (чтение) состояние подключения к Asterisk
Фильтр / Filter – (чтение) обычный строковый фильтр, для поиска вхождения подстроки
РегулярноеВыражение / RegEx – (чтение) фильтр, на основе регулярного выражения
РежимПрослушивания / Listen – (чтение) режим прослушивания событий Asterisk AMI, 1-включен, 0-нет
Версия / Version – (чтение) версия внешней компоненты
Методы компоненты:
Подключиться / Connect ( IP, Port) — установить соединение с AMI сервера Asterisk
Отключиться / Disconnect( ) — разорвать соединение с сервером Asterisk
ВыполнитьКоманду / SendCommand(СтрокаКоманды)- выполнить произвольную команду Asterisk AMI
РежимПрослушивания / ListenMode(Флаг)- включить/выключить режим прослушивания событий Asterisk AMI, 1-включить, 0-выключить
УстановитьФильтр / SetFilter(СтрокаФильтра)- установить обычный вхождения подстроки
УстановитьРегулярноеВыражение / SetRegEx(СтрокаФильтра)- установить фильтр на базе регулярного выражения
Более 3-х лет мы пытались настроить грамотную интеграцию 1С: Предприятия 8 и телефонной АТС на базе Asterisk для своего офиса. За какое бы решение мы не брались, всегда получались какие-то костыли. Это очень огорчало. Но на рынке действительно не было нормального решения для интеграции. Перепробовали разные продукты, бесплатные и платные, потратив не один 10-ток тысяч рублей, но счастья не наступало.
Хочешь, чтобы было сделано хорошо — сделай сам
Собственно, после очередной неудачной попытки, идея сделать все с нуля самостоятельно, захватила наш ум, тем более, реализация лежала на самой поверхности, необходимо было только взяться и сделать.
Решили, что лучше всего создавать универсальное решение, не привязанное к конкретной задаче на 1С. Нам нужен «прозрачный прокси» из 1С в Asterisk и обратно, с помощью которого, в будущем, мы соберем свою панель телефонии мечты, о которой 3 года грезили.
Технология NativeAPI
Платформа 1С: Предприятие 8 допускает подключение внешних модулей в виде динамических библиотек, однако к самим библиотекам есть специальные требования. По требованиям 1С библиотека должна быть разработана с использованием технологии NativeAPI.
Технология Native API – собственный интерфейс системного программирования 1С: Предприятия 8. Она поддерживает операционные системы Windows и Linux, и дает возможность создавать внешние компоненты, работающие как под одной, так и под другой операционной системой. Компоненты, созданные по технологии Native API, могут быть подключены в толстом клиенте, в тонком клиенте, в веб-клиенте, внешнем соединении и в сервере приложений.
Потому мы, вооружившись свежекупленной Visual Studo 2010, начали погружаться в творческий процесс программирования.
AJAM интерфейс Asterisk
Документация по Asterisk и компоненте
Что получилось
Как оказалось, хотя решение и лежало на поверхности, вся разработка и написание документации заняли более 3-х месяцев работы нескольких высококвалифицированных специалистов.
В результате, после инициализации компоненты в 1С, становится доступен весь спектр AMI команд Asterisk, если мне не изменяет память, то в общей сложности 103 функции.
Например, оригинация звонка из 1С c номера SIP/26 на городской 74952293042 выглядит так:
Channel = «SIP/26»
Context = «from-internal»;
Exten = «74952293042»;
Priority = «1»;
Timeout = "";
CallerID = «MIKO_Abonent»;
Variable = "";
Account = «miko»;
Application = "";
Data = "";
Async = «1»;
ActionID = «114»;
Результат = "";
Компонент.Originate(Channel, Context, Exten, Priority, Timeout, CallerID, Variable, Account, Application, Data, Async, ActionID, Результат)
Во время активного соединения компонент вызывает в 1С обработчики внешних событий, благодаря чему, мы можем отлавливать состояние каналов, информацию о звонящем номере, состояние очередей и даже управлять в реальном времени маршрутизацией звонка.
Новый уровень взаимодействия 1С и Asterisk
В итоге, мы перешли на новый уровень разработки бизнес решений 1С, интегрированных с телефонией на базе Asterisk. Теперь разработчик 1С может использовать весь доступный функционал АТС в понятной для него среде 1С: Предприятие 8, а функционал решения ограничен лишь его фантазией.
В качестве пробы, на основе компоненты мы разработали «Панель телефонии Asterisk для 1С:CRM», которую используем в работе нашей компании, добавили функции умной маршрутизации клиента на ответственного менеджера, используя только логику 1С, научили панель сохранять запись разговора в документе «Событие», проработали механизмы передачи истории звонков из Asterisk в 1С, а также управление различными переадресациями и вызовами прямо из 1С: Предприятия 8. Получилась достаточно удобная панель телефонии, и спустя 3 года метаний мы создали то, чего хотели изначально от сторонних разработчиков.
Коммерческий продукт и партнерская сеть
Нам понравилось разрабатывать, описывать, тестировать решение интеграции 1С и Asterisk. Мы решили не останавливаться и выпустить нашу компоненту в качестве SDK для разработчиков 1С. Занялись сертификацией продукта в фирме 1С на статус 1C: Совместимо. Разработали агентскую и партнерскую программы.
Демонстрация работы компонента
Ссылки на более подробную информацию
upd. 24 февраля SDK прошла сертификацию на 1С: Совместимо. В итоге мы сделали первое сертифицированное фирмой 1С решение для интеграции 1С и Asterisk.
Решение сделано на основе внешней компоненты Олег Ризванов за его труд и бесценные комментарии.
Итак, перейдем к делу.
В: что это такое ?
О: Подсистема на управляемых формах, которую можно интегрировать почти в любую конфигурацию (как в типовую, так и в самопал).
В: Как это работает?
О: При запуске конфигурации инициализируется внешняя dll, далее через неё идёт подключение к АТС Asterisk. Возможность хранить для каждого конкретного пользователя 1С свои настройки для подключения к АТС (которых может быть несколько)
О: Разработка не представляет из себя ничего сложного. Функционал бесплатной панели телефонии для 1С и Asterisk перекочевал в модуль упр.приложения, пару общих модулей, а также добавлен один справочник (настройки подключения к АТС) и один регистр сведений (настройки АТС для пользователей)
В: как установить\интегрировать?
О: Как сказано выше - разработка не представляет из себя ничего сложного. Можете "сравнить\объединить. ", а можете и ручками. Последний вариант, конечно предпочтительнее. Т.к. будете знать, куда копать если захотите что-то допилить, а работы всего на пару минут
Рассмотрим интеграцию подсистемы "Телефония" на типовой УТ 11. Блок объединения конфигурации рассматривать не будем - там всё просто.
Далее, заходим в подсистему телефония и задаем настройки:
- в справочнике "Виды АТС" указываем настройки подключения к IP АТС
- в регистре сведений "Настройки пользователей АТС" указываем связку какой пользователь какую АТС использует, его персональный внутренний номер и контекст
После этого перезапускаем 1С.
Система попробует подключить внешнюю компоненту (dll). По умолчанию забит путь C:\Windows\System32\ , если dll-ки там нет, то конфигурация попытается самостоятельно сохранить туда файлик ROM-Asterisk.dll
После этого, нужно запуститься в толстом клиенте. Это необходимо для того, чтобы 1C зарегистрировала внешнюю компоненту в реестре Windows (можете зарегить самостоятельно, тогда запуск в толстом клиенте не потребуется).
Опять запускаем 1С (теперь можно в тонком клиенте), если всё прошло успешно - вы увидите внизу всплывающие окна, о том что всё ОК :)
1) проверка настроек для данного пользователя
2) подключение внешней компоненты
3) инициализация объекта
4) подключение к АТС
В: Как звонить (совершать исходящие вызовы)?
О: В общем модуле "вТелефонияКлиент" есть экспортная процедура "Звонить" с одним единственным параметром, куда передаётся номер телефона. Завязывайте на неё любую кнопку в вашей конфигурации
Обработку входящего звонка допиливайте самостоятельно в модуле упр.приложения через процедуру "ОбработкаВнешнегоСобытия"
Далее, обработка звонков ограничивается только вашей фантазией. Можно завязать любое логирование событий, вплоть до фиксирования длительности звонка и т.д. и т.п.
P.S. на самую лучшую в мире разработку не претендую, вполне возможны косячки
Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)
Описание
Данная компонента предназначена для работы из программных продуктов 1С Предприятия 8.х
(Windows x86, x64) с телефонной станцией Asterisk. Соединение осуществляется посредством TCP
протокола. Чтение событий и запись команд происходит асинхронно. Данный интерфейс является
очень мощным инструментом взаимодействия между 1С и телефонной станцией. Позволяет
решать разнообразные задачи от простого определения номера звонящего до организации call
центов.
Данная компонента саморегистрирующаяся (Native API). Прав администратора не требуется для ее
установки.
Для демонстрации возможностей компоненты можете воспользоваться конфигурацией 1С Управление телефонией (для платформа 8.3.11 и выше) для FreePBX 13 (совместима для других АТС на платформе Asterisk). В конфигурации файл компоненты загружен в справочник "Внешние компоненты". При начале работы необходимо в настройках пользователя и настройках подключения прописать корректные значения для доступа к Вашей АТС. Данная конфигурация показывает лишь базовый функционал (получение информацию об экстейшенах, АОН, набор номера, перевод звонка, подслушивание и пр.) и не учитывает многих особенностей, например многоканальности.
По гиперссылке Отладка включается режима записи в логфайл информации от АТС.
Состав дистрибутива
Файл архива компоненты: PBX_X_X_X_X.zip
INFO.XML - Требуется для авторегистрации в конфигурациях 1С Предприятия 8.3 и выше
MANIFEST.XML - Описание компоненты для автоматической установки
PBX.dll - Файл внешней компоненты для 32 разрядной ОС Windows
PBX64.dll - Файл внешней компоненты для 64 разрядной ОС Windows
Файл выгрузки демонстрационной конфигурации: asterisk.dt для платформы 1С 8.3 не ниже 8.3.11 настроено для работы с FreePBX 13
Состав дистрибутива одинаковый для демонстрационной и коммерческой версии. Для коммерческой версии высылается дополнительно ключи продукта.
Требования
Компонента тестировалась на версиях платформы 1С 8.2.19.130 - 8.3.11.2867 (возможно 7.7)
MS Visual C++ 2012-2017 (идет в составе платформы на 8.3)
MS Windows 7, Windows 10, для 32 и 64 битных систем.
Подготовка Asterisk
Для доступа к интерфейсу AMI требуется открыть доступ в Asterisk
Делается это редактированием файла /etc/asterisk/manager.conf через CLI или через WEB
интерфейс АТС
Рекомендации:
Обязательно ограничивайте подсети из которых доступен AMI интерфейс. Если работа с АТС из нескольких подсетей, то необходимо создать разных пользователей AMI.
Ограничьте доступ к паролю и логину от AMI интерфейса в программе 1С.
Способы подключения внешней компоненты
Подключение файла компоненты
Подключение с помощью шаблона
Предпочтительный способ использования компоненты на предприятии, поскольку компонента
будет установлена автоматически пользователю и будет выбрана автоматически разрядность
компоненты.
В конфигурации требуется создать Общий макет. Тип макета «Внешняя компонента»
Загрузить в нее поставляемый zip файл
После использования метода УстановитьВнешнююКомпоненту() файл компоненты (PBX.dll) будет
размещен в каталоге C:\Users\[ИмяПользователя]\AppData\Roaming\1C\1Cv82\ExtCompT
Свойства компоненты
Версия – Отображает информацию о текущей версии компоненты
Значение по умолчанию: нет
Чтение
Шифрование – использует передачу пароля в зашифрованном виде. Поскольку авторизация
сопровождается с передачей и обработкой токена, то обязательно использование метода
Авторизация().
Значение по умолчанию: Истина
Чтение и Запись
Подключен – Если компонента успешно подключилась к серверу Asterisk, то принимает булевное
значение Истина.
Чтение
Идентификатор – идентификационный номер компоненты. Уникальный ключ для каждого компьютера.
Чтение
КлючПродукта – регистрационный ключ продукта.
Чтение и Запись
Методы компоненты
Подключиться (server, port) – метод устанавливает подключение к телефонной станции Asterisk
по TCP протоколу.
Парметры:
server – имя или IP адрес сервера. Обязательное указание.
port – порт подключения. Указывается значение из раздела «Подготовка Asterisk». Значение по
умолчанию 5038.
Авторизация(ИмяПользователя, Пароль) - метод осуществляет авторизацию с учетом использования шифрования MD5
ИмяПользователя - логин пользователя Asterisk AMI
пароль - пароль пользователя Asterisk AMI
Прослушать(Истина) – метод запускает прослушивание порта для дальнейшей обработки и
передачи информации в 1С Предприятие.
Разъеденить() – метод останавливает прослушивание и закрывает подключение к станции.
Использование компоненты в 1С Предприятие
Пример реализации подключения к серверу
Получение информации от внешней компоненты.
Ограничения демонстрационной версии:
На чтение (получение) информации от АТС ограничений НЕТ. например, можно определять какой номер вам звонит и сопоставлять со справочником Контрагентов.
Невозможно отправлять команды в телефонную станцию через некоторое время после подключения.
Гарантия возврата денег
ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом в течение 14-ти дней со дня поступления денег на наш счет.
Программа настолько проверена в работе, что мы с полной уверенностью можем дать такую гарантию. Мы хотим, чтобы все наши покупатели оставались довольны покупкой.
В качестве IP АТС мы используем Askozia — это один из дистрибутивов широко известного Asterisk, про Askozia я писал в этом посте.
В качестве CRM системы используется продукт 1С: Управление торговлей и взаимоотношениями с клиентами 8 в режиме клиент-сервер. Давно зрел вопрос, можно ли встроить в диалплан Asterisk обращение к 1С:CRM системе для выполнения каких-либо управляющих действий и можно ли из 1С управлять IP АТС?
Схема работы простейшая — при входящем звонке спросить у 1С что с ним делать, и если 1С ответила, то выполнить команду или продолжить стандартное выполнение маршрута вызова.
Попробуем выполнить простейшее действие — установить название клиента по номеру телефона из CRM системы и записать это значение в CDR базу Asterisk.
Исходные данные
1С: Предприятие 8.2 (8.2.17.143)
“Управление торговлей и взаимоотношениями с клиентами” ( CRM + УТ )
Около 10000 контрагентов.
СУБД MS SQL
Web сервер IIS
АТС Askozia CFE 2.1:
Asterisk 1.8.4.4
PHP 4.4.9
AGI phpagi.php,v 2.14
В Askozia уже имеется механизм установки CallerID на основании данных “записной книжки” во внутренней базе данных Asterisk. Для реализации этого варианта мы использовали “SDK компонента связи 1С и Asterisk”.
Пример функции, позволяющей записать данные в AstDB:
Пример вызова функции, применимо к текущей задаче:
Это первый вариант реализации. Мы запустили его в работу в нашей организации. После синхронизации контактов на всех телефонах офиса при звонке видно с кем мы разговариваем (конечно, если есть номер в базе).
Разумеется CallerID возможно видеть только на телефонах с дисплеем :).
Недостатки:
Необходима периодическая синхронизация данных AstDB и 1С. Данные устаревают.
Askozia — ReadOnly система. В этом ее преимущество и недостаток. После перезагрузки AstDB приводится в “Исходное” состояние — до записи списка клиентов из 1С.
В силу перечисленных недостатков мы отказались от этого варианта реализации. Но для голого Asterisk этот вариант вполне рабочий.
Вариант онлайн взаимодействия через AGI и Web сервисы 1С: Предприятия 8
Создаем веб-сервис 1С
При поступлении звонка на наш внешний номер в маршруте вызова Asterisk возможно вызвать AGI скрипт. В скрипте обратиться к веб-сервису 1С и установить значение CallerID(name).
Разработан простой web сервис 1С:
Имя — MIKO_identify_number
У сервиса будет только одна простая операция (функция),
свойства операции:
Публикуем веб-сервис (отдельная тема, как это сделать, не будем на ней останавливаться, можно почитать здесь). После публикации проверим работу сервиса с помощью веб браузера, откроем wsdl описание по ссылке:
Если все правильно, то результат будет таким:
В модуле объекта сервиса пропишем простейший обработчик операции:
Возьмем cURL и проверим работу нашего WEB сервиса «в лоб».
В общем случае команда будет выглядеть следующим образом:
curl --header -d ''
В этом примере не используется аутентификация (в базе 1С нет пользователя).
Пример ответа сервера:
Создаем AGI скрипт
К сожалению, в Askozia очень примитивные возможности PHP, нет даже cURL расширения, да и PHP используется достаточно древней 4.4.9 версии. Тем не менее, мы попробовали победить все ограничения, потому просьба сильно не ругаться на код описанные ниже.
Подключим скрипт к Askozia, для этого в веб -интерфейсе перейдем на закладку приложения и добавим новое PHP приложение.
Мы выяснили, что в номере 1334444 вызывается контекст DIALPLAN-APPLICATION-176239923050fac4c5678b9
Выведем этот контекст, чтобы понять как называется наш PHP файл:
Искомый файл найден: DIALPLAN-APPLICATION-176239923050fac4c5678b9.php
Перейдем к редактированию входящего маршрута вызова и добавим в начало маршрута блок универсальной команды:
в поле команды установить AGI(DIALPLAN-APPLICATION-176239923050fac4c5678b9.php)
в итоге мой маршрут вызова выглядеть следующим образом:
При входящем звонке, направленном на этот маршрут, происходит выполнение AGI скрипта с обращением к серверу 1С, сервер по переданному номеру возвращает название контрагента, и это название вписывается в поле CallerID.
В результате до внедрения история выглядела так:
После запуска web-сервиса в истории появились названия клиентов из 1С:CRM системы:
Заключение
Читайте также: