===== Настройка Asterisk для получения истории звонков в панели 1С =====
==== Источник истории звонков база данных MYSQL ====
В панели реализована функция получения истории звонков с сервера asterisk, путем генерации вызова с номера 0000999 на номер 0000555 используя приведенный ниже диалплан.
[miko_ajam]
exten => 0000555,1,NoCDR()
exten => 0000555,n,Set(num=0)
exten => 0000555,n,Set(i=0)
exten => 0000555,n,Set(chan=${v1})
exten => 0000555,n,Set(date1=${v2})
exten => 0000555,n,Set(date2=${v3})
exten => 0000555,n,Set(numbers=${v4})
exten => 0000555,n,Set(dbname=${AST_CONFIG(cdr_mysql.conf,global,dbname)})
exten => 0000555,n,Set(user=${AST_CONFIG(cdr_mysql.conf,global,user)})
exten => 0000555,n,Set(password=${AST_CONFIG(cdr_mysql.conf,global,password)})
exten => 0000555,n,Set(tmp_dir=${ASTLOGDIR})
exten => 0000555,n,NoOp()
exten => 0000555,n,Set(packet=20)
exten => 0000555,n(NextNum),Set(i=$[${i} + 1])
exten => 0000555,n,Set(NumFilter=${CUT(numbers,,${i})})
exten => 0000555,n,Gotoif($[ ${LEN(${NumFilter})}=0 ]?SendRequest)
exten => 0000555,n,ExecIf($[${i}=1]?Set(SQLrequest=SELECT a.calldate,a.src,a.dst,a.channel,a.dstchannel,a.billsec,a.disposition,a.uniqueid from (SELECT * from cdr where calldate BETWEEN ${QUOTE(${date1})} AND ${QUOTE(${date2})}) AS a where ))
exten => 0000555,n,ExecIf($[${i}>1]?Set(SQLrequest=${SQLrequest} OR ))
exten => 0000555,n,Set(SQLrequest=${SQLrequest} ((a.lastapp="Transferred Call" AND a.lastdata like ${QUOTE(%/${NumFilter}@%)}) OR (a.lastapp="Dial" AND (a.channel like ${QUOTE(%/${NumFilter}-%)} OR a.dstchannel like ${QUOTE(%/${NumFilter}-%)} OR a.dstchannel like ${QUOTE(%/${NumFilter}@%)} ))))
exten => 0000555,n,ExecIf($[${i}>15]?Hangup())
exten => 0000555,n,Goto(NextNum)
exten => 0000555,n(SendRequest),System( mysql -sse '${SQLrequest} LIMIT 100' -u${user} -p${password} ${dbname}> ${tmp_dir}/${UNIQUEID})
exten => 0000555,n,Set(kls=${SHELL(cat ${tmp_dir}/${UNIQUEID} |wc -l)})
exten => 0000555,n,Gotoif($[ ${kls} = 0 ]?DelTmpFile:SendCDRHistory)
exten => 0000555,n(SendCDRHistory),Set(ostatok=${kls})
exten => 0000555,n(SendNextPacket),Set(packet=${IF($[ ${ostatok} < ${packet}]?${ostatok}:${packet})})
exten => 0000555,n,Set(num=$[${num} + ${packet}])
exten => 0000555,n,UserEvent(FromCDR,Channel: ${chan},Date: ${date1},Lines: ${QUOTE(${SHELL(cat ${tmp_dir}/${UNIQUEID} |head -n '${num}'| tail -n '${packet}'| sed 's/|/'@.@'/g'| sed 's/[\t]/'@.@'/g'|sed 's/$/...../g'|tr "\n" " ")})})
exten => 0000555,n,Set(ostatok=$[${ostatok}-${packet}])
exten => 0000555,n,Gotoif($[ ${ostatok} > 0 ]?SendNextPacket:DelTmpFile)
exten => 0000555,n(DelTmpFile),System(rm ${tmp_dir}/${UNIQUEID})
exten => 0000555,n,ExecIf($[${kls}>0]?UserEvent(Refresh1CHistory,Channel: ${chan},Date: ${date1}))
exten => 0000555,n,Answer()
exten => 0000555,n,Hangup()
Для базы звонков в 100000 записей, отображение истории в 1С за определенный день занимает 3-5 секунд. Потому мы рекомендуем именно этот способ работы с CDR записями.
Быстрее только прямое обращение к базе данных CDR из 1С, не используя функционал Asterisk.
Для включения этого файла в работу необходимо положить его в директорию /etc/asterisk/ и проинклюдить в файле /etc/asterisk/extensions.conf с помощью следующей команды:
#include extensions_miko.conf
Если вы используете сборку asterisk с оболочкой freepbx тогда вам необходимо использовать extensions_override_freepbx.conf вместо extensions.conf
Для сокращения количества обращений к серверу Asterisk, мы также рекомендуем добавить оповещение о добавлении CDR записи через AJAM интерфейс.
Для этого необходимо включить опцию в файле настроек.
;
; Asterisk Call Management CDR
;
[general]
enabled = yes
Таким образом после запроса записей за период, все новые записи о звонках будут добавляться динамически в историю при поступлении соответствующего эвента.
===== Работа с базой данных CDR напрямую из 1С: Предприятия 8 =====
Возможно специалистам 1С, будет проще работать с базой данных через новую возможность платформы 1С:Предприятие 8 //Внешние источники данных//.
В блоге Николая Бекетова, описан процесс подключения к [[http://www.miko.ru/blogs/SwordBlog/52/|базе данных из 1С]].
В результате достаточно настроить связь с базой CDR записей и добавить в конфигурацию общий модуль **МИКО_Астериск_Сервер**
//Функция генерирует строку соединения с сервером через ODBC драйвер
Функция СформироватьСтрокуСоединенияСАстерискСервером(host,database,user,pass)
СтрокаСоединения = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER="+host+"; DATABASE="+database+"; UID="+user+"; PWD="+pass;
Возврат СтрокаСоединения;
КонецФункции
//Функция возвращает информацию о звонках с сервера телефонии
Функция ВернутьЗаписиCDRДляТекущегоПользователя(ДатаНачало, ДатаОкончания,КаналЛокальный,КаналСотовый) Экспорт
СтрокаСоединенияСАстерискСервером = СформироватьСтрокуСоединенияСАстерискСервером("ASTERISK_HOST","ASTERISK_cdrdb","ASTERISK_cdrdb_login","ASTERISK_cdrdb_password");
ПараметрыСоединенияСАстерискомМИКО = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединенияСАстерискомМИКО.СтрокаСоединения = СтрокаСоединенияСАстерискСервером;
ВнешниеИсточникиДанных.Asterisk.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединенияСАстерискомМИКО);
ВнешниеИсточникиДанных.Asterisk.УстановитьСоединение();
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВЫРАЗИТЬ(cdr.calldate КАК ДАТА) КАК calldate,
| cdr.clid,
| cdr.src,
| cdr.dst,
| cdr.dcontext,
| cdr.channel,
| cdr.dstchannel,
| cdr.lastapp,
| cdr.lastdata,
| cdr.duration,
| cdr.billsec,
| cdr.disposition,
| cdr.amaflags,
| cdr.accountcode,
| cdr.uniqueid,
| cdr.userfield,
| cdr.recordingfile
|ИЗ
| ВнешнийИсточникДанных.Asterisk.Таблица.cdr КАК cdr
|ГДЕ
| (cdr.dstchannel ПОДОБНО ""%"" + &НашКанал + ""%""
| ИЛИ cdr.channel ПОДОБНО ""%"" + &НашКанал + ""%""
| ИЛИ cdr.dstchannel ПОДОБНО ""%"" + &НашКаналСотовый + ""%""
| ИЛИ cdr.channel ПОДОБНО ""%"" + &НашКаналСотовый + ""%"")
| И ВЫРАЗИТЬ(cdr.calldate КАК ДАТА) МЕЖДУ &НачалоДня И &КонецДня
|
|УПОРЯДОЧИТЬ ПО
| calldate УБЫВ
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("НашКанал",СокрЛП(КаналЛокальный));
Запрос.УстановитьПараметр("НашКаналСотовый",СокрЛП(КаналСотовый));
Запрос.УстановитьПараметр("НачалоДня",ДатаНачало);
Запрос.УстановитьПараметр("КонецДня",ДатаОкончания);
Результат = Запрос.Выполнить();
ТЗ=Результат.Выгрузить();
Возврат ТЗ;
КонецФункции
Готовые файлы скриптов лежат в дистрибутиве поставки панели Asterisk для 1C
Если для вас данная инструкция оказалась сложной, не стесняйтесь,[[http://www.miko.ru/contacts/|пишите, звоните]], мы поможем или предложим настроенные решения от партнеров.
==== Полезные ссылки ====
* [[doc:1cajam:astcastomize|Общая предварительная настройка AJAM интерфейса Asterisk.]]
* [[astpanel:ats:asterisk:environments|Настройка передачи общих параметров системы из Asterisk]]
* [[astpanel:ats:asterisk:callhistory|Настройка получения истории звонков в панели 1С]]
* [[astpanel:ats:asterisk:playrecords|Настройка проигрывания записи разговора по запросу панели 1С]]
* [[astpanel:ats:asterisk:downrec|Настройка скачивания файла записи пользователем из панели телефонии]]
* [[astpanel:ats:asterisk:faxhistory|Настройка отображения истории факсимильных сообщений в панели 1С]]
* [[astpanel:ats:asterisk:faxsend|Настройка отправки факсимильного сообщения из 1С]]
* [[astpanel:ats:asterisk:downfax|Настройка скачивания файла факса пользователем из панели телефонии]]
==== Комментарии ====
~~DISQUS~~