Корзина
Станьте партнером 3CX, а мы поможем вам зарабатывать!Стать партнером
+380 (67) 958-68-68
+380 (95) 718-98-66
ул. Вернадского, 24 / 4, Днепр, Украина
Коммуникационные системы 3CX - телефония и видеоконференции для бизнеса от Unified Ukraine

Документация для разработчиков по интеграции 3CX и 1С

Документация для разработчиков по интеграции 3CX и 1С

Документация актуальна для серверного расширения TCPServer.dll из модуля интеграции версии 3.2.0

Интеграция 1С (или другой программы) с 3CX Phone System обеспечивается следующими компонентами:
  • client_3cxTo1c.dll - внешняя компонента по технологии COM для 1С:Предприятие, регистрируется как DLL библиотека Windows, (только 1С 32 bit)
  • client_3cxTo1c_n.dll - внешняя компонента по технологии  NativeAPI для 1С:Предприятие 8 (только 1С 32 bit)
  • client_3cxTo1c_n64.dll - внешняя компонента по технологии  NativeAPI для 1С:Предприятие 8, для 1С 64 bit (отсутствует в бесплатной версии)
  • client_3cx.dll - универсальная библиотека, поддерживающая Windows COM интерфейс и доступная в любом языке программирования, регистрируется как DLL библиотека Windows (только 32 битные программы)
  • 3CXLinkClient.dll - .NET библиотека, все предыдущие библиотеки работают через неё. 

Компонента подключается следующим образом:

Для 1С 8.X (только толстый клиент)

ПодключитьВнешнююКомпоненту(”AddIn.3cxTo1cIntegrator”);
Компонента3СХ = Новый(”AddIn.3cxTo1cIntegrator”);

Для 1С 8.X по стандарту NativeAPI

ПодключитьВнешнююКомпоненту(ПутьКФайлу_ client_3cxTo1c_n.dll ,”Lib”,AddInType.Native);
Компонента3СХ = Новый(”AddIn.Lib.3cxTo1cIntegrator”);

Компонента по технологии NativeAPI может подключаться также другими способами и использоваться в тонком и Web клиентах (см. документацию к 1С).

Для 1С 8.X по стандарту Windows COM Interface

Компонента3СХ=ПолучитьCOMОбъект(””,”client_3cx.Client”);
 

После создания объекта Компонента3СХ можно подключиться к серверу:

Компонента3СХ.Подключиться(Хост,Порт,ВнутрПорт,ИнтервалПереподключения);

В дальнейшем используются методы полученного объекта Компонента3СХ, например вызов инициируется так:

Результат = Компонента3СХ.Вызвать(ВнутрНомер,НомерКуда,ТелефонноеУстройство);

Все подаваемые таким образом команды сразу возвращают строковые значения — результат передачи команды на сервер. Это или <<OK>>, или <<Ошибка>> текст ошибки.

Для получения информации о событиях, происходящих на сервере 3СХ, необходимо определить обработчик внешнего события.

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные) 
  Если Источник = ”3cxTo1c” Тогда
    Сообщить(Данные); 
      //дальнейшая обработка ….. 
  КонецЕсли;
КонецПроцедуры;

Например, при звонке из софтфона 3CXPhone с номера 100 на номер «эхо» (*777) этот код выдаст примерно такие строки:

Событие=’Дозвон’;Дата=’2018.10.17 20:04:12.870′;Идентификатор=’23’;НомерОткуда=’100′;НомерКуда=’*777′; 
Событие=’Звонок’;Дата=’2018.10.17 20:04:13.226′;Идентификатор=’23’;НомерОткуда=’100′;НомерКуда=’*777′;
Событие=’Соединение’;Дата=’2018.10.17 20:04:13.388′;Идентификатор=’23’;Номер=’100′; 
Событие=’НачалоРазговора’;Дата=’2018.10.17 20:04:13.388′;Идентификатор=’23’;ИнициаторРазговора=’100′; 
Событие=’Соединение’;Дата=’2018.10.17 20:04:13.389′;Идентификатор=’23’;Номер=’*777′; 
Событие=’Отсоединение’;Дата=’2018.10.17 20:04:14.703′;Идентификатор=’23’;Номер=’100′;ДлительностьРазговора=’1.324′; 
Событие=’Отсоединение’;Дата=’2018.10.17 20:04:14.747′;Идентификатор=’23’;Номер=’*777′;ДлительностьРазговора=’1.358′; 
Событие=’КонецРазговора’;Дата=’2018.10.17 20:04:14.747′;Идентификатор=’23’;ДлительностьРазговора=’1.359′;

Альтернативой использованию внешних событий является опрос компоненты по таймеру:

Пока Компонента3СХ.ЕстьСообщения() Цикл
    Данные = Компонента3СХ.Сообщение();
 
    Сообщить(Данные); 
    //дальнейшая обработка …..
КонецЦикла;

Выбирать тот или иной режим можно методом Компонента3СХ.ВключитьСобытия(да\нет);

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

Методы модуля

Методы компоненты разделяются на

  • собственные служебные команды и функции

  • команды и функции для 3СХ Phone System

Все команды сразу возвращают строковые значения — результат передачи команды на сервер. Это или ”<OK>”, или ”<<Ошибка>> текст ошибки”. Рядом с названием метода указан его английский синоним.

Для библиотек client_3cx.dll и 3CXLinkClient.dll можно использовать только английские названия. Чтобы увидеть пространства имён и определения функций .NET сборки 3CXLinkClient.dll, можно воспользоваться контекстным меню "View in Object Browser" в  Visual Studio, они практически не отличаются от ниже перечисленных.

Если параметр метода имеет тип ”булево”, то можно также использовать значения ”Истина”\”Ложь”,”Да”\”Нет”,”True”\”False”,”Yes”\”No”,0\1.

Служебные команды

Подключиться \ Connect(строка Хост,число Порт,число ВнутрПорт, число ИнтервалПереподключения)
Инициирует подключение к серверу связи компоненты, находящемуся на компьютере Хост по порту Порт. Сама компонента для связи будет использовать порт с номером ВнутрПорт или случайный, если ВнутрПорт равен нулю. Если ИнтервалПереподключения больше нуля, то при обрывах связи компонента будет пытаться подключаться с заданной  в секундах периодичностью.

Отключиться \ Disconnect()
Отключает компоненту от сервера связи.

Подключен \ Connected()
Функция. Возвращает ”Истина”, если компонента подключена к серверу связи.

ОжиданиеПодкл \ WaitConnect()
Функция. Возвращает ”Истина”, если компонента находится в режиме ожидания подключения к серверу связи.

ВключитьСобытия \ UseEvents(булево Включить)
Управляет режимом получения событий для компоненты 1С. Если Включить = ”Истина”, то будут слаться внешние события в 1С, иначе для получения событий необходимо по таймеру опрашивать функции ЕстьСообщения() и Сообщение().

Плюсы и минусы режимов

  • Внешние события

    • + Быстрый отзыв в конфигурации 1С. Стандартность подхода.

    • — Возможность потери событий при длительных расчетах. Не работают в режиме сервера.

  • Функции сообщений

    • + События не теряются при подвисаниях. Работают в любых режимах.

    • — Небольшая задержка между отправкой и получением событий.

ЕстьСообщения \ HasMessages()
Функция. Возвращает «Истина», если появились непрочитанные сообщения от сервера связи. Работает в режиме ”ВключитьСобытия(Ложь);”.

Сообщение Message()
Функция. Возвращает следующее в очереди непрочитанное сообщение от сервера связи. Работает в режиме ”ВключитьСобытия(Ложь);”.

ЖдатьСообщение \ WaitMessage(число Таймаут)
Функция. Ждёт сообщение с сервера максимум Таймаут миллисекунд, если оно не поступит, возвращает пустую строку

Заснуть \ Sleep(число Таймаут)
 Делает паузу в выполнении кода на Таймаут миллисекунд

Версия Version()
Функция. Возвращает номер версии компоненты.

Версия3CX \ Version3CX()
Функция. Возвращает номер версии 3CX Phone System, с которой работает сервер связи.

Фильтрация SetFilter(строка ТипНомера,строка Фильтр)
Для каждого типа номеров ТипНомера (”внутренний”, ”внешний”, и т.д., соответствует значению, возвращаемому функцией ‘Номер(nn,”тип”);‘ устанавливаются условия фильтрации Фильтр. Каждое условие отделяется точкой с запятой, и представляет собой или точное значение, или маску с символами ‘*’ и ‘?’ Маски аналогичны применяющимся в Windows для выбора файлов. Например, ‘Фильтрация(”внутренний”,”100;2??;4*”);‘. Фильтрация применяется к разговору в целом, то есть, как только в разговоре встретится удовлетворяющий любому из условий номер, все события этого разговора будут переданы клиенту. Для нового клиента по умолчанию фильтрация отсутствует, то есть доступны все события.

Команды для 3CX

Вызвать \ MakeCall(строка ВнутрНомер, строка Номер, строка ТелефонноеУстройство)
Инициирует вызов от внутреннего абонента ВнутрНомер на номер Номер, используя предпочтительное ТелефонноеУстройство.

"ТелефонноеУстройство" - это строка, идентифицирующая с какого телефона будет вызов, это может быть:
1. "3cx", "3cxphone", "soft", "softphone" - вызов с софтфона
2. "ip", "ipphone", "!3cxphone" - вызов с IP телефона
3. IP адрес - вызов с IP телефона с таким адресом
4. Название модели телефона - ищется по подстроке нужная модель (например "Fanvil")
4. Любой телефон кроме определённой модели - перед строкой ставится восклицательный знак (например "!Fanvil")
5. "makecall", пустая строка - идёт вызов на все подключённые телефоны через  "MakeCall" - дозвон будет идти с телефона, где сняли трубку. При этом сначала идет дозвон на ВнутрНомер, и, если абонент поднял трубку, дальнейший дозвон на Номер. Если телефонное устройство не может быть идентифицировано, 3CX самостоятельно выбирает устройство, с которого будет идти вызов, и способ инициации этого вызова.
 

Отсоединить \ DropCall(число ID_Разговора, строка Номер)
Отсоединяет абонента Номер от разговора ID_Разговора.

Перевести \ DivertCall(число ID_Разговора, строка Номер, строка НаНомер, булево ГолПочта)
Переводит вызов в разговоре ID_Разговора с внутреннего абонента Номер к номеру НаНомер. Будет инициирован дозвон от номера Номер на номер НаНомер. Если ГолПочта = ”Истина”, то перевод будет производиться на голосовую почту номера НаНомер.

Заменить \ TransferCall(число ID_Разговора, строка Номер, строка НаНомер)
Заменяет в установившемся разговоре ID_Разговора внутреннего абонента Номер на номер НаНомер.

Перенаправление \ PickupCall(строка Номер, строка НаНомер)
Включает перенаправление всех вызовов к абоненту Номер на номер НаНомер. Перенаправление будет срабатывать, если абонент в момент вызова занят или недоступен.

Записать \ RecordCall(число ID_Разговора, строка Номер, булево ДаНет)
Начинает или прекращает (”да”\”нет”) запись разговора ID_Разговора. Внутренний абонент Номер выступает как ”инициатор” записи. Запись ведется в каталоге на сервере, см. в консоли 3CX ”Settings - Parameters - CALLRECORDSROOT”.

Прослушивание \ Listen(число ID_Разговора, строка Номер)
Присоединяет к разговору ID_Разговора Номер в режиме прослушивания.

Подсказка \ Whisper(число ID_Разговора, строка Номер, строка НомерДляПодсказки)
Присоединяет к разговору ID_Разговора Номер в режиме прослушивания. Его ни слышит никто, кроме НомерДляПодсказки.  

Внедрение BargeIn(число ID_Разговора, строка Номер)
Присоединяет к разговору ID_Разговора Номер в обычном режиме. 

Номер \ NumberProp(строка Номер, строка Свойство)
Функция. Возвращает свойство с названием Свойство для абонента с номером Номер, или текст ошибки. Возможные свойства:

  • тип – тип номера (внутренний, внешний, шлюз, факс, меню, парковка, очередь, группа, конференция, неизвестно).

  • в_сети – находится ли номер в сети. Возвращает да\нет для внутренних номеров, неизвестно для внешних, с которыми нет соединения.

  • разговоры – количество разговоров, в которых участвует абонент. Возвращает число для номеров в сети, или -1 для номеров с которыми нет соединения (неизвестно).

  • доступен – Может ли абонент принять вызов. Возвращает да\нет для внутренних номеров, неизвестно для внешних.

  • фамилияимяemail – Возвращают информацию о пользователе номера для внутренних номеров, иначе пустую строку.

  • все – Будет возвращена строка вида «тип=’внутренний’;в_сети=’да’;…..» или описание ошибки.

СостояниеНомера \ NumberState(число ID_Разговора, строка Номер)
Функция. Возвращает состояние номера относительно разговора ID_Разговора. Возможные значения: «присоединён», «дозвон», «на удержании», «звонок», «неопределено» или описание ошибки.

РазговорСуществует \ CallExists(число ID_Разговора)
Функция. Возвращает "да", если разговор ID_Разговора еще существует или "нет", если он завершен или его не было.

АбонентВРазговоре \ isNumberInCall(число ID_Разговора, строка Номер)
Функция. Возвращает "да", если номер участвует в разговоре ID_Разговора, или "нет".

СписокНомеров \ NumberList()
Функция. Возвращает строку – список телефонов всех внутренних абонентов, специальных номеров и внешних абонентов, подключенных на данный момент. Номера разделены “&”. . Если в строке встречается символ “&” , он будет заменен на “$amp”.

ЧленыГруппы \ GroupMembers(строка НомерГруппы)
Функция. Возвращает список всех номеров в очереди или группе дозвона с номером НомерГруппы, разделитель "&".

ФайлЗаписи \ GetRecFile(число  ID_Разговора, строка БлижайшаяДата)
Функция. Возвращает путь к файлу на сервере с записью разговора, пустую строку если подходящего файла нет, или текст с ошибкой. Так как идентификаторы разговора могут повторяться, выбирается ближайший к указанной дате +/- один час. Дата допускается в формате «гггг.мм.дд чч:мм:сс».
Внимание! В версиях 3CX PhoneSystem до 14, может пройти до минуты с момента окончания разговора, прежде чем информация о файле с записью появится в базе данных.

ЗагрузитьФайл \ DownloadFile(строка ИмяФайлаНаСервере, строка ИмяФайлаНаКлиенте)
Функция. Инициирует асинхронную загрузку файла с сервера на клиент. Возвращает идентификатор загрузки или строку с описанием ошибки. После инициации загрузки могут генерироваться события «СтатусЗагрузки», «КонецЗагрузки», «ОшибкаЗагрузки» (см. ниже).  Возможна загрузка нескольких файлов одновременно. С целью безопасности, разрешены загрузки только из папки для записи звонков 3CX.

ОтменитьЗагрузку \ CancelDownload(строка ИдентификаторЗагрузки)
Функция. Прекращает загрузку файла по идентификатору. Возвращает «<<OK>>» или строку с описанием ошибки.

ЗахватитьРазговор \ CaptureCall(число ID_Разговора, булево ДаНет)
Функция. Позволяет все события, генерируемые этим разговором, направлять исключительно клиенту, вызвавшему функцию, или отменить это поведение. Может быть полезно в конфигурациях с очередями дозвона.

ПередатьСообщение \ CustomMessage(строка Текст)
Функция. Передаёт произвольное текстовое сообщение всем остальным клиентам, что позволяет организовывать между ними взаимодействие.

Список возможных возвращаемых ошибок:

”<<Ошибка>> Нет соединения с сервером"
”<<Ошибка>> Вероятно неверный лицензионный ключ или сбой в передаче данных!”


”<<Ошибка>> Нет доступа к 3CX Phone System”
”<<Ошибка>> Нет доступа к базе звонков 3CX Phone System”
”<<Ошибка>> Несоответствие интерфейсов — Сервер: xxxx Клиент: xxxx”
”<<Ошибка>> Ответ от сервера не получен”
”<<Ошибка>> Неизвестное свойство ‘хххх’”
”<<Ошибка>> Нет свойств с возможностью записи”
”<<Ошибка>> Неизвестный метод ‘хххх’”
”<<Ошибка>> Недостаточно параметров для запроса ‘хххх’, надо хххх”
”<<Ошибка>> Неверный аргумент запроса”
”<<Ошибка>> Ожидается целое число”
<<Ошибка>> Ожидается логическое значение”
”<<Ошибка>> Неверный идентификатор разговора: ‘хххх’”
”<<Ошибка>> Неизвестный номер абонента: ‘хххх’”
”<<Ошибка>> Абонент ‘хххх’ не является внутренним для 3CX Phone System”
”<<Ошибка>> Абонент ‘хххх’ не участвует в разговоре №хххх”
”<<Ошибка>> Абонент ‘хххх’ не присоединен к разговору №:хххх”
”<<Ошибка>> Абонент ‘хххх’ уже присоединен к разговору №:хххх”
”<<Ошибка>> Абонент ‘хххх’ недоступен или занят”
”<<Ошибка>> Неверный номер для разговора”
”<<Ошибка>> Параметр ‘xxxx’ не найден”
”<<Ошибка>> Загрузка этого файла уже начата”
”<<Ошибка>> Невозможно создать файл”
”<<Ошибка>> Недопустимое расположение файла”
"<<Ошибка>> Захват разговора c id={0} уже произведен"
<<Ошибка>> Отменить захват разговора c id={0} может только инициатор захвата

Кроме указанных, возможны и другие сообщения об ошибках, сгенерированные сервером 3CX, либо операционной системой.

События модуля

Дозвон — Вызывается, когда внутренний абонент НомерОткуда начинает дозвон на НомерКуда:
Событие=’Дозвон’;Дата=’2018.11.12 11:00:27.453′;Идентификатор=’12’;НомерОткуда=’100′;НомерКуда=’102′;

Звонок — Вызывается, когда внутренний абонент НомерКуда получает вызов от НомерОткуда (когда у него зазвонил телефон):
Событие=’Звонок’;Дата=’2018.11.23 11:00:27.453′;Идентификатор=’12’;НомерОткуда=’100′;НомерКуда=’102′;

Соединение — Вызывается, когда абонент Номер присоединяется к разговору ID_Разговора (дозванивается до абонента или сам снимает трубку):
Событие=’Соединение’;Дата=’2018.11.23 11:00:27.453′;Идентификатор=’12’;Номер=’100′;

Отсоединение — Вызывается, когда абонент Номер отсоединяется от разговора ID_Разговора (вешает трубку, принудительно отключается, или обрывается связь):
Событие=’Отсоединение’;Дата=’2018.11.23 11:00:27.453′;Идентификатор=’12’;Номер=’100′;ДлительностьРазговора=’7.06′;

НетСоединения — Вызывается, когда при звонке от НомерОткуда к НомерКуда соединения так и не происходит (НомерКуда не берет трубку, или НомерОткуда прекращает дозвон):
Событие=’НетСоединения’;Дата=’2018.11.23 11:00:27.453′;Идентификатор=’12’;НомерОткуда=’100′;НомерКуда=’102′;

НачалоРазговора — Вызывается, когда к разговору присоединился первый абонент (когда собственно разговор между абонентами и начался):
Событие=’НачалоРазговора’;Дата=’2018.11.23 11:00:27.453′;Идентификатор=’12’;ИнициаторРазговора=’100′;

КонецРазговора — Вызывается, когда от разговора отсоединился последний абонент:
Событие=’КонецРазговора’;Дата=’2018.11.23 11:00:27.453′;Идентификатор=’12’;ДлительностьРазговора=’8.06′;

СтатусЗагрузки — Вызывается 2 раза в секунду в процессе загрузки файла,что может использоваться для индикации:
Событие=’СтатусЗагрузки’;Дата=’2018.12.21 12:00:14.892′;Идентификатор=0;Загружено=16384;Размер=983932;

КонецЗагрузки — Информирует об окончании загрузки:
Событие=’КонецЗагрузки’;Дата=’2018.12.21 12:07:12.242′;Идентификатор=2;

ОшибкаЗагрузки — Вызывается, если в процессе копирования возникли неполадки:
Событие=’ОшибкаЗагрузки’;Дата=’2018.12.21 12:14:02.473′;Идентификатор=5;Сообщение='<<Ошибка>> Недопустимое расположение файла’;

Примечания

Для всех событий присутствуют поля Идентификатор и Дата. При инициализации любого разговора, еще до его начала, сервер 3СХ присваивает ему свой номер. Номера идут по порядку, начиная с 0 при старте сервиса 3СХ, потому номер глобально не уникален. Дата и время возникновения события указываются с точностью до миллисекунд, и передаётся в формате гггг.мм.дд чч:мн:ск.мил, независимо от региональных установок.У событий Дозвон,Звонок,Соединение может также присутствовать поле Шлюз, также у всех событий кроме НачалоРазговора и КонецРазговора могут присутствовать дополнительные поля, передаваемые 3СХ, например:

Событие=’Звонок’;Дата=’2013.11.12 11:00:27.453′;Идентификатор=’12’;НомерОткуда=’0989876766′;НомерКуда=’102′;Шлюз=’10002′;ringgroup=’400′;

Поле ДлительностьРазговора указывается в секундах с дробной частью, отделённой точкой. При создании разговора командой Вызвать, события первоначального дозвона на номер, с которого будет происходить вызов, не передаются. События дозвона и соединения со шлюзами не показываются.