Как реализовать интеграцию 1С с Asterisk для совершения звонков и избежать зависания системы

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

Интеграция 1С с телефонией Asterisk — это классическая задача, которая позволяет автоматизировать работу отдела продаж, внедрить функцию Call-to-Click и повысить лояльность клиентов за счет оперативной обработки вызовов. Однако на пути реализации часто возникают технические препятствия: от конфликтов с веб-интерфейсом FreePBX до «мертвого» зависания программы 1С в момент совершения звонка. В этой статье мы подробно разберем, как правильно настроить связку 1С и Asterisk, почему старые библиотеки не работают в современных версиях «Снеговика» (1С 8.3) и какие альтернативные способы интеграции существуют.

Настройка прав доступа в Asterisk и конфликт с FreePBX

Первым шагом при настройке интеграции является работа с файлом конфигурации manager.conf, который отвечает за AMI (Asterisk Manager Interface). Рассмотрим типичную ошибку: при попытке разрешить доступ для IP-адреса компьютера с 1С часто отваливается панель управления FreePBX.

Проанализируем ситуацию. FreePBX сам является клиентом Asterisk и использует AMI для отображения статусов, управления модулями и мониторинга системы. Если вы переопределяете параметры permit и deny для основного пользователя [admin], исключая локальный адрес, FreePBX теряет связь с ядром системы.

Правильный подход: никогда не используйте системную учетную запись [admin] для внешних интеграций. Создайте отдельного пользователя специально для 1С. Разберем пример правильной настройки в /etc/asterisk/manager.conf:


[1c_user]
secret = your_strong_password
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.255
permit = 192.168.0.0/255.255.255.0
read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,agent,user,config,command,reporting,originate

Обратите внимание на строку permit = 127.0.0.1. Она критически важна для внутренних скриптов. Параметр write = originate необходим для того, чтобы 1С могла инициировать звонки.

Проблема зависания интерфейса 1С при звонке

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

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

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

Почему ROM-Asterisk.dll не работает в 1С 8.3?

Многие библиотеки, успешно работавшие в 1С 7.7 (так называемых «клюшках»), отказываются загружаться в современных версиях платформы 8.x. Проанализируем основные причины:

1. Разрядность системы: Старые компоненты, такие как ROM-Asterisk.dll, чаще всего являются 32-битными (x86). Если вы запускаете 64-битный клиент 1С или сервер, они физически не могут загрузить такую DLL.

2. Технология Native API: Современная платформа 1С отдает предпочтение компонентам, написанным по технологии Native API. Старые COM-компоненты требуют регистрации в реестре Windows через regsvr32, что часто блокируется политиками безопасности или механизмами DEP.

3. Метод загрузки: Вместо прямого указания пути к файлу на диске, в 1С 8.3 рекомендуется использовать метод УстановитьВнешнююКомпоненту(), предварительно загрузив архив с библиотекой в макет конфигурации.

Альтернативное решение: Использование HTTP-запросов (AJAM)

Если внешние компоненты вызывают сложности, рассмотрим более современный и универсальный способ — использование протокола AJAM (Asterisk Java HTTP Arbitrary Method). Это встроенный в Asterisk веб-сервер, который позволяет отправлять AMI-команды через обычные HTTP-запросы.

Для настройки AJAM выполните следующие шаги в конфигурационных файлах Asterisk:

В файле http.conf:


[general]
enabled=yes
enablestatic=yes
bindaddr=0.0.0.0
bindport=8088
prefix=asterisk

В файле manager.conf убедитесь, что включена поддержка веба:


[general]
webenabled = yes

Теперь мы можем отправить команду на звонок прямо из 1С без использования сторонних DLL, используя объект HTTPСоединение. Посмотрим на пример кода:


&НаСервере
Процедура СовершитьЗвонокЧерезAJAM(НомерТелефона, ВнутреннийНомер)
    
    Сервер = "192.168.0.10"; // IP вашего Asterisk
    Порт = 8088;
    Логин = "1c_user";
    Пароль = "your_password";
    
    // 1. Сначала нужно авторизоваться и получить Cookie
    Соединение = Новый HTTPСоединение(Сервер, Порт);
    Запрос = Новый HTTPЗапрос("/asterisk/manager?action=login&username=" + Логин + "&secret=" + Пароль);
    
    Ответ = Соединение.Получить(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        // 2. Отправляем команду Originate
        Команда = "/asterisk/manager?action=originate&channel=PJSIP/" + ВнутреннийНомер + 
                  "&exten=" + НомерТелефона + "&context=from-internal&priority=1&callerid=" + ВнутреннийНомер;
        
        ЗапросЗвонка = Новый HTTPЗапрос(Команда);
        // Не забудьте передать Cookie из первого ответа, если Asterisk требует сессию
        ОтветЗвонка = Соединение.Получить(ЗапросЗвонка);
    КонецЕсли;

КонецПроцедуры

Переход на ARI (Asterisk REST Interface)

Разберем еще один перспективный вариант для 1С 8.3 — использование ARI. Это современный RESTful API, который работает с JSON-объектами. Это «родная» среда для 1С, так как платформа отлично умеет работать с JSON через ЧтениеJSON и ЗаписьJSON.

В отличие от AMI, который ориентирован на управление событиями всей системы, ARI позволяет создавать полноценные приложения для обработки звонков. Для простой задачи «нажать на кнопку и позвонить» ARI может показаться избыточным, но если вам нужно строить сложные маршруты вызовов или управлять очередями прямо из интерфейса 1С, это лучшее решение. Для отладки и проверки таких HTTP-запросов внутри базы подойдёт обработка для тестирования REST API в 1С.

Нюансы с драйверами каналов: SIP vs PJSIP

Проанализируем важный технический момент. В новых версиях Asterisk (начиная с 16 и выше) драйвер chan_sip считается устаревшим, и на его смену пришел chan_pjsip. Если в коде вашей 1С или в настройках библиотеки жестко прописана строка канала типа SIP/101, звонок может не пройти, если ваш аппаратный телефон зарегистрирован через PJSIP.

Решение: всегда проверяйте, какой драйвер используется для ваших внутренних номеров. В команде Originate формат канала должен соответствовать настройкам сервера: либо SIP/номер, либо PJSIP/номер.

Использование «прослойки» на Python

Рассмотрим вариант, предложенный опытными разработчиками: создание небольшого сервиса на Python. Этот сервис будет выступать посредником между 1С и Asterisk.

  1. Python-скрипт постоянно держит устойчивое соединение с Asterisk через библиотеку panoramisk или pyst2.
  2. Сервис поднимает простой веб-сервер (например, на Flask или FastAPI).
  3. 1С отправляет легкий GET-запрос этому сервису.
  4. Python мгновенно транслирует команду в Asterisk.

Такая архитектура позволяет избежать проблем с разрядностью DLL и обеспечивает высочайшую скорость отклика интерфейса 1С.

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

Для реализации качественной интеграции 1С и Asterisk мы рекомендуем:

Применяя эти подходы, вы получите стабильно работающую систему телефонии, которая не будет мешать основной работе пользователей в 1С. Если же требуется готовый вариант работы с облачной АТС без настройки собственного сервера, можно использовать расширение для интеграции телефонии Билайн с 1С.

← На главную