Внимание!
Эта wiki об устаревших версиях
Документация к актуальной версии интеграции 1С и телефонии доступна по ссылке

Инструменты пользователя

Инструменты сайта


doc:panel1ccrm:asterisk_config

Это старая версия документа!


Настройка сервера ASTERISK для работы с панелью телефонии 1C:CRM

Настройка ajam интерфейса

Настройка ajam интерфейса подробно описана в разделе Настройка сервера Asterisk для работы с компонентой.

Настройка дополнительного диалплана для получения истории звонков

Источник истории звонков база данных MYSQL

В панели реализована функция получения истории звонков с сервера asterisk, путем генерации вызова с номера 999 на номер 555 используя приведенный ниже диалплан.

extensions_miko.conf
[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

Источник истории звонков файл MASTER.CSV

Существенным ограничением данного метода является сильная нагрузка на процессор asterisk при парсинге csv файла.

Метод парсинга файла мы рекомендуем только в образовательных целях, как самый простой в реализации. Лучше работать с базой данных.
extensions_miko.conf
[mikoajamdll]
exten => 555,1,NoCDR()
exten => 555,2,Set(cdrfile=/var/log/asterisk/cdr-custom/Master.csv)
exten => 555,3,Set(line=0)
exten => 555,4,Answer()
exten => 555,5,Set(filestr=${QUOTE(${SHELL(awk -F'","' '($5~/^${chan}/ || $6~/^${chan}/ || $8~/^${chan}/) && ((substr($9,1,4) substr($9,6,2) substr($9,9,2))>=${date}) && ((substr($9,1,4) substr($9,6,2) substr($9,9,2))<=${date}) {print $0}' ${cdrfile} | tail -n +${line} | head -n 1)})})
exten => 555,6,Gotoif($[${LEN(${filestr})} <= 4]?10:7)
exten => 555,7,UserEvent(FromCDR,Channel: ${chan},Date: ${date},Lines: ${QUOTE(${filestr})})
exten => 555,8,Set(line=$[${line} + 1])
exten => 555,9,Goto(5)
exten => 555,10,Hangup()

exten => 999,1,NoCDR()
exten => 999,n,Answer()
exten => 999,n,Wait(60)
exten => 999,n,Hangup()

Скрипт может потребовать модификации, если последовательность полей в файле не соответствует используемой нами. Для минимального количества модификаций, просто пропишите последовательность полей в файле /etc/asterisk/cdr_custom.conf согласно приведенному ниже примеру

cdr_custom.conf
[mappings]
Master.csv => ${CSV_QUOTE(${CDR(start)})},${CSV_QUOTE(${CDR(src)})},${CSV_QUOTE(${CDR(dst)})},${CSV_QUOTE(${CDR(channel)})},${CSV_QUOTE(${CDR(dstchannel)})},${CSV_QUOTE(${CDR(billsec)})},${CSV_QUOTE(${CDR(disposition)})},${CSV_QUOTE(${CDR(uniqueid)})},${CSV_QUOTE(${CDR(userfield)})},${CSV_QUOTE(${CDR(recordingfile)})},${CSV_QUOTE(${CDR(lastapp)})}

Настройка дополнительного диалплана для прослушивания записей разговоров из 1С

Для прослушивания звонков из 1с, нам необходима возможность получения имени файла звонка по уникальному идентификатору.

Добавим в диалплан mikoajamdll следующие строчки:

exten => 777,1,NoCDR()
exten => 777,2,Answer()
exten => 777,3,Set(monitor_path=/var/spool/asterisk/monitor)
exten => 777,4,Set(recordingfile=${SHELL(mysql -sse 'SELECT recordingfile FROM cdr WHERE uniqueid Like ${QUOTE(${uniqueid1c}%)} LIMIT 1' -u${user} -p${password} ${dbname})})
exten => 777,5,Gotoif($[${LEN(${recordingfile})} > 4]?8:6)
exten => 777,6,Set(recordingfile=${SHELL(mysql -sse 'SELECT userfield FROM cdr WHERE uniqueid Like ${QUOTE(${uniqueid1c}%)} LIMIT 1' -u${user} -p${password} ${dbname})})
exten => 777,7,Gotoif($[${LEN(${recordingfile})} > 4]?8:11)
exten => 777,8,Set(namedorashiren=$[${LEN(${recordingfile})}-4])
exten => 777,9,Set(recfile=${SHELL(find ${monitor_path} -name *${recordingfile:0:${namedorashiren}}*|head -n 1)})
exten => 777,10,UserEvent(CallRecord,Channel: ${chan},FileName: ${recfile})
exten => 777,11,Hangup()

Настройка дополнительного диалплана для отправки факсимильных сообщения из 1С

Для отправки факсимильного сообщения из 1C, нам необходимо также дописать в диалплан mikoajamdll дополнительные строки:

exten => 333,1,Answer()
exten => 333,n,NoCDR()
exten => 333,n,NoOp(SendFAX amifaxfile=${amifaxfile})
exten => 333,n,SendFAX(${amifaxfile})
exten => 333,n,NoOp(FaxStatus : ${FAXSTATUS})
exten => 333,n,NoOp(FaxStatusString : ${FAXSTATUSSTRING})
exten => 333,n,NoOp(FaxError : ${FAXERROR})
exten => 333,n,NoOp(RemoteStationID : ${REMOTESTATIONID})
exten => 333,n,NoOp(FaxPages : ${FAXPAGES})
exten => 333,n,Hangup()
Готовые файл скриптов лежит в дистрибутиве поставки панели asterisk для 1C:CRM

Если у вас в CDR БД отсутствует поле recordingfile, то нужно его добавить вручную. На MySQL это выглядит следующим образом.

 ALTER TABLE `cdr` ADD `recordingfile` VARCHAR(120) NOT NULL 

Так же необходимо внести изменения в контекст записи разговоров. Для FreePBX это [macro-record-enable]. Скопируйте его из extensions_additional.conf в extensions_override_freepbx.conf, и после назначения переменной имени файла записи добавьте следующую строку:

exten => s,n,Set(CDR(recordingfile)=${CALLFILENAME})

Работа с базой данных CDR напрямую из 1С: Предприятия 8

Возможно специалистам 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 УБЫВ
	               |АВТОУПОРЯДОЧИВАНИЕ";
 
	Запрос.УстановитьПараметр("НашКанал",СокрЛП(КаналЛокальный));
	Запрос.УстановитьПараметр("НашКаналСотовый",СокрЛП(КаналСотовый));
	Запрос.УстановитьПараметр("НачалоДня",ДатаНачало);
	Запрос.УстановитьПараметр("КонецДня",ДатаОкончания);
 
	Результат = Запрос.Выполнить();
 
	ТЗ=Результат.Выгрузить();
	Возврат ТЗ;
 
КонецФункции
 
// Возвращает с астериска запись разговора по переданному уникальному идентификатору
//
// Параметры
//  <Дата начала периода поиска>  - <Тип.Дата> 
//  <Дата окончания периода поиска>  - <Тип.Дата> 
//  <ID>  - <Тип.Строка> - Для каждого звонка Астериск возвращает такой идентификатор
//
// Возвращаемое значение:
// 
//	Таблица значений со строкой CDR Записи разговоров
// 
Функция ВернутьЗаписьCDRДляУникальногоIDЗвонка(ДатаНачало,ДатаОкончания,ID) Экспорт
 
    ПозицияТочкиВИД=Найти(ID,".");
	ИДДляПоиска=Лев(ID,ПозицияТочкиВИД)+"%";
 
	СтрокаСоединенияСАстерискСервером = СформироватьСтрокуСоединенияСАстерискСервером("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 КАК duration,
	               |	cdr.billsec,
	               |	cdr.disposition,
	               |	cdr.amaflags,
	               |	cdr.accountcode,
	               |	cdr.uniqueid,
	               |	cdr.userfield,
	               |	cdr.recordingfile 
	               |ИЗ
	               |	ВнешнийИсточникДанных.Asterisk.Таблица.cdr КАК cdr
	               |ГДЕ
	               |	ВЫРАЗИТЬ(cdr.calldate КАК ДАТА) МЕЖДУ &НачалоДня И &КонецДня
	               |	И cdr.uniqueid ПОДОБНО &uniqueid
	               |	И cdr.disposition = ""ANSWERED""
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	duration УБЫВ
	               |АВТОУПОРЯДОЧИВАНИЕ";
 
	Запрос.УстановитьПараметр("uniqueid",ИДДляПоиска);
	Запрос.УстановитьПараметр("НачалоДня",ДатаНачало);
	Запрос.УстановитьПараметр("КонецДня",ДатаОкончания);
 
	Результат = Запрос.Выполнить();
 
	ТЗ=Результат.Выгрузить();
	Если ТЗ.Количество()>0 Тогда
		Возврат ТЗ;	
	Иначе
		Возврат "";	
	КонецЕсли; 
 
КонецФункции // ВернутьЗаписьCDRДляУникальногоIDЗвонка()
Если для вас данная инструкция оказалась сложной, не стесняйтесь, пишите, звоните, мы поможем или предложим настроенные решения от партнеров.

Комментарии

doc/panel1ccrm/asterisk_config.1328614023.txt.gz · Последние изменения: 2014/11/14 22:32 (внешнее изменение)