Интеграция 1С с телефонией Asterisk — это классическая задача, которая позволяет автоматизировать работу отдела продаж, внедрить функцию Call-to-Click и повысить лояльность клиентов за счет оперативной обработки вызовов. Однако на пути реализации часто возникают технические препятствия: от конфликтов с веб-интерфейсом FreePBX до «мертвого» зависания программы 1С в момент совершения звонка. В этой статье мы подробно разберем, как правильно настроить связку 1С и Asterisk, почему старые библиотеки не работают в современных версиях «Снеговика» (1С 8.3) и какие альтернативные способы интеграции существуют.
Первым шагом при настройке интеграции является работа с файлом конфигурации 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С вызывает функцию совершения звонка, она переходит в режим ожидания ответа от сервера Asterisk. Если сервер долго обрабатывает команду Originate или возникли проблемы с сетевым соединением, интерфейс будет заблокирован до тех пор, пока не истечет тайм-аут.
Чтобы избежать этого, необходимо использовать асинхронную модель взаимодействия. Рассмотрим, как это реализовать:
ВнешнееСобытие().Многие библиотеки, успешно работавшие в 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 рекомендуется использовать метод УстановитьВнешнююКомпоненту(), предварительно загрузив архив с библиотекой в макет конфигурации.
Если внешние компоненты вызывают сложности, рассмотрим более современный и универсальный способ — использование протокола 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 требует сессию
ОтветЗвонка = Соединение.Получить(ЗапросЗвонка);
КонецЕсли;
КонецПроцедуры
Разберем еще один перспективный вариант для 1С 8.3 — использование ARI. Это современный RESTful API, который работает с JSON-объектами. Это «родная» среда для 1С, так как платформа отлично умеет работать с JSON через ЧтениеJSON и ЗаписьJSON.
В отличие от AMI, который ориентирован на управление событиями всей системы, ARI позволяет создавать полноценные приложения для обработки звонков. Для простой задачи «нажать на кнопку и позвонить» ARI может показаться избыточным, но если вам нужно строить сложные маршруты вызовов или управлять очередями прямо из интерфейса 1С, это лучшее решение. Для отладки и проверки таких HTTP-запросов внутри базы подойдёт обработка для тестирования REST API в 1С.
Проанализируем важный технический момент. В новых версиях Asterisk (начиная с 16 и выше) драйвер chan_sip считается устаревшим, и на его смену пришел chan_pjsip. Если в коде вашей 1С или в настройках библиотеки жестко прописана строка канала типа SIP/101, звонок может не пройти, если ваш аппаратный телефон зарегистрирован через PJSIP.
Решение: всегда проверяйте, какой драйвер используется для ваших внутренних номеров. В команде Originate формат канала должен соответствовать настройкам сервера: либо SIP/номер, либо PJSIP/номер.
Рассмотрим вариант, предложенный опытными разработчиками: создание небольшого сервиса на Python. Этот сервис будет выступать посредником между 1С и Asterisk.
panoramisk или pyst2.Flask или FastAPI).Такая архитектура позволяет избежать проблем с разрядностью DLL и обеспечивает высочайшую скорость отклика интерфейса 1С.
Для реализации качественной интеграции 1С и Asterisk мы рекомендуем:
127.0.0.1.SIP и PJSIP при формировании строк инициации вызова.Применяя эти подходы, вы получите стабильно работающую систему телефонии, которая не будет мешать основной работе пользователей в 1С. Если же требуется готовый вариант работы с облачной АТС без настройки собственного сервера, можно использовать расширение для интеграции телефонии Билайн с 1С.