Содержание
Реклама:
Наши специалисты проконсультируют Вас по работе в программах 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.
Предварительная настройка
Если не предусмотрен в системе русский голос, то его необходимо установить. По умолчанию 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/