Как реализовать интеграцию 1С с OkTell через HTTP API и совершать звонки без клиентского приложения

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

Интеграция учетной системы 1С с IP-АТС OkTell через HTTP API открывает широкие возможности для автоматизации работы регистратур, отделов продаж и сервисных служб. Рассмотрим подробно, как настроить взаимодействие между платформой 1С и сервером OkTell, разберем причины возникновения распространенных ошибок и выясним, как совершать исходящие звонки, не используя стандартное приложение Oktell Desktop Client.

Настройка базового HTTP-соединения в 1С

Для начала взаимодействия с сервером OkTell нам необходимо создать объект HTTPСоединение. Важно правильно передать параметры авторизации и адрес сервера. Разберем наиболее корректный способ инициализации запроса, который позволяет избежать ошибок при передаче учетных данных.

Рассмотрим пример кода для инициализации соединения и отправки простого запроса к API:


&НаСервере
Процедура ВыполнитьЗапросКОктелл()
    
    // Определяем параметры подключения
    АдресСервера = "192.168.1.100"; // IP вашего сервера OkTell
    ПортСервера = 4055;             // Стандартный порт HTTP-сервера OkTell
    Логин = "Администратор";
    Пароль = "ВашПароль";

    // Создаем соединение. Таймаут лучше ставить с запасом (10-20 секунд)
    HTTPСоединение = Новый HTTPСоединение(АдресСервера, ПортСервера, Логин, Пароль, , 15); 
    
    // Формируем строку запроса для получения версии сервера (тестовая команда)
    СтрокаЗапроса = "/getversion";
    
    HTTPЗапрос = Новый HTTPЗапрос(СтрокаЗапроса);
    
    Попытка
        Результат = HTTPСоединение.Получить(HTTPЗапрос);
        Если Результат.КодСостояния = 200 Тогда
            Сообщить("Успешное подключение! Версия сервера: " + Результат.ПолучитьТелоКакСтроку());
        ИначеЕсли Результат.КодСостояния = 404 Тогда
            Сообщить("Ошибка 404: Ресурс не найден. Проверьте права пользователя и настройки веб-сервера.");
        КонецЕсли;
    Исключение
        Сообщить("Ошибка связи: " + ОписаниеОшибки());
    КонецПопытки;

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

В данном примере мы используем метод Получить объекта HTTPСоединение. Обратите внимание, что передача логина и пароля внутри самой строки URL (через @) часто приводит к ошибкам интерпретации спецсимволов, поэтому использование параметров конструктора HTTPСоединение является предпочтительным и более безопасным методом.

Разбор ошибки 404 и настройка прав в OkTell

Часто программисты сталкиваются с тем, что даже при верном адресе сервера возвращается ошибка 404. Проанализируем причины этой ситуации. В системе OkTell недостаточно просто включить HTTP-сервер; необходимо выполнить тонкую настройку прав доступа для пользователя, от имени которого выполняется запрос.

Основные шаги для устранения ошибки 404:

  1. Назначение ролей: Убедитесь, что пользователю в конфигураторе OkTell назначена роль «Пользователь». Без этой базовой роли доступ к методам API может быть заблокирован на уровне прав доступа.
  2. Разрешение Web-Api: В свойствах пользователя на вкладке «Дополнительно» или в общих настройках прав проверьте, что установлена галочка «Возможность исполнять методы Web-Api» в значение «Истина».
  3. Корректность пути: Проверьте, что в настройках веб-сервера OkTell не изменен префикс путей. Стандартные методы, такие как /getversion или /execsvcscript, должны вызываться от корня.

Инициация звонка через серверный сценарий (Service Script)

Одной из главных задач интеграции является совершение звонка нажатием одной кнопки в 1С. В OkTell существует встроенный метод wp_autocallstart, но у него есть существенный недостаток: он требует активной сессии в приложении Oktell Desktop Client. Если ваша задача — работать через обычный IP-телефон или сторонний софтфон, нам потребуется другой подход.

Рассмотрим по шагам, как организовать звонок через серверный служебный скрипт execsvcscript. Этот метод позволяет серверу самостоятельно управлять звонком, не опираясь на запущенный клиентский софт.

1. Создание сценария в OkTell:

В редакторе сценариев OkTell создайте новый Служебный сценарий (например, с именем SvcScript1). Внутри сценария используйте компонент «Пуск вызова». В настройках компонента укажите:

2. Вызов сценария из 1С:

Теперь мы можем отправить HTTP-запрос, который запустит этот сценарий на выполнение. Посмотрим на пример кода:


&НаСервере
Процедура ПозвонитьИз1С(ВнутреннийНомер, НомерТелефона)
    
    Адрес = "192.168.1.100";
    Порт = 4055;
    
    // Важно: кодируем параметры для URL, чтобы избежать проблем с символами
    ПараметрыЗапроса = "name=SvcScript1" 
                     + "&startparam1=" + ВнутреннийНомер 
                     + "&startparam2=" + НомерТелефона 
                     + "&async=1" 
                     + "&timeout=10";
    
    СтрокаЗапроса = "/execsvcscript?" + ПараметрыЗапроса;
    
    HTTPСоединение = Новый HTTPСоединение(Адрес, Порт, "Логин", "Пароль");
    HTTPЗапрос = Новый HTTPЗапрос(СтрокаЗапроса);
    
    Результат = HTTPСоединение.Получить(HTTPЗапрос);
    
    Если Результат.КодСостояния = 200 Тогда
        Сообщить("Запрос на звонок успешно отправлен на сервер.");
    КонецЕсли;

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

В этой схеме сервер сначала совершит вызов на внутреннее устройство сотрудника (IP-телефон или MicroSIP), и как только сотрудник снимет трубку, система начнет набор внешнего номера. Это полностью избавляет от необходимости держать открытым тяжелое приложение Oktell Client.

Мониторинг состояния линий и пользователей

Чтобы интерфейс 1С был интерактивным, полезно знать текущее состояние сотрудников: свободен ли менеджер, разговаривает ли он или находится на перерыве. Для этого мы можем использовать метод getusersstates.

Этот метод возвращает XML-структуру со статусами всех пользователей. Разберем, как обработать эти данные в 1С:


&НаСервере
Функция ПолучитьСтатусПользователя(ИскомыйВнутреннийНомер)
    
    // ... инициализация соединения ...
    Запрос = Новый HTTPЗапрос("/getusersstates");
    Ответ = HTTPСоединение.Получить(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
        
        Пока ЧтениеXML.Прочитать() Цикл
            // Логика обхода XML узлов для поиска нужного пользователя
            // В XML будут узлы с атрибутами ID, StateName, ExtNumber
            Если ЧтениеXML.Имя = "User" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                Внутренний = ЧтениеXML.ПолучитьАтрибут("ExtNumber");
                Если Внутренний = ИскомыйВнутреннийНомер Тогда
                    Статус = ЧтениеXML.ПолучитьАтрибут("StateName");
                    Возврат Статус; // Например: "Разговор", "Свободен"
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    
    Возврат "Неизвестно";
КонецФункции

Важные нюансы и рекомендации

При реализации интеграции обратите внимание на следующие моменты, которые помогут сделать систему стабильной:

Используя приведенные выше методики, мы можем построить гибкую и надежную систему телефонии, полностью интегрированную в бизнес-процессы медицинской организации или любого другого предприятия, использующего 1С.

← На главную