Интеграция 3CX Phone System v.12 и 1С. Часть 2.

Поиск метода связки 1С (конфигурация Itilium) с 3CX.

Первая часть: http://if56.ru/3cx-ipphone-call-log-1c-database

Закончив реализацию истории звонков, мы приступили к поиску решения по подключению 3CX Phone System к 1С. Требования: независимость от типов (аппаратные телефоны, софтфоны) абонентских устройств (далее просто «телефоны») и производителей; независимость функционала от  метода работы - прием/осуществление вызовов при помощи 1С или с помощью телефонов. Второе требование возникло по «банальным причинам»: часть коллектива курящая; 1-ой линии пока нет; «ваш звонок важен для нас» и зачастую консультации или переговоры производятся непосредственно из курилки (используем DECT телефоны). Были рассмотрены четыре варианта, два из них отброшены сразу.
 
Метод 1 - простейший.
Требует подключения к серверу 3CX через Win8 3CX Phone. Используется приложение CallTRiggerCmd.exe из папки c:\ProgramData\3CXPhone for Windows\PhoneApp\ :
CallTRiggerCmd.exe -cmd makecall:<КудаЗвонить>.
Выполняет дозвон до абонентского устройства, после снятия трубки звонит на <КудаЗвонить>. Других функций нет. Годен для реализации минимальной функциональности. Не вариант.
 
Метод 2 — чтение лог-файлов.
Нами рассматривался для версии 11. Не стал реализовываться по следующим соображениям:
- размер файла неизвестен и непредсказуем;
- файл ротируется, невозможно запомнить позицию;
- чтение по сети;
- русские имена не понимает.
Если использовать что-то типа MemoryMappedFile, возможно чтение на лету, но с ротацией проблема останется. И обработку данных никто не отменял.
 
Метод 3 — Call PBX API.
Более продвинуто. Примеры взаимодействия приведены в примерах OMSamples с сайта 3CX. Нас интересует главным образом пример DNMonitor. Вот фрагмент кода:
MyListener aa = new MyListener(null);
PhoneSystem.Root.Updated += new NotificationEventHandler(aa.ps_Updated);
PhoneSystem.Root.Inserted += new NotificationEventHandler(aa.ps_Inserted);
PhoneSystem.Root.Deleted += new NotificationEventHandler(aa.ps_Deleted);
Как видим, система генерирует 3 вида событий — новая запись (вставка), изменение существующей записи, удаление записи. Эти события можно передавать в 1С и  в ней обрабатывать.
Поскольку программа или сервис, который может обращаться к Call API, должен быть запущен на том же компьютере, что и 3CX Phone System, существует несколько вариантов связи с программой-потребителем. Первый путь - на сервере 3CX работает сервис, который отправляет полученные данные через серверный сокет по протоколу TCP/IP. На потребителе работает клиент, взаимодействующий с серверной частью. Такая схема реализована, в частности, в Модуле интеграции «3CX Connector» (http://icepartners.ru/stat-i/modul-integracii-tcx-connector.html). Кроме получения информации о событиях, компонента позволяет передавать на сервер команды создания, управления и завершения вызовов.
К сожалению, разработчики не предоставляют полноценных примеров использования компоненты. А именно там скрыто много интересных моментов. Но об этом чуть ниже.
 
Двигаясь по этому варианту мы разработали компоненту, поддерживающую аналогичную функциональность в части отслеживания состояний абонентов, причем в качестве клиентской части использовалась наша компонента, идущая в составе «SIP софтфона для 1C» SIPPhone82.dll (http://sip1c.ru). Кроме того, было реализовано подключение к 1С через Web-сервис. На первый взгляд получалось достаточно функционально. Но в процессе тестирования стали выявляться проблемы.
 
Если внимательно посмотреть документацию, то можно заметить, что события из DNMonitor выдаются последовательно, т. е. подразумевается некая таблица, в которую вносятся, изменяются или удаляются записи о состояниях абонентов. В 1С такому функционалу более всего соответствует Регистр сведений, так что его мы и использовали.
При реализации  в виде TCP/IP компоненты, запись в этот регистр сведений будет производиться каждым подключенным клиентом, т. е. при большом числе клиентов возникает проблема блокировок. Та же проблема возникает, когда приходит вызов на группу абонентов — все пытаются произвести запись в регистр. Когда мы столкнулись с этим, была сделана попытка буферизации записи в регистр. Это уменьшило число конфликтов, но проблема осталась. На этом этапе и было принято решение пойти вторым путем - реализовать запись в регистр через Web-сервис.
Подобная схема, только с использованием компоненты взаимодействия с Asterisk, реализована в конфигурации Itilium. Наш подход отличается в первую очередь количеством записей в регистре. Если в оригинале Itilium в регистре СобытияАТС хранится большое число записей, мы решили хранить только актуальные записи. То есть, поскольку в поступающих от 3CX событиях есть Delete, то пускай записи удаляются.
Здесь возникла еще проблема — остаточные записи. При внешнем входящем звонке происходит запись сразу нескольких событий — соединение от внешнего оператора, вызов на абонента или группу абонентов. Так вот при завершении звонка событие Deleted для внешней линии не формируется, следовательно, эта запись не будет удалена. Решением стало тотальное  удаление записей по CallId при завершении звонка.
           
Связка с DNMonitor была доведена до ума в плане генерации событий с АТС. Начав разработку функционала исходящих вызовов, мы пришли к мнению, что реализация команд при такой схеме не очень красива с программной точки зрения. Либо DNMonitor должен постоянно дергать Web-сервис 1С на предмет наличия команд, либо надо организовывать Web-сервис уже для негое самого, чтобы клиенты 1С могли вызывать команды на выполнение. Кроме того, в 1С нужен таймер для проверки событий, записанных в регистр.
Оба  варианта нам казались не очень удачными. Вообще, использование таймеров в любой системе должно быть минимизировано (хотя обойтись без них не всегда возможно). К тому же перед глазами постоянно маячил 3CX Phone For Windows идущий в составе АТС и изредка возникающее сообщение от него о «неудаче соединения с System Web API».
 
Метод 4 — Web API.
В 11 версии 3CX MyPhone клиент был написан с использованием технологии Silverlight. И хотя возможности клиента были очень широкими, технология затрудняла его использование  (по крайне мере для нас) в плане интеграции. 12 версия принесла с собой 3CX Phone For Windows, этот клиент отличается тем, что использует  для связи с сервером Web Service:
http://<Адрес 3CX>:5000/MyPhone/MPWebService.asmx?wsdl
Без преувеличения - это революционное новшество! Было решено копать в данном направлении.
 
Документации мы не нашли. Но все же была разработана COM компонента, которая, с одной стороны, подключается к Web-сервису 3CX, а с другой – реализовывает все необходимые функции и события для клиента. Дальнейшая разработка интеграции 3CX и 1С пошла без особых затыков Вызов функций не представляет проблемы. Изменения состояния абонентов приходят в виде внешних событий и на клиенте преобразуются в открытие соответствующих форм, поиск абонента по номеру, поиск документов по звонящему, да, собственно, любые функции.
При реализации был учтен предыдущий опыт разработки. Дело в том, что события от 3CX приходят в программу в разных потоках, поэтому пришлось делать буферизацию сообщений. Немало проблем доставил вызов ExternalEvent 1С Addin, не желающий возвращаться в собственный поток. Но все проблемы были решены. В итоге была переписана подсистема телефонии Итилиум и для отладки и понимания что же нам все-таки нужно, на первом этапе появилась такая панель:
Повторюсь, изысков и красоты нет т.к. панель для отладки. Функционал подсистемы телефонии был несколько расширен, все необходимые функции были реализованы в том числе и связка с сервисом истории звонков CDRClient1C, описанным  в первой части.. Собственно, этот метод интеграции нас устроил больше всего.
 
А так выглядит консоль управления 3CX:
DNMonitor продолжает работать, но в настоящее время уже не используется.
 
Непосредственную реализацию связки 3CX Phone System и 1С на примере конфигурации Itilium  мы опишем в следующей статье.
3CX WebAPI Client 1C Отладочная панель. Настройки.
3CX WebAPI Client 1C Состояние линии оператора
3CX WebAPI Client 1C Состояние линии оператора
3CX WebAPI Client 1C Отладка с просмотром входящих и исходящих сообщений
 
Tags: