Решение проблем при интеграции 1С с Asterisk и ошибки работы Native-компонент с памятью

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

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

1. Причины возникновения ошибки «Некорректная работа компоненты с памятью»

Сбой при выполнении функции ПодключитьВнешнююКомпоненту с типом ТипВнешнейКомпоненты.Native чаще всего происходит по следующим причинам:

  1. Несоответствие разрядности процесса и библиотек: Разрядность исполняемого файла библиотеки (DLL) должна строго совпадать с разрядностью клиента 1С или сервера 1С (32-bit или 64-bit), в зависимости от того, где вызывается подключение.
  2. Изменения в работе с памятью в новых релизах платформы 1С 8.3: Платформа предъявляет строгое требование к выделению памяти для Native API с использованием системного аллокатора 1С. Старые версии внешних библиотек при передаче строк вызывают ошибку работы с памятью. Решением является обновление версии библиотеки DLL под актуальные релизы платформы.
  3. Запуск библиотеки без изоляции процесса: В современных версиях 1С рекомендуется подключать внешние библиотеки в изолированном режиме, чтобы возможная ошибка в C++ коде DLL не приводила к аварийному завершению работы 1С.

Рассмотрим стандартный пример подключения Native-компоненты из макета конфигурации в 1С:


АдресВнешнейКомпоненты = "ОбщийМакет.ROM_Asterisk_Native";
Результат = ПодключитьВнешнююКомпоненту(АдресВнешнейКомпоненты, "Simplit", ТипВнешнейКомпоненты.Native);
Если НЕ Результат Тогда
    ВызватьИсключение "Не удалось подключить внешнюю компоненту для работы с Asterisk!";
КонецЕсли;

2. Обработка событий Dial и группировка каналов в Asterisk (AMI)

При длительном ожидании ответа в очереди Asterisk может генерировать несколько пар событий Dial (с SubEvent: Begin и SubEvent: End) для одного и того же входящего вызова. Это происходят из-за того, что АТС скидывает канал оператора по таймауту с кодом DialStatus: CANCEL и совершает повторную попытку набора.

Проанализируем, как правильно отслеживать входящие вызовы:

  1. Использование поля Linkedid: В отличие от Uniqueid, который уникален только для конкретного канала (плеча звонка), поле Linkedid сохраняет единое значение для всей цепочки соединений от первого поступления вызова в АТС до его завершения.
  2. Корректировка таймаутов на стороне Asterisk: Если логика 1С опирается на события канала, на стороне АТС можно увеличить время работы канала до сброса вызова в очереди.
  3. Фиксация факта ответа: Чтобы не обрабатывать промежуточные попытки дозвона, рекомендуется ориентироваться на события коммутации каналов — BridgeEnter или AgentConnect, которые приходят только в момент фактического начала разговора.

3. Варианты подключения к облачным АТС

Если Asterisk размещен у облачного провайдера, прямой доступ по порту AMI (5038), как правило, закрыт из соображений безопасности. Разберем альтернативные архитектурные решения:

  1. Использование Webhooks и HTTP-сервисов: Облачная АТС отправляет уведомления о событиях звонка по протоколу HTTP на опубликованный в 1С HTTPСервис. В этом случае 1С не держит постоянное TCP-сокетное соединение, а принимает входящие JSON/XML-пакеты.
  2. Инициализация вызовов через REST API: Для совершения исходящих вызовов (Click-to-Call) из 1С отправляется HTTP-запрос к API провайдера с помощью объекта HTTPСоединение.
  3. Построение защищенного VPN-туннеля: Для получения прямого доступа к AMI облачной станции настраивается VPN-соединение между локальной сетью предприятия и облачным сервером.
← На главную