Это старая версия документа!
В панели реализована функция получения истории звонков с сервера asterisk, путем генерации вызова с номера 999 на номер 555 используя приведенный ниже диалплан.
[mikoajamdll] exten => 999,1,NoCDR() exten => 999,n,Answer() exten => 999,n,Wait(60) exten => 999,n,Hangup() exten => 555,1,NoCDR() exten => 555,2,Set(num=0) exten => 555,3,Set(chan=${v1}) exten => 555,4,Set(date1=${v2}) exten => 555,5,Set(chanmob=${v3}) exten => 555,6,Set(dbname=${v4}) exten => 555,7,Set(user=${v5}) exten => 555,8,Set(password=${v6}) exten => 555,9,Set(packet=20) exten => 555,10,Answer() exten => 555,11,System( mysql -sse 'SELECT calldate,src,dst,channel,dstchannel,billsec,disposition,uniqueid,userfield,recordingfile,lastapp FROM cdr WHERE lastapp="Dial" AND calldate Like ${QUOTE(${date1}%)} AND (dstchannel Like ${QUOTE(${chan}%)} OR channel Like ${QUOTE(${chan}%)} OR dstchannel Like ${QUOTE(${chanmob}%)} OR channel Like ${QUOTE(${chanmob}%)}) ' -u${user} -p${password} ${dbname}> /var/log/asterisk/cdr-csv/${UNIQUEID}) exten => 555,12,Set(kls=${SHELL(cat /var/log/asterisk/cdr-csv/${UNIQUEID} |wc -l)}) exten => 555,13,Gotoif($[ ${kls} = 0 ]?20:14) exten => 555,14,Set(ostatok=${kls}) exten => 555,15,Set(packet=${IF($[ ${ostatok} < ${packet}]?${ostatok}:${packet})}) exten => 555,16,Set(num=$[${num} + ${packet}]) exten => 555,17,UserEvent(FromCDR,Channel: ${chan},Date: ${date1},Lines: ${QUOTE(${SHELL(cat /var/log/asterisk/cdr-csv/${UNIQUEID} |head -n '${num}'| tail -n '${packet}'| sed 's/[\t]/'\',\''/g'|sed 's/$/...../g'|tr "\n" " ")})}) exten => 555,18,Set(ostatok=$[${ostatok}-${packet}]) exten => 555,19,Gotoif($[ ${ostatok} > 0 ]?15:20) exten => 555,20,System(rm /var/log/asterisk/cdr-csv/${UNIQUEID}) exten => 555,21,Gotoif($[${kls}>0]?22:23) exten => 555,22,UserEvent(Refresh1CHistory,Channel: ${chan},Date: ${date1}) exten => 555,23,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
Возможно специалистам 1С, будет проще работать с базой данных через новую возможность платформы 1С:Предприятие 8 Внешние источники данных. В блоге Николая Бекетова, описан процесс подключения к базе данных из 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 УБЫВ |АВТОУПОРЯДОЧИВАНИЕ"; Запрос.УстановитьПараметр("НашКанал",СокрЛП(КаналЛокальный)); Запрос.УстановитьПараметр("НашКаналСотовый",СокрЛП(КаналСотовый)); Запрос.УстановитьПараметр("НачалоДня",ДатаНачало); Запрос.УстановитьПараметр("КонецДня",ДатаОкончания); Результат = Запрос.Выполнить(); ТЗ=Результат.Выгрузить(); Возврат ТЗ; КонецФункции