Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
doc:panel1ccrm:asterisk_config:callhistory [2013/02/15 11:12] nb |
doc:panel1ccrm:asterisk_config:callhistory [2014/11/14 22:32] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ===== Настройка Asterisk для получения истории звонков в панели 1С ===== | + | {{page>astpanel:ats:asterisk:callhistory}} |
- | + | ||
- | ==== Источник истории звонков база данных MYSQL ==== | + | |
- | В панели реализована функция получения истории звонков с сервера asterisk, путем генерации вызова с номера 0000999 на номер 0000555 используя приведенный ниже диалплан. | + | |
- | + | ||
- | <file - extensions_miko.conf> | + | |
- | [miko_ajam] | + | |
- | exten => 0000999,1,NoCDR() | + | |
- | exten => 0000999,n,Answer() | + | |
- | exten => 0000999,n,Wait(60) | + | |
- | exten => 0000999,n,Hangup() | + | |
- | + | ||
- | 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,Answer() | + | |
- | 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,Hangup() | + | |
- | </file> | + | |
- | + | ||
- | Для базы звонков в 100000 записей, отображение истории в 1С за определенный день занимает 3-5 секунд. Потому мы рекомендуем именно этот способ работы с CDR записями. | + | |
- | Быстрее только прямое обращение к базе данных CDR из 1С, не используя функционал Asterisk. | + | |
- | + | ||
- | Для включения этого файла в работу необходимо положить его в директорию /etc/asterisk/ и проинклюдить в файле /etc/asterisk/extensions.conf с помощью следующей команды: | + | |
- | <code> | + | |
- | #include extensions_miko.conf | + | |
- | </code> | + | |
- | + | ||
- | Если вы используете сборку asterisk с оболочкой freepbx тогда вам необходимо использовать extensions_override_freepbx.conf вместо extensions.conf | + | |
- | + | ||
- | Для сокращения количества обращений к серверу Asterisk, мы также рекомендуем добавить оповещение о добавлении CDR записи через AJAM интерфейс. | + | |
- | Для этого необходимо включить опцию в файле настроек. | + | |
- | <file - cdr_manager.conf> | + | |
- | ; | + | |
- | ; Asterisk Call Management CDR | + | |
- | ; | + | |
- | [general] | + | |
- | enabled = yes | + | |
- | </file> | + | |
- | Таким образом после запроса записей за период, все новые записи о звонках будут добавляться динамически в историю при поступлении соответствующего эвента. | + | |
- | + | ||
- | ===== Работа с базой данных CDR напрямую из 1С: Предприятия 8 ===== | + | |
- | Возможно специалистам 1С, будет проще работать с базой данных через новую возможность платформы 1С:Предприятие 8 //Внешние источники данных//. | + | |
- | В блоге Николая Бекетова, описан процесс подключения к [[http://www.miko.ru/blogs/SwordBlog/52/|базе данных из 1С]]. | + | |
- | В результате достаточно настроить связь с базой CDR записей и добавить в конфигурацию общий модуль **МИКО_Астериск_Сервер** | + | |
- | <code 1c> | + | |
- | //Функция генерирует строку соединения с сервером через 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 УБЫВ | + | |
- | |АВТОУПОРЯДОЧИВАНИЕ"; | + | |
- | + | ||
- | Запрос.УстановитьПараметр("НашКанал",СокрЛП(КаналЛокальный)); | + | |
- | Запрос.УстановитьПараметр("НашКаналСотовый",СокрЛП(КаналСотовый)); | + | |
- | Запрос.УстановитьПараметр("НачалоДня",ДатаНачало); | + | |
- | Запрос.УстановитьПараметр("КонецДня",ДатаОкончания); | + | |
- | + | ||
- | Результат = Запрос.Выполнить(); | + | |
- | + | ||
- | ТЗ=Результат.Выгрузить(); | + | |
- | Возврат ТЗ; | + | |
- | + | ||
- | КонецФункции | + | |
- | </code> | + | |
- | + | ||
- | <note tip>Готовые файлы скриптов лежат в дистрибутиве поставки панели Asterisk для 1C</note> | + | |
- | + | ||
- | <note important>Если для вас данная инструкция оказалась сложной, не стесняйтесь,[[http://www.miko.ru/contacts/|пишите, звоните]], мы поможем или предложим настроенные решения от партнеров.</note> | + | |
- | + | ||
- | + | ||
- | ==== Полезные ссылки ==== | + | |
- | * [[doc:1cajam:astcastomize|Общая предварительная настройка AJAM интерфейса Asterisk.]] | + | |
- | * [[doc:panel1ccrm:asterisk_config:environments|Настройка передачи общих параметров системы из Asterisk]] | + | |
- | * [[doc:panel1ccrm:asterisk_config:callhistory|Настройка получения истории звонков в панели 1С]] | + | |
- | * [[doc:panel1ccrm:asterisk_config:playrecords|Настройка проигрывания записи разговора по запросу панели 1С]] | + | |
- | * [[doc:panel1ccrm:asterisk_config:downrec|Настройка скачивания файла записи пользователем из панели телефонии]] | + | |
- | * [[doc:panel1ccrm:asterisk_config:faxhistory|Настройка отображения истории факсимильных сообщений в панели 1С]] | + | |
- | * [[doc:panel1ccrm:asterisk_config:faxsend|Настройка отправки факсимильного сообщения из 1С]] | + | |
- | * [[doc:panel1ccrm:asterisk_config:downfax|Настройка скачивания файла факса пользователем из панели телефонии]] | + | |
- | + | ||
- | + | ||
- | ==== Комментарии ==== | + | |
- | + | ||
- | ~~DISQUS~~ | + |