Как организовать выгрузку ссылок на записи разговоров из Asterisk в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Интеграция 1С с телефонией Asterisk — это задача, которая часто начинается с использования готовых внешних компонент. Однако, как показывает практика, при высокой нагрузке или обновлении платформы 1С такие компоненты могут работать нестабильно, вызывать зависания или обрывы сессий. В этой статье мы разберем, как уйти от зависимости от проприетарных компонент и реализовать надежный механизм получения данных о звонках и ссылок на записи напрямую из первоисточника.

Метод 1. Прямое подключение к базе данных MySQL (CDR)

Самый надежный способ получить историю звонков за определенный период — это прямое обращение к таблице CDR (Call Detail Records) сервера Asterisk. В этой таблице фиксируется каждый завершенный вызов. Для реализации этого метода в 1С мы будем использовать объект ADODB.Connection.

Рассмотрим пошагово, как настроить получение данных:

  1. Настройка доступа: На сервере Asterisk необходимо разрешить подключения к MySQL с IP-адреса сервера 1С.
  2. Создание соединения: В коде 1С мы инициализируем подключение к базе данных Asterisk.
  3. Выполнение запроса: Формируем SQL-запрос для получения записей за нужный интервал времени.

Пример кода для подключения и получения данных:


// Создаем объект соединения
Соединение = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Driver={MySQL ODBC 8.0 Driver};Server=" + Сервер + ";Port=3306;Database=" + БазаДанных + ";User=" + Логин + ";Password=" + Пароль + ";Option=3;";

Попытка
    Соединение.Open(ConnectionString);
Исключение
    Сообщить("Ошибка подключения к MySQL: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Формируем текст запроса к таблице CDR
ТекстЗапроса = "SELECT calldate, src, dst, duration, uniqueid, recordingfile 
               |FROM cdr 
               |WHERE calldate >= '" + Формат(ДатаНачала, "ДФ=yyyy-MM-dd HH:mm:ss") + "'";

RecordSet = Соединение.Execute(ТекстЗапроса);

Пока НЕ RecordSet.EOF Цикл
    // Обработка данных звонка
    УникальныйИдентификатор = RecordSet.Fields("uniqueid").Value;
    ИмяФайлаЗаписи = RecordSet.Fields("recordingfile").Value;
    
    // Здесь логика записи в регистр 1С
    RecordSet.MoveNext();
КонецЦикла;
Соединение.Close();

Проанализируем поле recordingfile. В стандартной конфигурации Asterisk в него записывается имя файла (например, audio-162000000.wav). Чтобы превратить это в полноценную ссылку, нам нужно знать путь, по которому веб-сервер (например, Nginx) отдает эти файлы.

Метод 2. Использование HTTP-сервисов (Event-driven подход)

Если нам нужно не только выгружать историю, но и оперативно реагировать на звонки (показывать карточку клиента), лучше использовать механизм HTTP-сервисов в 1С. В этом случае Asterisk сам "пинает" 1С в момент наступления события.

Разберем, как это работает:

  1. В 1С создается HTTP-сервис с методом POST.
  2. В диалплане Asterisk (файл extensions.conf) или через Agi-скрипт прописывается вызов этого сервиса при завершении звонка (экстеншн h).
  3. Asterisk отправляет JSON с данными о звонке, включая Uniqueid и ссылку на запись.

Пример структуры кода в 1С для приема данных от Asterisk:


Функция ПринятьСобытиеЗвонка(Запрос)
    ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку();
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ТелоЗапроса);
    ДанныеЗвонка = ПрочитатьJSON(ЧтениеJSON);
    
    // Логика поиска клиента по номеру из ДанныеЗвонка.src
    // Создание документа "Событие" или "Звонок"
    
    Ответ = Новый HTTPСервисОтвет(200);
    Возврат Ответ;
КонецФункции

Метод 3. Работа через AMI (Asterisk Manager Interface)

Для продвинутых задач можно использовать AMI. Это TCP-протокол, который позволяет 1С подключаться к Asterisk и слушать поток всех событий в реальном времени. В отличие от внешних компонент, работу с AMI можно реализовать на чистом коде 1С, используя объект НТТРСоединение (в случае с ARI) или через сокеты.

Важный нюанс: При использовании AMI важно правильно фильтровать события. Нам интересны события Hangup или VarSet, где передаются переменные с путями к записям. Если 1С работает через РегламентныеЗадания, AMI может быть избыточен, и лучше вернуться к методу с MySQL.

Метод 4. Анализ CEL для сложных сценариев

При переводах звонков, использовании очередей или переадресаций таблица CDR может содержать неполную информацию (например, один общий звонок может разбиться на несколько записей). В таких случаях проанализируем таблицу CEL (Channel Event Logging).

Таблица CEL фиксирует каждое изменение состояния канала. Поле linkedid связывает все события одного входящего звонка, даже если он переводился между пятью менеджерами. Сопоставляя uniqueid из CDR и linkedid из CEL, мы можем собрать в 1С цепочку из нескольких аудиофайлов, относящихся к одному обращению клиента.

Организация доступа к файлам записей

Чтобы ссылка на запись в 1С открывалась у пользователя, файл должен быть доступен по протоколу HTTP или HTTPS. Разберем наиболее эффективную схему:

Пример формирования ссылки в 1С:

СсылкаНаЗапись = "https://asterisk.mycompany.ru/records/" + Формат(ДатаЗвонка, "ДФ=yyyy/MM/dd/") + ИмяФайла + ".mp3";

Итоги

Мы рассмотрели несколько подходов к интеграции. Для реализации регламентной загрузки "вчерашних" или пропущенных звонков идеальным решением является прямое чтение таблицы CDR через MySQL. Это исключает проблемы с зависанием интерфейса 1С и гарантирует, что ни один звонок не будет потерян из-за сбоя в работе компоненты. Для оперативной работы (всплывающие окна) лучше всего подходят HTTP-сервисы 1С, которые АТС вызывает самостоятельно.

← На главную