On-line консультация по работе в программах 1С по скайпу (1C по Skype)

Реклама:

Наши специалисты проконсультируют Вас по работе в программах 1С онлайн через программу скайп (Skype) в рамках услуги работа специалиста 1С.

Консультации по скайпу (1C по Skype) предоставляются по следующим вопросам:

— Общие принципы работы в программах 1С:Предприятие 8.3, 8.2, 7.7 — Работа в программе 1С:Розница 2.2 — Работа в программе 1С:Управление торговлей 10.3 — Работа в программе 1С:Управление торговлей 11 — Работа в программе 1С:Управление небольшой фирмой 1.6 — Работа в программе 1С:Бухгалтерия предприятия 2.0 — Работа в программе 1С:Бухгалтерия предприятия 3.0 — Работа в программе 1С:Зарплата и управление персоналом 2.5

Чтобы получить консультацию необходимо оставить заявку на консультацию по Skype либо позвонить по телефону +7 (343) 206-30-33.

Реклама:

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

Должен предупредить, что сам Скайп записи разговоров не поддерживает, записывать и воспроизводить разговор придется сторонними средствами. Лично для меня вопрос конфиденциальности остро не стоит, поэтому у меня все разговоры по Скайпу пишутся сторонней утилитой Free Video Call Recorder for Skype. Почему именно этой утилитой – а бог его знает, просто первой попалась на глаза, их в интернете есть целый зверинец, выбирай любую. Мне для экспериментов подошла эта.

Но, приступим.

Для интеграции Скайпа в 1С потребуется библиотека «Skype4Com.dll». Скачать ее можно как с сайта самого Скайпа, так и из любого другого места. Ссылок на скачивание в инете великое множество.

Следующий шаг – регистрация библиотеки в системе.

Тут все как обычно, библиотека регистрируется утилитой Regsrv32, далее указываете путь и больше не заморачиваетесь. Для простоты положил библиотеку в корень диска и регистрация прошла без проблем.

И вот после этих манипуляций переходим, собственно, к кодированию:

Тут тоже все достаточно банально :

Скайп = ПолучитьCOMОбъект("","Skype4COM.Skype");// Сообщение об ошибке создания объектаЕсли Скайп =Неопределено Тогда Сообщить("Ошибка создания объекта!");КонецЕсли;

Раскрывая объект Скайп в отладчике видим все, что нам доступно, первое необходимое нам свойство – IsRunning

Если Скайп не запущен, то запускаем:

Если Не Скайп.Client.IsRunning Тогда Скайп.Client.Start(True,True);// Что бы окно Скайпа не мельтишило на экране на скорую руку придумал такой способ, //запускаем пустой цикл на 10 секунд, если этого не сделать, //то Скайп не успеет загрузиться и следующая команда 1С выдаст ошибку НачВремя = ТекущаяДата();Пока 1=1Цикл     Если ТекущаяДата()- НачВремя >10Тогда         Прервать;         КонецЕсли; КонецЦикла; // и запускаем Скайп со свернутым окном Скайп.Client.Minimize();КонецЕсли;  

Скайп запустится с текущими установками, то есть под ником и паролем, с которыми он запускался в последний раз, естественно, если он настроен таким образом.

Следующий шаг – читаем список контактов, для удобства создадим ТаблицуЗначений с тремя колонками.

ПользователиСкайп =Новый ТаблицаЗначений; ПользователиСкайп.Колонки.Добавить("ИДСкайп",Новый ОписаниеТипов("Строка")); ПользователиСкайп.Колонки.Добавить("ИМЯ",Новый ОписаниеТипов("Строка")); ПользователиСкайп.Колонки.Добавить("Статус",Новый ОписаниеТипов("Строка"));

В последней строке может быть и Булево, но мне проще со Строкой

И запускаем цикл

Для каждого Контакт ИЗ Скайп.Friends ЦИКЛ СТР = ПользователиСкайп.Добавить(); СТР.ИДСкайп= Контакт.Handle;Если СОКРЛП(Контакт.FullName)=""тогда СТР.ИМЯ= Контакт.Handle;Иначе СТР.ИМЯ= Контакт.FullName; Конецесли; СТР.Статус = Контакт.OnlineStatus;КонецЦикла;

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

И финал наших манипуляций – звонок по Скайпу:

Скайп.PlaceCall(ИДСкайп);

В том случае, если нужно позвонить на произвольный номер, то пишем строку формата «+71234567890» и подставляем ее вместо «ИДСкайп». Выскочит окошко Скайп, и пойдет звонок на указанный номер.

Источник: http://1clancer.ru/

Обработка для 1С в статье позволяет получить аудиофайл с речью, сгенерированной компьютером на основе текстовой строки, позвонить собеседнику через Skype и произнести его. Функциональность выполнена на основе .Net framework и API для Skype. Разработка будет полезна не только для серьезных бизнес-приложений, но и для домашних опытов и шуток друзьям. Для звонков на реальные номера потребуется пополненный баланс на Skype.ba1fbd5e943ed865f546f12c33f44220.png

Предварительная настройка

Если не предусмотрен в системе русский голос, то его необходимо установить. По умолчанию Windows 7 может читать только английские тексты. Для русификации голоса нужно установить дополнительный русский голос. В Интернете удалось найти только голос ScanSoft Katerina Full 22kHz (до конца не понятна правовая возможность использования этого голоса). Многим может показаться голос медленным. Для его убыстрения необходимо сделать запись в реестре:

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftSpeechVoicesTokensScanSoftKaterina_Full_22kHz]  "pp type"="email" 

Скайп позволяет взаимодействовать с собой через библиотеку skype4COM.Необходимо скачать эту библиотеку и выполнить ее регистрацию в реестре через regsvr32 skype4COM.dll. Для данной операции могут потребоваться права администратора. После попытки использовать Skype в первый раз появится запрос в Skype’е. Нужно дать разрешение программе 1cv8c.exe на использование Skype. Контроль программ, имеющих доступ, можно выполнить через Настройки-Дополнительно-Расширенные настройки-Контроль доступа других программ к Skype. Для доступа к .Net framework из 1С необходимо установить .Net Bridge. Сейчас последняя версия 4.0.4.

Описание кода C#

Код класса SkypeSpeech разделен на 2 части: генерация звука через класс SpeechSynthesizer и работа со Skype через SKYPE4COMLib. Генерация звука:

SpeechSynthesizer reader = new SpeechSynthesizer(); if (!String.IsNullOrEmpty(voiceName)) {     var voice = reader.GetInstalledVoices().Where(m => m.VoiceInfo.Name == voiceName).FirstOrDefault();     if (voice != null)         reader.SelectVoice(voiceName); } reader.SetOutputToWaveFile(tempFilePath, new SpeechAudioFormatInfo(     16000,     AudioBitsPerSample.Sixteen,     AudioChannel.Mono ));  reader.Speak(text); reader.SetOutputToNull(); reader.Dispose(); 

Особенности кода следующие. На вход в Skype нужно подать wav-файл с определенными параметрами, поэтому параметры устанавливаются явно. Для управления голосами SpeechSynthesizer используются методы GetInstalledVoices и SelectVoice. Работа со Skype ведется через Skype4COM. В Сети есть много примеров, например: http://habrahabr.ru/post/139319/. Все примеры, какие я смотрел, отличаются, на мой взгляд, усложненной структурой: логика не умещается в один метод, а распределена между разными методами и событиями. Хотелось уместить всю логику в одну процедуру для наглядности. Подключение к Skype. Второй параметр в skype.Attach заменен на true. Это значит, что скайп возвратит управление, когда произойдет подключение.

Skype skype = new Skype(); if (!skype.Client.IsRunning)     skype.Client.Start(true, true);  skype.Attach(8, true);  

Звонок через Skype:

Call call = skype.PlaceCall(target); do {      if (call.Status == TCallStatus.clsBusy         || call.Status == TCallStatus.clsCancelled         || call.Status == TCallStatus.clsFailed)         break;      System.Threading.Thread.Sleep(1); } while (call.Status != TCallStatus.clsInProgress);  if (call.Status != TCallStatus.clsInProgress)     return; 

Проигрывание звукового файла. Была предпринята попытка определять время звучания по времени, когда файл занят и не доступен для записи.

call.set_InputDevice(TCallIoDeviceType.callIoDeviceTypeFile, waveFilePath); do {     System.Threading.Thread.Sleep(1000); } while (IsBusy(waveFilePath));  

Метод IsBusy выглядит так:

try {     using (FileStream stream = File.OpenWrite(filePath))     {         stream.Close();         return false;     } } catch (IOException) {     return true; } 

Описание кода 1С

Инициализация происходит в событии формы ПриОткрытии. Создание объекта .Net Bridge.

ПодключитьВнешнююКомпоненту("Elisy.NetBridge4"); AddIn = New("AddIn.ElisyNetBridge4"); net = AddIn.GetNet(); 

Загрузка сборки из GAC:

net.LoadAssembly("System.Speech, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");

Загрузка сборки из макета к обработке:

Макет = ПолучитьМакет("Elisy_SkypeSpeech_dll"); ДвоичныеДанные = Base64String(Макет); assemblyBytes = net.CallStatic("System.Convert", "FromBase64String", ДвоичныеДанные); net.CallStatic("System.Reflection.Assembly", "Load", assemblyBytes); 

За генерацию звука и отправку голосового сообщения через Skype отвечает класс Elisy.SkypeSpeech.SkypeSpeech. Поэтому объект этого типа нужно создать для доступа к нему.

skypeSpeech = net.New("Elisy.SkypeSpeech.SkypeSpeech");

Команда генерации аудио-файла skypeSpeech.CreateSpeech. Первый параметр – имя файла с полным путем, второй параметр – текст сообщения. Третий параметр – имя голоса.

skypeSpeech.CreateSpeech(tempFilePath, Объект.Сообщение, "ScanSoft Katerina_Full_22kHz");

Команда отправки на Skype голосового сообщения skypeSpeech.SendAudioMessage. Первый параметр – номер телефона или имя Skype. Второй параметр – имя аудио-файла.

skypeSpeech.SendAudioMessage(Объект.НомерТелефона, tempFilePath);

Известные проблемы и их решения

Записанный аудиофайл произносит только слова, написанные латинскими буквами, например, Skype. Это означает, что не установлен в систему или не выбран необходимый русский голос. Его необходимо установить. Если это голос не ScanSoft Katerina Full 22kHz, то необходимо подправить вызов skypeSpeech.CreateSpeech(ПутьКФайлу, Объект.Сообщение, «ScanSoft Katerina_Full_22kHz») на нужное имя голоса. При нажатии «Позвонить по Skype TargetInvokationException с сообщением «Retrieving the COM class factory for component with CLSID {830690FC-BF2F-47A6-AC2D-330BCB402664} failed due to the following error: 80040154 Класс не зарегистрирован (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).». Это означает, что должным образом не зарегистрирована библиотека для доступа к Skype skype4COM.dll. Ее нужно скачать и зарегистрировать с правами администратора через regsvr32 skype4COM.dll.

Что не реализовано

Обработка работает исходя из предположения, что передача передача голосового сообщения будет вестись стандартным образом: звонок – ответ – передача сообщения – завершение звонка. В текущей версии обработки нет анализа статуса: доставлено или недоставлено. Например, телефон у абонента может быть занят или абонент начал слушать сообщение и самостоятельно прервал разговор. В 1С не удалось удалить временный файл в конце обработки. Это странное явление, которое не удалось побороть, потому что в тестовом приложении через C# временный файл нормально удалялся. Пример полученного аудио-файла для ScanSoft Katerina_Full_22kHz: audio.wav (180,78 kb) Пример полученного аудио-файла для RHVoice Elena (Russian): audio-rhvoice.wav (159,42 kb) Пример полученного аудио-файла для RHVoice Aleksandr (Russian): audio-rhvoice-alexandr.wav (196,76 kb) Обработка для 1С: Предприятие: SkypeSpeech.epf (14,21 kb)Внешняя компонента для работы со Skype

Со Skype можно работать и без ВК (см. здесь), но в этом случае мы лишаемся возможности получать события от Скайпа. 

Данная внешняя компонента помогает передавать в 1С события из Скайпа. Сразу предупреждаю — пока только самый необходимый минимум.

Для работы компоненты необходим установленный и зарегистрированный Skype4COM.dll (взять можно здесь)

Перечень событий, поступающих в 1С (в скобках название события по документации Скайпа):

  • ChatMessageChanged   (MessageStatus) 
  • OnlineStatusChanged (OnlineStatus)
  • ConnectionStatusChanged (ConnectionStatus)
  • UserStatusChanged (UserStatus)

Самое важное из этого списка MessageStatus — статус сообщения. Т.о. мы можем узнать в 1С о входящем сообщении. Остальные пока добавил просто так. 

  • MessID, ИДСообщения
  • Mess, Сообщение
  • From, ОтКого
  • FromName, ОтКогоИмя
  • FromGroup, ИзГруппы

При получении сообщения его данные записываются в эти свойства.

«ОтКого» — это скайп-логин отправителя.

«ОтКогоИмя» — имя контакта отправителя в вашем скайпе.

«ИзГруппы» — группа контактов, которой принадлежит отправитель.

Со свойством «ИзГруппы»  есть проблемы. Если при запущенной компоненте в самом скайпе изменить принадлежность контакта какой-либо группе, то компонента выдаст верный результат только после переподключения. Почему так происходит — пока не разобрался. Если же не менять у контактов группу во время работы компоненты — группа выдается верно.

Если кто знает, как решить эту проблему с группами — буду благодарен за подсказку.

  • Connect, Подключить
  • SendMess, ОтправитьСообщение
  • Dial, Позвонить

С помощью первого метода осуществляется подключение к Skype 

ЗагрузитьВнешнююКомпоненту("Skype1C.dll");  Skype = СоздатьОбъект("AddIn.Skype1C");   Skype.Подключить();

для 1С:Предприятие 8.х объект создаем так:

Skype = Новый("AddIn.Skype1C"); 

В самом Скайпе нужно дать доступ приложению для возможности работы.

Skype.ОтправитьСообщение(Кому,ТекстСообщения);

Кому — это логин контакта, которому отправляем сообщение. Для ответа на полученное сообщение используйте свойство .ОтКого

Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)  Сообщить(ТекущееВремя()+" Событие "+Событие+ " Данные = "+Данные);  Если Источник = "Skype1C" Тогда  Если Событие = "ChatMessageChanged" Тогда  //'cmsSending = 0 indicates the message is in the process of being sent.  //'cmsSent = 1 indicates the message has been sent.  //'cmsReceived = 2 indicates the message has been received.  //'cmsRead = 3 indicates the message has been read.    Статус = Данные;  Если Статус = "0" Тогда  varCmsatus = "cmsSending";  ИначеЕсли Статус = "1" Тогда  varCmsatus = "cmsSent";  ИначеЕсли Статус = "2" Тогда  varCmsatus = "cmsReceived";  ИДСообщ = Skype.ИДСообщения;  Сообщение = Skype.Сообщение;  ОтКого = Skype.ОтКого;  ОтКогоИмя = Skype.ОтКогоИмя;  Группа = Skype.ИзГруппы;  Сообщить("("+ОтКого+") "+ОтКогоИмя+": "+Сообщение+" Группа: "+Группа );  Кому = ОтКого;  ТекстСообщения = "Привет! Это отвечает 1С:Робот!";  Skype.ОтправитьСообщение(Кому,ТекстСообщения);  ИначеЕсли Статус = "3" Тогда  varCmsatus = "cmsRead";  КонецЕсли;  Сообщить(varCmsatus);  ИначеЕсли Событие = "OnlineStatusChanged" Тогда  Если Данные = "0" Тогда  varOLStatus = "olsOffline";  ИначеЕсли Данные = "1" Тогда  varOLStatus = "olsOnline";  ИначеЕсли Данные = "2" Тогда  varOLStatus = "olsAway";  ИначеЕсли Данные = "3" Тогда  varOLStatus = "olsNotAvailable";  ИначеЕсли Данные = "4" Тогда  varOLStatus = "olsDoNotDisturb";  ИначеЕсли Данные = "5" Тогда  varOLStatus = "olsSkypeOut";  ИначеЕсли Данные = "6" Тогда  varOLStatus = "olsSkypeMe";  Иначе  varOLStatus = "olsUnknown";  КонецЕсли;  Сообщить(varOLStatus);  ИначеЕсли Событие = "ConnectionStatusChanged" Тогда  Если Данные = "0" Тогда  varConStatus = "conOffline";  ИначеЕсли Данные = "1" Тогда  varConStatus = "conConnecting";  ИначеЕсли Данные = "2" Тогда  varConStatus = "conPausing";  ИначеЕсли Данные = "3" Тогда  varConStatus = "conOnline";  Иначе  varConStatus = "conUnknown";  КонецЕсли;  Если Данные = "Ошибка" Тогда  Сообщить(" Связь со Skype1C прервана");  КонецЕсли;  Сообщить(varConStatus);  ИначеЕсли Событие = "UserStatusChanged" Тогда  Если Данные = "0" Тогда  varCusStatus = "cusOffline";  ИначеЕсли Данные = "1" Тогда  varCusStatus = "cusOnline";  ИначеЕсли Данные = "2" Тогда  varCusStatus = "cusAway";  ИначеЕсли Данные = "3" Тогда  varCusStatus = "cusNotAvailable";  ИначеЕсли Данные = "4" Тогда  varCusStatus = "cusDoNotDisturb";  ИначеЕсли Данные = "5" Тогда  varCusStatus = "cusInvisible";  ИначеЕсли Данные = "6" Тогда  varCusStatus = "cusLoggedOut";  ИначеЕсли Данные = "7" Тогда  varCusStatus = "cusSkypeMe";  Иначе  varCusStatus = "cusUnknown";  КонецЕсли;  Сообщить(varCusStatus);  КонецЕсли;  КонецЕсли;  КонецПроцедуры 

ИСТОРИЯ:

2011-05-31 (v 0.1.0.1)

* Устанавливаю для входящего сообщения свойство Seen =  True. Чтобы не показывалось в клиенте Скайпа, как непрочтенное

Файлы обработки:

  • Skype1C.dll Для скачивания нужна регистрация

В этой группе 1С

Используемые источники:

  • https://tekdata.ru/online-onlayn-konsultatsiya-1s-1c-po-skaypu-skype/
  • http://e-1c.ru/node/58
  • https://habr.com/ru/post/165883/
  • https://avprog.ru/public/1697/

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий