Интеграция учетной системы «1С:Предприятие» с IP-телефонией Asterisk — одна из наиболее частых задач при автоматизации отделов продаж и служб поддержки. Особую сложность она приобретает тогда, когда вся серверная инфраструктура (и сервер 1С, и сервер АТС) функционирует под управлением операционных систем семейства Linux, а количество одновременных разговоров превышает 100 соединений. При такой нагрузке классические подходы с использованием нестабильных внешних компонент или прямым подключением каждого клиента к АТС могут привести к отказу всей телефонной сети.
В этой статье мы подробно разберем, как спроектировать надежную отказоустойчивую архитектуру интеграции, какие встроенные механизмы платформы 1С использовать для работы с Asterisk на Linux без Windows-компонент, а также проанализируем готовые решения, доступные на рынке.
В обсуждениях часто предлагают простое решение: настроить на стороне тонкого клиента 1С прямое подключение к AMI (Asterisk Manager Interface) через TCP-сокет. Давайте проанализируем, почему для 100+ одновременных звонков и сотен работающих пользователей этот подход является критической ошибкой.
Интерфейс AMI работает по принципу трансляции событий. Когда в системе происходит любое действие (поднятие трубки, набор номера, перевод звонка, смена статуса оператора), Asterisk генерирует событие и отправляет его во все открытые AMI-сессии. Если у вас 150 менеджеров открыли 150 сеансов 1С, каждый из которых держит прямое TCP-соединение с AMI, то при каждом событии Asterisk будет вынужден дублировать и рассылать это сообщение 150 раз. При интенсивном входящем и исходящем трафике объемы сетевых пакетов растут лавинообразно. Процессор АТС уходит в 100% нагрузку, начинаются задержки в передаче голоса (фризы, заикания), а сам процесс Asterisk может аварийно завершить работу.
Для решения этой проблемы мы должны использовать промежуточное звено (Middleware). Схема правильного взаимодействия выглядит следующим образом:
Если мы используем актуальные версии платформы «1С:Предприятие 8», начиная с релиза 8.3.27, нам больше не нужны сторонние внешние компоненты (компоненты от МИКО, ROM-Asterisk и другие библиотеки формата .so под Linux). В платформе появился штатный асинхронный объект WebSocketКлиент, который прекрасно работает на клиентах под управлением как Windows, так и Linux.
Рассмотрим пример реализации подключения к нашему промежуточному серверу телефонии на стороне клиента 1С:
&НаКлиенте
Перем СокетТелефонии;
&НаКлиенте
Процедура ПодключитьТелефонию()
// Адрес нашего промежуточного сервиса-фильтра событий
АдресСервиса = "ws://192.168.1.50:8080/phone-events";
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer UserToken_12345");
Заголовки.Вставить("ExtensionPhone", "101"); // Внутренний номер менеджера
СокетТелефонии = Новый WebSocketКлиент;
// Назначаем обработчики событий сокета
ДобавитьОбработчик СокетТелефонии.ПриПолученииСообщения, ПолучитьСобытиеЗвонка;
ДобавитьОбработчик СокетТелефонии.ПриЗакрытии, СоединениеЗакрыто;
ДобавитьОбработчик СокетТелефонии.ПриОшибке, ОшибкаСоединения;
Попытка
СокетТелефонии.Подключить(АдресСервиса, Заголовки);
ПоказатьОповещениеПользователя("Телефония",, "Подключение к АТС успешно установлено");
Исключение
ЗаписатьЛогОшибки(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Теперь разберем, как обрабатывать входящие сообщения от промежуточного сервера для автоматического открытия карточки звонка или контрагента:
&НаКлиенте
Процедура ПолучитьСобытиеЗвонка(Сокет, Сообщение)
ТемаСобытия = Сообщение.ПолучитьТекст();
// Десериализуем JSON-событие от нашего Middleware
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТемаСобытия);
ДанныеЗвонка = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Проанализируем тип события
Если ДанныеЗвонка.Событие = "IncomingCall" Тогда
// Открываем форму звонка или карточку клиента
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("НомерТелефона", ДанныеЗвонка.CallerID);
ПараметрыФормы.Вставить("АвтоСоздание", Истина);
ОткрытьФорму("Документ.ТелефонныйЗвонок.ФормаОбъекта", ПараметрыФормы);
КонецЕсли;
КонецПроцедуры
Использование штатного WebSocket-клиента гарантирует стабильную асинхронную работу интерфейса 1С без зависаний основного потока приложения.
Что делать, если ваша база работает на старых версиях платформы 1С, где объекта WebSocketКлиент еще нет, а использовать внешние компоненты в Linux-клиентах крайне нежелательно? Выясним, как обойти это ограничение.
В Asterisk встроен специальный веб-интерфейс под названием AJAM (Asynchronous Javascript Asterisk Manager). Он позволяет взаимодействовать с AMI посредством обычных HTTP-запросов (GET и POST). Для совершения исходящего звонка («Click-to-Call») из 1С нам не нужно держать сокет-соединение. Мы можем отправить простой асинхронный HTTP-запрос на веб-сервер Asterisk.
Посмотрим на пример отправки команды совершения вызова из 1С на сервер Asterisk через AJAM:
&НаСервереБезКонтекста
Процедура ВыполнитьИсходящийЗвонок(ВнутреннийНомер, НомерКлиента)
// Настраиваем подключение к веб-серверу Asterisk (AJAM)
СерверАстера = "192.168.1.50";
ПортAJAM = 8088;
Соединение = Новый HTTPСоединение(СерверАстера, ПортAJAM);
// Формируем URI для авторизации и выполнения звонка Action: Originate
ТекстЗапроса = "/ajam/rawman?action=login&username=1c_user&secret=my_secret_pass"
+ "&action=originate"
+ "&channel=SIP/" + ВнутреннийНомер
+ "&exten=" + НомерКлиента
+ "&context=from-internal"
+ "&priority=1"
+ "&callerid=" + ВнутреннийНомер;
Запрос = Новый HTTPЗапрос(ТекстЗапроса);
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение "Ошибка АТС: " + Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
Исключение
ЗаписатьЛогОшибки(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Этот метод не требует удержания постоянных соединений со стороны клиентов 1С, что существенно снижает нагрузку на сеть и АТС при росте количества рабочих мест.
Если для работы менеджеров используются не программные телефоны (софтфоны), а надежные аппаратные IP-телефоны (например, Yealink, Grandstream), мы можем полностью отказаться от удержания соединений из 1С к Asterisk для отслеживания входящих звонков. Вместо этого настроим интеграцию со стороны Asterisk с помощью технологии AGI (Asterisk Gateway Interface).
При таком подходе Asterisk сам инициирует обращение к 1С в момент совершения звонка:
Этот подход гарантирует 100% отказоустойчивость, так как трансляция миллионов технических событий из Asterisk в 1С полностью отсутствует. Вызовы к 1С происходят строго по факту совершения звонков.
Если перед вами стоит задача быстро запустить проект без написания собственной интеграционной логики и промежуточных сервисов с нуля, рассмотрим актуальное состояние готовых тиражных решений, поддерживающих работу под Linux:
.cfe) и публикацию веб-сервисов. Вся обработка звонков вынесена в локальный или облачный коннектор-сервер. Такое решение полностью кроссплатформенно, работает под Linux (как на сервере, так и на клиентах) и успешно поддерживает веб-клиенты 1С.
Интеграция 1С и Asterisk под Linux при высокой нагрузке (100+ одновременных звонков) абсолютно реальна и стабильна, если соблюдать ключевые правила архитектуры:
WebSocketКлиент в современных версиях платформы 1С для безопасного асинхронного приема событий на клиентах под управлением Linux.