Как интегрировать 1С с телефонией Asterisk на Linux при нагрузке 100+ одновременных звонков?

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

Интеграция учетной системы «1С:Предприятие» с IP-телефонией Asterisk — одна из наиболее частых задач при автоматизации отделов продаж и служб поддержки. Особую сложность она приобретает тогда, когда вся серверная инфраструктура (и сервер 1С, и сервер АТС) функционирует под управлением операционных систем семейства Linux, а количество одновременных разговоров превышает 100 соединений. При такой нагрузке классические подходы с использованием нестабильных внешних компонент или прямым подключением каждого клиента к АТС могут привести к отказу всей телефонной сети.

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


Архитектурная проблема 100+ звонков: почему Asterisk может «упасть»

В обсуждениях часто предлагают простое решение: настроить на стороне тонкого клиента 1С прямое подключение к AMI (Asterisk Manager Interface) через TCP-сокет. Давайте проанализируем, почему для 100+ одновременных звонков и сотен работающих пользователей этот подход является критической ошибкой.

Интерфейс AMI работает по принципу трансляции событий. Когда в системе происходит любое действие (поднятие трубки, набор номера, перевод звонка, смена статуса оператора), Asterisk генерирует событие и отправляет его во все открытые AMI-сессии. Если у вас 150 менеджеров открыли 150 сеансов 1С, каждый из которых держит прямое TCP-соединение с AMI, то при каждом событии Asterisk будет вынужден дублировать и рассылать это сообщение 150 раз. При интенсивном входящем и исходящем трафике объемы сетевых пакетов растут лавинообразно. Процессор АТС уходит в 100% нагрузку, начинаются задержки в передаче голоса (фризы, заикания), а сам процесс Asterisk может аварийно завершить работу.

Для решения этой проблемы мы должны использовать промежуточное звено (Middleware). Схема правильного взаимодействия выглядит следующим образом:

  1. Создается отдельный легковесный демон-коннектор (написанный, например, на Go, Python или Node.js), который запускается в Docker-контейнере на сервере Linux рядом с Asterisk.
  2. Этот коннектор держит всего одно постоянное master-подключение к Asterisk по AMI (или современному ARI).
  3. Коннектор принимает абсолютно все события от АТС, фильтрует их внутри себя и определяет, какому конкретно пользователю 1С адресовано данное событие (по номеру внутреннего телефона/аккаунта).
  4. Коннектор отправляет точечный HTTP-запрос или WebSocket-сообщение исключительно в сессию 1С того менеджера, которому поступает звонок. Нагрузка на Asterisk при этом остается минимальной и стабильной.

Решение 1. Использование встроенного WebSocket-клиента в 1С (Платформа 8.3.27+)

Если мы используем актуальные версии платформы «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С без зависаний основного потока приложения.


Решение 2. Использование AJAM (Asynchronous Javascript Asterisk Manager) для старых платформ

Что делать, если ваша база работает на старых версиях платформы 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С, что существенно снижает нагрузку на сеть и АТС при росте количества рабочих мест.


Решение 3. Интеграция на уровне диалплана через AGI-скрипты (без софтфонов)

Если для работы менеджеров используются не программные телефоны (софтфоны), а надежные аппаратные IP-телефоны (например, Yealink, Grandstream), мы можем полностью отказаться от удержания соединений из 1С к Asterisk для отслеживания входящих звонков. Вместо этого настроим интеграцию со стороны Asterisk с помощью технологии AGI (Asterisk Gateway Interface).

При таком подходе Asterisk сам инициирует обращение к 1С в момент совершения звонка:

  1. Входящий вызов поступает на АТС Asterisk.
  2. В диалплане (dialplan) Asterisk прописывается вызов AGI-скрипта (написанного на Python, PHP или Bash).
  3. AGI-скрипт отправляет быстрый HTTP-запрос к опубликованной базе 1С через HTTP-сервис 1С (REST API).
  4. 1С выполняет поиск контрагента по номеру телефона в базе данных и мгновенно возвращает ответ:
    • Имя клиента (для подстановки в поле CallerID на экране физического телефона менеджера).
    • Идентификатор (ID) ответственного менеджера, на которого нужно переадресовать звонок напрямую.
  5. Asterisk направляет звонок на аппаратный телефон нужного сотрудника. Одновременно 1С отправляет оповещение на рабочий стол этого сотрудника.

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


Анализ готовых кроссплатформенных решений на рынке

Если перед вами стоит задача быстро запустить проект без написания собственной интеграционной логики и промежуточных сервисов с нуля, рассмотрим актуальное состояние готовых тиражных решений, поддерживающих работу под Linux:


Подведем итоги

Интеграция 1С и Asterisk под Linux при высокой нагрузке (100+ одновременных звонков) абсолютно реальна и стабильна, если соблюдать ключевые правила архитектуры:

  1. Не подключайте тонкие клиенты напрямую к AMI Asterisk. Это приведет к деградации производительности АТС.
  2. Используйте промежуточный сервер-коннектор (Middleware) для агрегации и фильтрации системных событий АТС.
  3. Применяйте штатный встроенный WebSocketКлиент в современных версиях платформы 1С для безопасного асинхронного приема событий на клиентах под управлением Linux.
  4. Для классических аппаратных телефонов задействуйте связку AGI-скриптов Asterisk и HTTP-сервисов 1С для мгновенной маршрутизации вызовов без лишней нагрузки на сетевые сокеты.
← На главную