gifts2017

Звоним из «1С». Универсальный софтфон для стандартных конфигураций «1С» с открытым кодом для платформ 8.2, 8.3 для Asterisk и не только.

Опубликовал Конрад Карлович Михельсон (sip2all) в раздел Оборудование - Телефония, SIP

Уважаемые господа, представляю Вашему вниманию внешнюю обработку - софтфон для стандартных конфигураций «1С» с открытым кодом.  Это две реализации с претензией на универсальность для обычных и управляемых приложений.  Универсальность имеет свои минусы (на них укажу позже, если кто сам не увидит), которые легко «побеждаются» интеграцией в необходимую конфигурацию с внесением в последнюю соответствующих небольших изменений. Хотя, и с минусами, как мне кажется, как-то можно жить. Мне не удалось найти оператора или PBX, с которыми звонилка не работала бы (разве что Skipe) . Некоторые коллеги почему-то отдельно отмечали факт успешного взаимодействия с Mango, хотя, по правде сказать, я не очень понимаю,  почему могут возникать сложности с этим оператором при использовании других инструментов.  Вообще, этап тестирования был очень сжатым, и могу предположить, что будет найдено, какое-то количество негативных моментов (всегда хочется, чтобы их было немного.)., которые надо будет поправить. Буду рад любым вашим замечаниям и благодарен за здравую критику. Я думаю, что для нее в данном случае будет достаточно места. Этап тестирования, хоть и был сжатым, но все же был. Прежде всего, проверил на Asterisk, мне это показалось наиболее актуальным. MasterTel любезно предоставил для тестирования свои ресурсы, включая городской номер, Callobok.ru создал для меня экаунт на своем сервере, четвертым был провайдер sipnet. Во всех четырех случаях был положительный результат, больше нигде проверять не стал, т.к. все используют один и тот же протокол (кроме skype). Ах, ну да! Конечно же, на собственном сервере проверял, похоже тоже «жужжит».  
Что касается конфигураций, проверил работоспособность обычного приложения на "Бухгалтерии предприятия 2.0", "Управление торговлей 10.3", "Комплексная автоматизация", "Розница 1.0", управляемое приложение - "Управление торговлей 11", "Бухгалтерия предприятия 3.0", "Управление небольшой фирмой 1.4" (1.5 тоже должна работать), "Розница 2.0".

Введение.

В основе софтфона внешняя компонента CH-Com1S.dll, написанная на С++ с использованием технологии Native. Софтфон также поддерживает обмен сообщениями. Этот механизм немного за рамками стандарта SIP-протокола (добавлен обмен дополнительными служебными сообщениями), поэтому он будет работать, только при условии регистрации на сервере разработчика (т.е. на моей машинке с очень и очень скромным ресурсом). Здесь нет никакого подвоха (в конце концов, можно этот сервис и не использовать без ущерба для всего остального). Во-первых, эта часть sip-протокола поддерживается не всеми провайдерами, а в полном объеме возможно и никем (мне, во всяком случае, не удалось найти таких), во-вторых, как я уже сказал, добавлен обмен дополнительными служебными сообщениями, который позволяет информировать отправителя о доставке сообщения и о прочтении. Зарегистрировать на моем сервере можно только компоненту CH-Com1S.dll, при этом принять сообщение можно с любого другого софтфона, если он сам и оператор, у которого он зарегистрирован, этот сервис поддерживают (конечно, никаких дополнительных уведомлений в данном случае не будет). Компонента предоставляет возможность зарегистрироваться сразу на нескольких sip-серверах различных операторов, т.е. получается эдакий аналог многоканального телефона, что может быть полезно, например, для оптимизации звонков в части тарификации – один экаунт для обмена сообщениями, второй - для звонков по межгороду, третий - для международных, четвертый - не знаю, сами придумайте.

Вообще, старался сделать максимально простой интерфейс, не загружая конечного пользователя различными непонятностями. Не уверен, что это у меня получилось… Хотя, будем посмотреть.

Первое, что необходимо сделать до того, как приступать к работе с внешней обработкой, это скопировать файл CH-Com1S.dll в каталог C:\Program Files (x86)\1cv8\8.3.4.389\bin, если Ваш комп имеет 64-битную архитектуру или в C:\Program Files\1cv8\8.3.4.389\bin, если 32-х битную. 8.3.4.389 – это релиз платформы, которая у меня установлена, у Вас может быть и скорее всего другой номер (т.е. именем этой папки будет номер установленной на Вашем компьютере платформы). Файл CH-Com1S.epf может храниться, где угодно на жестком диске, или же его можно сохранить в справочнике «Дополнительные внешние обработки» и запускать оттуда (Главное меню->Сервис–>Дополнительные отчеты и обработки –> Дополнительные внешние обработки).

Еще одна небольшая деталь. При входящем звонке и сообщении обработка будет пытаться найти в справочниках «Контрагенты» и «Физические лица» по экаунту/номеру телефона. Для того, чтобы этот процесс мог бы иметь, какой-то успех, давайте договоримся, что номера телефонов у нас семизначные без пробелов и дефисов ( в бухгалтерии набираем +7(495)1236587, в других конфигурациях, где номер вводится через встроенную процедуру в специальной форме, после ввода представление может быть, например таким +7(495)1236587 доб.12, где ключевой момент 1236587 – по порядку, без каких либо символов между). Если необходимо ввести sip-экаунт, то вводим его в формате sip:yorname@yordomain (например: sip:vasiapupkin@sip.sip2all.net) в поле с контактной информацией, которая имеет тип «Другое».

Интерфейсы в управляемом и обычном приложении практически одинаковые, единственное, отличается немого страница управлением вызовами.

Настройки.

Авторизация

Порт – по умолчанию 5060. Предлагаю так и оставить.

Прокси – IP – адрес прокси-сервера, если Вы его используете. Если не знаете, то спросите у Вашего администратора сети, если и он не знает, оставьте незаполненным. (Для продвинутых: это прокси для всех экаунтов, для каждого в отдельности может позже сделаю)

STUN – технология для обхода NAT. Здесь можно указать IP STUN – сервера, если в этом есть необходимость. Есть она или нет, может сказать поставщик услуг (sip-оператор). Для перечисленных выше операторов такой необходимости нет, вопрос прохождения NAT решается на стороне серверов, т.о. поле можно оставить незаполненным.

В табличной части этой страницы экаунты, с которыми Вы работаете. Как добавить экаунт - интуитивно понятно. Графа «Активный» предназначена для пометки экаунтов, которые подлежат регистрации. Компонента каждые 60 сек. будет опрашивать соответствующие сервера на доступность по указанным регистрационным данным (только те, которые помечены, как «Актив.»). Если Вы знаете, что, какой-то экаут временно неактуален, но Вы хотите сохранить регистрационные данные, то лучше снять галку «Актив.», т.к. при опросе по этим рег. данным компонента будет «тормозить», ожидая заведомо отрицательного ответа сервера и так каждую минуту. Если регистрация прошла успешно, то соответствующая строка табличной части меняет цвет текста на зеленый, в противном случае –черный.

Сделать учетную запись основной – текущая по умолчанию, Текущая - учетная запись, с которой вы звоните. Текущая учетная запись определяется на странице «Вызовы». В настоящей реализации предоставлена возможность вручную определять текущую учетку. (В принципе, можно, при необходимости, реализовать, что-то типа дайл-плана в рамках софтофона, хотя, не уверен, что надо.)

Регистрация на sip-сервере разработчика - это, как раз, то о чем я уже говорил выше. В основном сервер предназначен для обмена сообщениями, хотя это полноценный sip-сервер, который поддерживает протокол, практически в полном объеме, т.е. можно и поговорить. Единственное напоминаю, что в настоящий момент машинка слабенькая и канальчик ограниченный, т.е. если вдруг все захотят поговорить, то по ряду объективных обстоятельств может, как канальчика не хватить, так и ресурса машинки. Хотя, впрочем, давайте пробовать.

Сообщения

Максимальное количество записей в журнале сообщений. В данной реализации ведется журнал сообщений, в котором хранится информация о том, какие сообщения, когда Вы оправляли/получали, в каком состоянии в данный момент находятся отправленные/ полученные сообщения (были успешно доставлены отправленные или нет, были прочитаны полученные/отправленные или нет). Данный журнал по окончании работы сохранится на диске в виде текстового файла, а во время начала работы считывается в оперативную память. Размер оперативной памяти ограничен, поэтому не стоит устанавливать значение этого поля слишком большим. Я предлагаю обойтись числом 100 – 150. Если надо больше, то можно дополнительно организовать архив и отдельно реализовать работу с ним. Это совсем не сложно, как Вы сами понимаете. Основной минус, тем не менее, не в том, что журналы ограничиваются по количеству записей, наиболее существенный негатив универсального (неинтегрированного в конфигурацию) решения в том, что журналы (и сообщений, и истории вызовов) хранятся на локальных компьютерах, а не в базе данных, что по понятной причине существенно затруднит контроль и анализ, если такие понадобятся, как звонков, так и переписки. Ведь, наверное, и так всем понятно, что «звонилка» внутри 1с привлекательна, прежде всего, тем, что она может позволить аккумулировать дополнительную информацию в корпоративной базе данных в целях последующего ее анализа.

Оправлять автоматически. Обработка будет проверять Ваш журнал сообщений на наличие недоставленных и пытаться отправить их снова через интервал в секундах, указанный в поле «Интервал проверки неотправленных».

Данная реализация «доотправки» недоставленных сообщений, конечно не лучший вариант решения данной проблемы. Для того, чтобы адресат получил Ваше сообщение у него в момент отправки тоже должна быть запущена эта обработка. Т.о., если Вы из Москвы хотите с кем-то переписываться во Владивостоке, то возникнут, скорее всего, трудности, связанные с необходимостью в одно и тоже время сидеть тупить в 1с, как минимум из-за разницы в часовых поясах. Вариантов решения этой проблемы больше чем 1, я, скорее всего, сделаю «досылку» на стороне своего сервера. Пока не делал, т.к. нет понимания спроса на данный сервис, нужен ли он вообще.

Файлы и папки

Вся информация, связанная с работой обработки, хранится в обычных текстовых файлах (xml - для продвинутых). Где будут храниться на диске сами файлы, Вы можете определить самостоятельно, хотя при первом запуске все поля будут заполнены значениями по умолчанию. При первом запуске в Вашем профиле по адресу C:\users\uorname\AppData\Roaming будет создана папка CH_COM, а в ней папки Convers, History, Mail, Messages. «Запись разговоров» - это папка для хранения wav-файлов – записанных Вами разговоров. Каждая запись хранится в отдельном файле в имени, которого достаточно примитивно закодирована информация, по которой можно определить, к какому звонку он имеет отношение. Но Вам это определять вряд ли понадобится т.к. за вас это делает обработка.

Смысл значения поля «Макс кол. записей истории вызовов» аналогичен вышеописанному «Максимальное количество записей в журнале сообщений». Только в данном случае речь идет о журнале вызовов – куда кто кому когда звонил. Это журнал отображается в табличной части страницы «Вызовы».

Эта страница будет доступной в случае, если в метаданных конфигурации присутствует документ «Событие». Т.е. если будете запускать из «Бухгалтерии предприятия», то этой страницы не увидите.

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

Суть значений этой страницы понятна, мне кажется и так – при каких обстоятельствах нужно создавать документ «Событие».

Отдельно о значении поля «Если при входящем звонке, контрагент не найден в справочниках БД, то в документ "Событие" создавать и значение реквизита "Контрагент" в нём:». При постановке учета в рознице, и в интернет-магазинах в частности, в качестве контрагентов выступает большое количество частных лиц. Для упрощения учета часто их всех объединяет в одного виртуального контрагента, что-то типа «Розничный покупатель» или «Частное лицо». В данном случае имеется в виду именно такой контрагент.

Управление звонками. Страница «Вызовы»

Сначала немного о телефонных номерах, именах пользователей и учетных записях. У sip-сервера нет такого понятия, как телефонный номер, а есть понятие учетной записи, ID которой выглядит, например так sip:5123467@sip.yoffice.ru или так sip:vasya@sip.sipnet.ru. Если Вы зарегистрированы у оператора МастерТел, то Ваша учетная запись выглядит примерно так sip:yorname@sip.yoffice.ru. Если Вы на любом софтфоне пытаетесь позвонить на, предположим, городской номер 84951234567, набрав указанные цифры, то на самом деле вы вызываете sip: 84951234567@sip.yoffice.ru. Это уже логика sip-сервера определяет, что «84951234567» это городской московский номер и выполняет звонок на него через шлюзовое устройство на городскую АТС. Если же sip-серверу не удается увидеть в username городской или мобильный номер, тогда осуществляется поиск в локальной базе данных соответствующего username, если найдено, то Вас пытаются соединить, если нет, то , как говорится, извините.

Если в этой статье-инструкции далее вы встретите такой термин, как «Телефонный номер» или, что-то синонимичное, то понимать его следует именно, как sip-экаунт.

Можно организовать связь между сотрудниками офиса без sip-провайдера. Если Вы знаете внутренний (локальный) IP-адрес Вашего коллеги (он должен быть похож на 192.168.х.х, то в строке набора можно набрать sip:192.168.x.x , и он увидит/услышит Ваш вызов, если, конечно у него запущена эта обработка. (Внутренний IP-адрес можно узнать, набрав в командной строке ipconfig) Таким образом, в случае если, что-то не работает, можно попытаться найти виновника – представленная обработка, сервер оператора, или ваша АТС.

 

Поле «Текущая учетная запись». Значение этого поля не должно быть пустым. При загрузке оно заполняется значением «Основной учетной» записи, если она успешно авторизована. Если Вам нужна другая учетка, то Вы можете ее выбрать из выпадающего списка, который содержит только записи прошедшие авторизацию (зеленые).

Теперь, как это в данный момент влияет на совершение вызова. Так, например, если ID учетной записи user@sip.sipnet.ru, то, набрав в строке набора (поле ввода) «1234567» и нажав кнопку позвонить, Вы сделаете попытку звонка на sip:1234567@sip.sipnet.ru. Т.о., учетная запись, указанная, как текущая, по умолчанию будет определять имя домена sip-сервера на который Вы звоните. Но Вы можете в строке указать явно 1234567@sip.sip2all.net, тогда, не смотря на доменное имя учетной записи «sip.sipnet.ru», звониться будет на «sip.sip2all.net». Что касается входящих вызовов, то неважно, какая у Вас учетная запись основная и по умолчанию, Вы увидите все вызовы на любую учетную запись, прошедшую авторизацию.

Сразу замечу, что одновременных вызовов может быть не более 4-х. Это ограничение введено из соображений рациональности. Не думаю, что в реальной жизни оператор сможет обрабатывать большее количество одновременных вызовов без риска потерять важный звонок. Можно было бы конечно предоставить пользователю возможность решать относительно величины этого значения, но я подумал, что лишний повод думать ему ни к чему и принял решение за него.

Реализовать вызов можно не только набрав номер/username в поле ввода, но и выбрать эти данные из контактной информации, хранящейся в Вашей базе. Для этого в правой части страницы есть все необходимое. Сначала необходимо определиться со справочником, в котором Вы планируете найти собеседника. Их, как правило, три: контрагенты, сотрудники и физические лица. При перемещении по списку выбранного справочника в нижнем маленьком окошке будет появляться необходимая контактная информация (телефоны и факсы), относящаяся к текущему контрагенту/сотруднику/физлицу. Сделав выбор (кликнув 2 раза левой клавишей мышки) по строке с нужными контактными данными Вы сделаете попытку вызова на ID, алгоритм формирования, которого указан выше. Что касается справочника «Контактные лица», то информация о контактных лицах будет видна при просмотре справочника «Контрагенты».

В окне текущих вызовов Вы можете наблюдать, то что происходит в данный момент. Все входящие вызовы, если они еще «звонят» отображаются красным цветом. Если соединение произошло (говорите или удерживаете), тогда вызов зеленый. Исходящий вызов, еще не достигший результата (не сняли трубку) – синий. Если Вы находитесь не на странице управления вызовами, то при звонке Вам внизу будет соответствующее сообщение.

Колонка “RemoteHold” покажет Вам, что на другом конце выполняется удержание данного вызова, т.е. там нажали кнопку “Hold”. К сожалению эта реализация не усладит Ваш слух в эти минуты красивой музыкой, если это не делает Ваша PBX (АТС). Если хотите, со своей стороны тоже можете нажать «Удержание» и позаниматься своими делами.

В реализации на управляемых формах страница "Вызовы" выглядит несколько иначе. 

 

 

Я убрал возможность выбора контактной информации со страницы, вынеся это в отдельную форму и теперь к необходимым справочникам можно обратиться через кнопку «Выбор справочников», расположенную на этой же странице. Мне кажется, это позволило разгрузить страницу без потери функциональности.

Командное меню таблицы вызовов.

«Принять» - принять входящий вызов. Аналогично поднятию трубки на телефоне, когда он звонит.

«Отклонить» - Отклонить входящий вызов (поднять и положить трубку), закончить диалог (положить трубку).

«Перевести» - Перевести текущий вызов на другого пользователя. Перевести можно только активный вызов, тот где Вы говорите (Ваша трубка снята). В списке вызовов он имеет статус «Говорите».