Астериск и 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(СтрокаФильтра)- установить фильтр на базе регулярного выражения
Решение сделано на основе внешней компоненты Олег Ризванов за его труд и бесценные комментарии.
Итак, перейдем к делу.
В: что это такое ?
О: Подсистема на управляемых формах, которую можно интегрировать почти в любую конфигурацию (как в типовую, так и в самопал).
В: Как это работает?
О: При запуске конфигурации инициализируется внешняя 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. на самую лучшую в мире разработку не претендую, вполне возможны косячки
Специальные предложения
(3)
1 - управляемые формы работают в линухе и веб-клиенте
2 - внешняя компонента (она же ROM-Asterisk.dll) написана с помощью COM-технологии
3 - внешняя компонента не работает в веб-клиенте и в линухе тоже, потому что она COM
Надеюсь ответил на все вопросы :)
(4) В таком случае принципиальных отличий от прочих разработок на эту тему не вижу. Серьезное ограничение - работа только в винде. Плюса не заслуживает.Вы кажется невнимательно читаете. Причем, очень часто. Внешняя компонента - не моя разработка.
А по поводу плюса - от Вас и не надо ;)
а что нового по сравнению с панелью от simplit, очередная гуёвая переработка? (7) в описании к публикации есть вся необходимая информация. Гуёвая или негуёвая - каждый для себя решает сам. Качайте - смотрите.Тихо и незаметно Simplit выпустил NativeAPI -версию ROM-Asterisk + новый релиз COM-версии
Из нового:
- Поддерживается сторона сервера
- Можно нарастить глубину очереди событий
- Можно перенаправлять ошибки во внешнее событие
Возможно, стоит пересобрать эту обработку под ROM-Asterisk-Native?
Возможно, стоит пересобрать эту обработку под ROM-Asterisk-Native?Конечно стоит, ща шапку подредактирую и займусь в свободное время
Беру демо конфу - все работает. Встраиваю в свою (самописная) через сравнение и объединение и вылетает на Функция Login(Логин,Пароль), а именно при выполнении Если глТелефония.Подключено=1 Тогда
Буду благодарен за помощь!
(11) necsoft, видимо объединили так :)Посмотрите отладчиком, что из себя представляет значение глТелефония во время ошибки (11)Доброго дня, подскажите, не нашли ли вы решение вашей проблемы?
В моей конфигурации аналогичная проблема (11)Доброго дня удалось решить проблему? тоже самое зависает и все (0) добрый день. где можно скачать внешнюю компоненту ROM-Asterisk.dl ? (13) Rustig, привет
компонента вшита в конфигурацию + в шапке есть ссылка на сайт разработчика компоненты Что за "профессионал" писал эту обработку? Ошибка на ошибке. ПодключитьОбработчикОжидания("вТелефонияКлиент.Автоподключение",30,Ложь); в глобальном модулe не работает.
(16) писал я. 5 лет назад.
Из всех скачавших, ошибка на ошибке, только у вас.
Если не нравится - сделайте сами.
Если можете сами - зачем вам чужое?
P.S. вежливость - залог успеха
P.P.S. не думал, что подобные вещи до сих пор актуальны
P.P.P.S. удачи вам в нелёгкой работе, дальше будет ещё "веселее" :)
Зависает dll зарег
Библиотека инициализируется на клиенте, т.е. клиент обязательно на Windows, а сервер 1с можно на Linux использовать? Или все только на Windows?Просмотры 53889
Загрузки 215
Рейтинг 36
Создание 28.10.13 15:33
Обновление 30.10.13 09:25
№ Публикации 205338
Тип файла Подсистема
Конфигурация Конфигурации 1cv8
Операционная система Windows
Страна Россия
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)
Код открыт Не указано
Слушатели смогут начать работать и получать результат над своими проектами сразу после первого занятия. Выполнение проектов вовремя и в рамках бюджета. Основы ТОС. с 01 по 29 декабря 2021 г.См. также
Автоматизация отдела продаж - CRM конфигурация для небольшой компании Промо
Вам нужна несложная и многофункциональная автоматизированная система управления продажами для автоматизации отдела продаж? Наша CRM Система поможет Вам! Внедрение займет не более 15 минут. A-CRM - быстрая и безболезненная автоматизация отдела продаж. Без лишних затрат и сложностей. Интеграция с 1С Бухгалтерией 3 и 1С УТ 11.
3 стартмани
05.03.2018 32759 61 user718500 20
Центр управления ботами
Небольшая конфигурация для управления telegram-ботами
26.08.2021 1514 0 nekiy 0
Обработка "ZVONOBOT API" это рабочий шаблон для генерации телефонных звонков клиентам по списку вопросов с сервера «zvonobot».
1 стартмани
27.07.2021 1284 1 ash2015 0
Простой helpdesk
Простая конфигурация для учета заявок клиентов. В первую очередь оптимизирована для собственных нужд, но можно подстроить под ваши. Основная специализация на текущий момент - ведение заявок кассовой техники клиентов и сопутствующего оборудования.
1 стартмани
05.07.2021 2490 6 roman3d 3
SIP телефон(софтфон) для 1С:Предприятия 8 и IP АТС (виртуальная и офисная) Промо
«АТС.Ринголайн» и «Ringophone» - это современный взгляд, комплексное решение для организации телефонии в офисе, которое работает прямо из коробки. Решения направлены на организации, где главный упор сделан на коммуникацию и взаимоотношения с клиентами. RingoPhone 1С - это бесплатный sip телефон, выполненный в виде внешней обработки для 1С. Данная панель телефонии разработана для любых конфигураций 1С:Предприятия 8. RingoPhone работает с АТС на базе Asterisk и провайдерами, которые поддерживают SIP протокол. IP телефония набирает огромную популярность и всё больше возможностей открывается при объединении телефонии и CRM системы. Возможность встроить телефон в свою CRM систему, позволяет осуществлять управление не только на уровне АТС, но и на уровне самого телефона. АТС.RingoLine изначально создавалась с учётом интеграции с современными CRM системами. CRM системам доступно менять любые настройки АТС. Такие как: создание пользователей, добавление и удаление операторов колл-центра, возможность задавать переадресацию сотрудникам, получать информацию о звонках с АТС, а возможность доработки позволит заложить новые алгоритмы распределения звонков по сотрудникам в зависимости от данных в CRM системе.
Собственно, после очередной неудачной попытки, идея сделать все с нуля самостоятельно, захватила наш ум, тем более, реализация лежала на самой поверхности, необходимо было только взяться и сделать.
Решили, что лучше всего создавать универсальное решение, не привязанное к конкретной задаче на 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.
В качестве 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 '<XML структура>' <адрес сервиса>
Отправляем запрос:
curl --header "Content-Type: text/xml; charset=utf-8" -d '<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><m:identify xmlns:m="http://wiki.miko.ru/doc:1cajam:identifynumber"><m:Number>74952293042</m:Number></m:identify></soap:Body></soap:Envelope>' IP_WEB_SERVER_1C/TestComponenta/ws/1C_MIKO_identify_number.1cws
В этом примере не используется аутентификация (в базе 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 системы:
Заключение
Читайте также: