Прием СМС из 1С

31.10.14

Интеграция - SMS рассылки

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

   Я не сторонник использовать 1С для целей отличных от автоматизации учета, но руководство поставило задачу видеть полученные смс именно в 1С Бухгалтерии и выполнять определенные действия при получении.

   Для реализации этой идеи был куплен самый дешевый USB модем и сим карта. До этого опыта работы с модемом или телефоном из 1С я не имел, но знал, что взаимодействовать с устройством можно отправляя АТ команды на com порт, к которому он подключен. После недолгого поиска в интернете необходимые команды были найдены, но выяснилось, что в современных версиях виндовс - Телнет, через который можно было бы оттестировать процедуру, уже не входит в поставку. Пришлось воспользоваться одной из альтернатив. Мой выбор пал на Putty, маленькая, бесплатная портабл программка.

Окно Putty

 

Совершив нехитрые настройки, открываем порт и видим долгожданное окно консоли.

Консоль

 

Отправляем поочередно команды:

 

AT+CMGF=1 – устанавливает текстовый режим работы, от этой команды зависит формат в котором модем будет присылать список смс. 0-цифровой, 1-текстовый. 

 

AT+CMGL="ALL" – получает все сообщения, которые есть в памяти сим карты.

 

После выполнения команды, видим на экране список смс в виде: 

+CMGL: 5,"REC UNREAD","+7920631**93",,"14/10/30,12:20:29+12"

041204410435043C0020043F04400438043204350442002E0020042D0442043E00200441043C04410020043104430434043504420020043F0440043E0447043804420430043D043E002004380437002000310441 


    Если с первой строкой все понятно:номер смс в памяти сим, статус, телефон отправителя и дата/время сообщения, то сам текст сообщения- закодирован.

  Прочитав кучу информации по структуре смс, понял, что сообщения написанные на кириллице кодируются юникодом, блоками по 4 шестнадцатеричных символа.

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

Функция ИзХСчислВЧисло(аф,Шаблон)
	аф = ВРег(аф); // на всякий случай.
	ДлинаШаблона = СтрДлина(Шаблон);	
	ДлинаСтроки = СтрДлина(аф);
	Рез = 0;	
	Для ТекСимвол = 1 По ДлинаСтроки Цикл
		ОбрабатываемыйСимвол = Сред(аф, ТекСимвол,1);
		ПозицияВШаблоне = Найти(Шаблон,ОбрабатываемыйСимвол)-1;
		Рез = Рез * ДлинаШаблона + ПозицияВШаблоне;
	КонецЦикла;	
	Возврат(Рез);	
КонецФункции

Переводим из шестнадцатиричное число в десятичное и получаем символ соответствующий этому коду. В целом процедура выглядит так:

Процедура Конвертация()
Результат="";	
 ДлиннаРез=Цел(СтрДлина(ИсходныйТекст)/4);
 Для й=0 по ДлиннаРез-1 Цикл
    Результат=Результат+ПолучитьСимвол(Сред(ИсходныйТекст,й*4+1,4)); 
 КонецЦикла;
КонецПроцедуры
Функция ПолучитьСимвол(ИсхСтр)
 КодСимв=ИзХСчислВЧисло(ИсхСтр,"0123456789ABCDEF");
 ЧислоКодСивола=Число(КодСимв);
 Возврат Символ(ЧислоКодСивола);
КонецФункции

Обработка для проверки конвертации

 

 Итак, процедура конвертации работает, осталось отправить из АТ команды на com порт, получить ответ, преобразовать в кириллический текст и обрабатывать по своему усмотрению. Существует несколько вариантов чтения ком порта, я выбрал через FileSystemObject.

 Попытка 
     FSO = Новый COMОбъект("Scripting.FileSystemObject");
 Исключение
   Сообщить(ОписаниеОшибки());
   Возврат;
  КонецПопытки;
//Отправка команды
	file=fso.CreateTextFile(КомПорт); 
	file.WriteLine("AT+CMGF=1");
	file.WriteLine("AT+CMGL=""ALL""");
	file.Close();
//Чтение результата:
  file=fso.OpenTextFile(КомПорт); //Открываем файл в режиме "только чтение" 
  Пока ИСТИНА Цикл
    Если  Найти(Стр,"BOOT")<>0 или  Найти(Стр,"ERROR")<>0 Тогда
	Прервать;
    КонецЕсли;
  стр=file.ReadLine();
  КонецЦикла;

  file.Close();

 

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

   Через некоторые время столкнулся с проблемой переполнения памяти сим карты, поэтому после успешного чтения отправляю команду на удаление смс.

file=fso.CreateTextFile(КомПорт); 
	Для Каждого Эл Из МассивСМС Цикл
		file.WriteLine("AT+CMGD="+Эл.НомерСМС);
	КонецЦикла;
file.Close();

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

Код процедуры, которая добавляет СМС в справочник. В конфигурацию должен быть добавлен справочник СМСсообщения  с реквизитами строкового типа : НомерСМС, Телефон, Дата, Сообщение. И константа, в которой храниться номер ком порта модема.

Процедура ПроверкаСМС() Экспорт
	НомерПорта=Константы.КомПортМодема.Получить();
	Если Не ЗначениеЗаполнено(НомерПорта) Тогда
		Сообщить("Не задан ком порт для модема!");
		Возврат;
	КонецЕсли;
	
	КомПорт = "\\.\COM"+НомерПорта;
	
	Попытка 
		FSO = Новый COMОбъект("Scripting.FileSystemObject");
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	СтрокаНаОтправку="AT+CMGF=1";
	file=fso.CreateTextFile(КомПорт); 
	file.WriteLine("AT+CMGF=1");
	file.WriteLine("AT+CMGL=""ALL""");
	file.Close();
	МассивСМС=Новый Массив;
	Стр="нач. знач";
	file=fso.OpenTextFile(КомПорт); //Открываем файл в режиме "только чтение" 
	Пока ИСТИНА Цикл
		Если  Найти(Стр,"BOOT")<>0 или  Найти(Стр,"ERROR")<>0 Тогда
			Прервать;
		КонецЕсли;
		стр=file.ReadLine();
		Если Найти(Стр,"+CMGL:") Тогда //строка с заголовком сообщения
			СтруктураЗаголовка=РазобратьСтрокуЗаголовка(Сред(Стр,7));
			Если СтруктураЗаголовка=Неопределено Тогда
				Сообщить("Неверный формат заголовка сообщениея!");
				Прервать;
			КонецЕсли;
			ТекстСообщения=file.ReadLine();
			Результат="";	
			ДлиннаРез=Цел(СтрДлина(ТекстСообщения)/4);
			Для й=0 по ДлиннаРез-1 Цикл
				Результат=Результат+ПолучитьСимвол(Сред(ТекстСообщения,й*4+1,4)); 
			КонецЦикла;
			СтруктураЗаголовка.Вставить("Сообщение",Результат);
			МассивСМС.Добавить(СтруктураЗаголовка);                          
		КонецЕсли;
	КонецЦикла; 
	file.Close();
	file=fso.CreateTextFile(КомПорт); 
	Для Каждого Эл Из МассивСМС Цикл
		file.WriteLine("AT+CMGD="+Эл.НомерСМС);
	КонецЦикла;
	file.Close();
	Для Каждого  Эл из МассивСМС Цикл
		НовСмс=Справочники.СМСсообщения.СоздатьЭлемент();
		ЗаполнитьЗначенияСвойств(НовСмс,Эл);
		НовСмс.Записать();
	КонецЦикла
КонецПроцедуры


Функция ИзХСчислВЧисло(аф,Шаблон)
	аф = ВРег(аф); // на всякий случай.
	ДлинаШаблона = СтрДлина(Шаблон);
	
	ДлинаСтроки = СтрДлина(аф);
	Рез = 0;
	
	Для ТекСимвол = 1 По ДлинаСтроки Цикл
		ОбрабатываемыйСимвол = Сред(аф, ТекСимвол,1);
		ПозицияВШаблоне = Найти(Шаблон,ОбрабатываемыйСимвол)-1;
		Рез = Рез * ДлинаШаблона + ПозицияВШаблоне;
	КонецЦикла;
	
	Возврат(Рез);
	
КонецФункции


Функция ПолучитьСимвол(ИсхСтр)
	КодСимв=ИзХСчислВЧисло(ИсхСтр,"0123456789ABCDEF");
	ЧислоКодСивола=Число(КодСимв);
	Возврат Символ(ЧислоКодСивола);
КонецФункции

Функция РазобратьСтрокуЗаголовка(СтрЗаголовка)
	СтруктураЗаголовка=Новый Структура;
	МассивСтрок=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрЗаголовка);
	Если МассивСтрок.Количество()<6 Тогда
		Возврат Неопределено;
	КонецЕсли;
	Телефон=СтрЗаменить(МассивСтрок[2],"""","");//удаляем кавычки
	ДатаСМС=СтрЗаменить(МассивСтрок[4],"""","");
	СтруктураЗаголовка.Вставить("НомерСМС",МассивСтрок[0]);
	СтруктураЗаголовка.Вставить("Телефон",Телефон);
	СтруктураЗаголовка.Вставить("Дата",ДатаСМС);
	Возврат СтруктураЗаголовка;
КонецФункции	

прием смс com порт кодировка

См. также

Email, SMS, Telegram рассылки из 1С - Директ Маркетинг

Управление взаимоотношениями с клиентами (CRM) Мессенджеры и боты SMS рассылки Email рассылки Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

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

7788 руб.

07.04.2014    83615    40    191    

127

Подтверждение скидки и верификация дисконтной карты по СМС (SMS) или звонку для 1С

SMS рассылки Оптовая торговля Розничная торговля Оперативный учет 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

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

4500 руб.

06.09.2017    25098    25    0    

32

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2659    0    John_d    8    

53

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3953    ke.92@mail.ru    16    

61

Универсальная простая отправка СМС

SMS рассылки Абонемент ($m)

Расширение предназначено для оправки СМС по списку телефонов. Является универсальным и подойдёт для любой конфигурации.

2 стартмани

14.09.2023    1448    3    Viki_push    3    

50

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8801    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. It-developer 24 31.10.14 12:54 Сейчас в теме
2. Bad_Developer 31.10.14 14:37 Сейчас в теме
Хорошая статья, хотел добавить, что стандартный telnet client включается в современных системах через Windows Features (Компоненты системы)
3. V_V_V 31.10.14 18:11 Сейчас в теме
"поэтому после успешного чтения отправляю команду на удаление смс" - я так понимаю пример выцарапан из работающего кода. Откуда взялся "МассивСМС" ?
4. Sybr 241 31.10.14 19:05 Сейчас в теме
(3) МассивСМС мы заполняем в цикле чтения, если нужно могу добавить полный код регламентной процедуры.
5. V_V_V 31.10.14 19:14 Сейчас в теме
(4) вот это я и имел ввиду. Просто ваш МассивСМС по-ходу содержит какие-то Соответствия или еще чего - новичкам будет печально использовать этот код :)
7. Sybr 241 31.10.14 19:32 Сейчас в теме
(5) Да, это структура. Добавил полный код, который добавляет смс в справочник, теперь должно быть понятнее.
14. V_V_V 03.11.14 16:41 Сейчас в теме
(7) Пока что мне не актуально, только рассылаю СМС, но все равно плюсану.
(12) shurik_shurik, если по России, то есть куча готовых решений через сервисы рассылки. Например в библиотеке стандартных подсистем зашито 2 варианта. По Украине тут проскакивало (сочтут за рекламу, поиск поможет), сам использую. Стоимость одного СМС дешевле через сервис рассылки, хотя может какие-то льготные пакеты и можно найти...
6. karetir 31.10.14 19:26 Сейчас в теме
8. nipil 01.11.14 17:04 Сейчас в теме
Хорошая полезность!
- "Дайте две"!
9. davdykin 25 01.11.14 20:04 Сейчас в теме
Спасибо за статью. Актуальная тема с изящным решением.
10. Pasha1st 837 01.11.14 22:01 Сейчас в теме
Совместимость с разными модемами не проверяли?
Кстати, большинство современных модемов создает несколько COM-портов, что позволяет управлять модемом (в т.ч. работать с СМС) при установленном соединении с интернетом
11. Sybr 241 02.11.14 06:25 Сейчас в теме
(10) Точно, забыл написать, что у меня работает это все на модеме huawei e173, на других не проверял, но думаю способ достаточно универсальный.
12. shurik_shurik 03.11.14 09:11 Сейчас в теме
Красиво! Кстати, по поводу универсальности: я когда-то давно этим вопросом занимался еще на DELPHI с разными модемами: стандарт этих команд общепринят.
Еще бы процедуру отправки СМС через модем.... Было-бы очень здорово!
P.S. Проверяли на составных СМС? это когда текста много и СМС состоит из нескольких сообщений.
15. Sybr 241 03.11.14 17:33 Сейчас в теме
(12) Я отправлял через веб сервисы, важно было писать название организации вместо номера. Готового кода для отправки через модем у меня нет, но принцип там такой же.
(13) Разные бзики бывают у руководства )
13. Bacemo 03.11.14 12:25 Сейчас в теме
А я не понимаю, зачем СМС получать в 1С -:)))
16. dj_serega 390 05.11.14 08:47 Сейчас в теме
Крутая штука, но вот пригодится или нет это уже вопрос :)
17. CagoBHuK 32 05.11.14 09:50 Сейчас в теме
Научился работать с ком-портом и изучил протокол АТ для модема?
18. Sybr 241 05.11.14 14:41 Сейчас в теме
(17) Это к чему? Намек, что не было смысла писать о таких элементарных вещах? Самое сложно было преобразовать кодировку в русский текст, а отправлять команды на ком порт трудностей не составляет.
19. ershz 06.11.14 11:19 Сейчас в теме
Клиент telnet, который начиная с Vista, по умолчанию не устанавливается и требует включения через appwiz.cpl, в принципе не умеет работать с ком-портом.
Вероятно, имелся в виду гипертерминал (HyperTerm), который тоже исключен из поставки.
Putty - правильный выбор :)
20. monkbest 115 06.11.14 13:23 Сейчас в теме
Классно, я плюсанул, но в начале статьи обманул:
получилось обойтись только usb модемом и платформой 1С

Putty - часть платформы?
21. Sybr 241 07.11.14 09:22 Сейчас в теме
(20) Она была нужна, только для тестривания АТ команд. Можно было бы обойтись и без неё)
22. утюгчеловек 38 16.11.14 13:39 Сейчас в теме
Очень интересная статья. Поставил бы два плюса, если бы мог.

для въедливых, поясните пожалуйста: usb-модем это тот, в который нужно засунуть сим-карту? Просто не очевидный момент, в поисковиках вижу "тип: GSM", это однозначно указывает на необходимость сим-карты для работы или нет?

Предположим, у меня есть та самая "несовременная" версия винды, и я хочу проверить команды модема. Как это сделать? Куда копать? В настройках HyperTerminal ничего криминального не нашел. Вижу консоль программы, и до свидания. Просто слова
Совершив нехитрые настройки, открываем порт и видим долгожданное окно консоли.

для меня лично напомнило "путем нехитрых преобразований" в книгах Ландау по физике, где трехэтажный интеграл преобразуется в компактный одноэтажный. Нужно пояснение
23. Sybr 241 17.11.14 12:52 Сейчас в теме
(22) Да, тут конечно имеется модем с сим картой. Сначала необходимо установить драйвера для модема, обычно они на флэш памяти самого модема лежат и устанавливаются из автозапуска. В гипертерминале нужно выбрать этот установленный модем, нет сейчас его под рукой, не могу сказать как там точно это делать. Попробуйте скачать Путти, там сложностей никаких нет точно, выбирается только ком порт и скорость.
24. saiten 246 17.11.14 13:21 Сейчас в теме
Кстати, писать в ком-порт можно и стандартными средствами 1С:
	ком = новый ЗаписьТекста("//./COM12",КодировкаТекста.UTF16);
	ком.ЗаписатьСтроку(СтрокаДляЗаписиВПорт);

Читать, наверное. тоже можно, но я не пробовал.
25. Sybr 241 17.11.14 14:42 Сейчас в теме
(24) У меня почему-то этот способ работал очень долго и постоянно зависал, изначально тоже так побывал, но остановился на варианте из статьи.
26. new_creation 27.02.15 02:55 Сейчас в теме
Спасибо за статью. Думаю скоро пригодится.
27. SoftLeon 27 01.03.15 11:27 Сейчас в теме
Спасибо за статью, очень актуально!!!
28. Sybr 241 03.03.15 08:07 Сейчас в теме
29. new_creation 04.03.15 20:40 Сейчас в теме
Sybr, с помощью твоего кода пытаюсь получить смс-ки. При попытке считывании строк методом ReadLine Платформа виснет, не знаешь почему?
30. Sybr 241 05.03.15 14:38 Сейчас в теме
(29) new_creation, а в консоли попробовал подключиться к модему, происходит чтение? Скорее всего, если виснет, то никаких сообщений в данный момент с компорта нет.
31. new_creation 06.03.15 02:28 Сейчас в теме
(30) да. Смотрю через консоль - сообщения есть (3). Скажи, а ты настраивал модем ат-командами (например команда есть, чтоб он работал в режиме "только модем" и т.п.)? Это на сервере MS 2008... Как ты сделал, чтобы у тебя появилась строка Modem в Putty? У меня ее нет (Default...). Еще Putty портабельная, ничего? Еще возможно модем подключен через роутер (по сети настраиваю). Я в этих портах, роутерах не понимать особо. Подскажи, если знаешь... спасибо заранее.
32. Sybr 241 11.03.15 09:49 Сейчас в теме
(31) Модем не настраивал, работает "как есть". Строка Modem это просто название настроек у меня. У меня тоже была портабл версия. А на счет модема через роутер я не понял, это же USB модем, он у тебя в роутер воткнут? Если так, то странно, что Putty видит его. Подразумевается, что модем должен быть в USB, с эмуляцией com порта.
33. lunjio 66 30.10.17 14:40 Сейчас в теме
Решал подобную задачу, т.к имел опыт работы с мобильной платформой и веб-сервисами.
В основной базе предоставил веб-сервис, который предоставляет не отправленные СМС из базы и конфигурацию на мобильной платформе, она использует веб-сервис, получает список смс к отправке, отправляет и фиксирует дату отправки, имеются настройки по периодичности отправки СМС, количеству, времени, лог работы. Единственная трудность при разворачивании, это поднятие веб-сервера для работы с вебсервисом и постоянное нахождение мобильного телефона дешевенького(выбор пал на ZTE за 5 тыс р.) в сети с предустановленной мобильной конфигурацией, запущенной, в сети. Если есть интересующиеся, могу сделать публикацию.
34. KeyFire 07.01.18 17:33 Сейчас в теме
У меня так и не получилось этим способом СМС-ки прочитать. Модем huawey M150-2. При использовании scripting.filesystemobject зависает. Терминалом если проверять те же команды, смс выводятся.
35. user1221610 13.01.20 11:02 Сейчас в теме
(34) либо порт занят другим приложением (например ПО модема), либо закрыт
код для открытия порта используя PowerShell

ТекстСкрипта = "$port = New-Object System.IO.Ports.SerialPort; $port.PortName = '" + КомПортУчЗап + "'; $port.open(); write-host ""ok""";
ЗапуститьПриложение("powershell -executionpolicy unrestricted -command " + ТекстСкрипта,,Истина);

КомПортУчЗап компорт, к которому подключен модем, например COM4

При перезапуске Винды по умолчанию порт закрыт
Оставьте свое сообщение