Как организовать прием SMS в 1С 8.3 напрямую с USB-модема без использования почты

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

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

Вариант 1. Использование LTE/GSM-модемов с прошивкой HiLink через HTTP-запросы

Большинство современных USB-модемов (свистков) функционируют не как классические последовательные устройства, а как компактные сетевые роутеры (режим RNDIS/HiLink). Устройство получает собственный IP-адрес в локальной сети (по умолчанию обычно 192.168.8.1) и предоставляет внутренний веб-интерфейс, а также HTTP REST API для управления.

Преимущества такого подхода:

  1. Модем можно подключить напрямую к USB-порту сервера или вставить в офисный маршрутизатор, сделав его доступным по локальной сети для любого фонового задания 1С.
  2. Нет необходимости использовать сторонние низкоуровневые внешние компоненты для работы с COM-портами. Все взаимодействие строится на штатных объектах 1С HTTPСоединение и HTTPЗапрос.
  3. Модем одновременно может служить резервным интернет-каналом для сетевой инфраструктуры.

Рассмотрим по шагам механизм взаимодействия 1С с HiLink-модемом:

  1. Получение токена сессии и Cookies: Для защиты от несанкционированного доступа веб-интерфейс модема требует передачи специального токена безопасности (CSRF-токен) и сессионных кук в заголовках последующих запросов. Сначала 1С отправляет GET-запрос к API модема для получения заголовков безопасности.
  2. Запрос списка входящих сообщений: Получив токен, формируем POST-запрос с XML-телом, в котором указываем параметры чтения (номер страницы, количество запрашиваемых сообщений, тип хранилища).
  3. Обработка ответа: Модем возвращает XML со списком SMS (номер отправителя, дата, текст сообщения, статус прочтения). Модуль 1С парсит ответ, выполняет поиск соответствующего документа и привязывает данные.
  4. Удаление обработанных сообщений: Память модема и SIM-карты ограничена. После успешного проведения документа 1С отправляет запрос на удаление прочитанных SMS по их ID, чтобы не переполнять буфер устройства.

Посмотрим на пример реализации опроса модема через фоновое регламентное задание 1С:


// Создаем подключение к веб-интерфейсу модема
ЗащищенноеСоединение = Неопределено;
HTTPСоединение = Новый HTTPСоединение("192.168.8.1", 80, , , , 10, ЗащищенноеСоединение);

// Шаг 1. Запрашиваем токен безопасности
HTTPЗапросТокена = Новый HTTPЗапрос("/api/webserver/SesTokInfo");
HTTPОтветТокена = HTTPСоединение.Получить(HTTPЗапросТокена);

Если HTTPОтветТокена.КодСостояния = 200 Тогда
    СтрокаОтвета = HTTPОтветТокена.ПолучитьТелоКакСтроку();
    // Извлекаем токен из XML-ответа (тег TokInfo)
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(СтрокаОтвета);
    
    Токен = "";
    Сессия = "";
    Пока ЧтениеXML.Прочитать() Цикл
        Если ЧтениеXML.Имя = "TokInfo" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ЧтениеXML.Прочитать();
            Токен = ЧтениеXML.Значение;
        ИначеЕсли ЧтениеXML.Имя = "SesInfo" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ЧтениеXML.Прочитать();
            Сессия = ЧтениеXML.Значение;
        КонецЕсли;
    КонецЦикла;
    
    // Шаг 2. Формируем запрос на чтение входящих сообщений
    HTTPЗапросSMS = Новый HTTPЗапрос("/api/sms/sms-list");
    HTTPЗапросSMS.Заголовки.Вставить("__RequestVerificationToken", Токен);
    Если ЗначениеЗаполнено(Сессия) Тогда
        HTTPЗапросSMS.Заголовки.Вставить("Cookie", Сессия);
    КонецЕсли;
    HTTPЗапросSMS.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    
    ТелоЗапросаXML = 
        "<request>" +
        "<page>1</page>" +
        "<maxcount>20</maxcount>" +
        "<todo>1</todo>" +
        "<unreadpreferred>0</unreadpreferred>" +
        "</request>";
    
    HTTPЗапросSMS.УстановитьТелоИзСтроки(ТелоЗапросаXML, КодировкаТекста.UTF8);
    HTTPОтветSMS = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапросSMS);
    
    Если HTTPОтветSMS.КодСостояния = 200 Тогда
        XMLТекст = HTTPОтветSMS.ПолучитьТелоКакСтроку();
        // Производим парсинг полученных сообщений и их запись в информационную базу
    КонецЕсли;
КонецЕсли;

Вариант 2. Прямое чтение через COM-порт и AT-команды

Классические модемы («не-Hilink» прошивки или промышленные GSM-терминалы) определяются в операционной системе как виртуальные COM-порты. В этом случае чтение сообщений выполняется посылкой стандартных AT-команд (AT+CMGL, AT+CMGR, AT+CMGD).

Проанализируем специфику и сложности данного подхода в среде 1С:

  1. Отсутствие встроенной работы с COM-портами: В платформе 1С:Предприятие 8.3 нет встроенного объекта для открытия и чтения последовательного порта. Требуется использование внешних компонент (Native API или COM-объектов).
  2. Разрядность и серверный контекст: При выполнении фоновых регламентных заданий на 64-разрядном сервере 1С под управлением Linux или Windows устаревшие 32-разрядные библиотеки драйверов не смогут загрузиться в процесс rphost. Кроме того, физический USB-модем должен быть подключен именно к тому рабочему серверу кластера, на котором исполняется фоновое задание.
  3. Кодировка UCS-2 и формат PDU: Банковские уведомления на русском языке передаются в кодировке UCS-2 в виде шестнадцатеричных последовательностей (PDU-пакеты). Программисту 1С потребуется реализовать сложный алгоритм распаковки PDU-строк, декодирования заголовков и склейки составных сообщений (UDH), если текст превышает 70 символов.
  4. Зависания интерфейса: Обычные потребительские модемы при постоянном опросе через AT-команды могут периодически зависать, требовать перезагрузки по питанию или ожидать специфических служебных ответов от управляющего ПО. Если стабильность критична, для работы по AT-командам рекомендуется применять надежные промышленные GSM-терминалы.

Вариант 3. Использование промежуточного SMS-демона или аппаратного GSM-шлюза

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

  1. Системная служба (SMS-демон): На сервере разворачивается фоновый сервис операционной системы, который берет на себя всю низкоуровневую работу: поддержание COM-соединения, автоматический перезапуск порта при зависаниях, сборку длинных SMS и декодирование кириллицы из PDU в UTF-8. При получении SMS служба запускает вебхук и отправляет готовый JSON в HTTP-сервис 1С.
  2. Аппаратный VoIP/GSM-шлюз: Отдельное сетевое устройство со слотом для SIM-карты, подключенное по Ethernet. Большинство шлюзов умеют в штатном режиме пересылать входящие SMS методом HTTP POST/GET на заданный URL веб-сервиса 1С. Это избавляет сервер 1С от любых физических USB-подключений и проблем с драйверами.

Вариант 4. Прямой Webhook с мобильного устройства в HTTP-сервис 1С

Если в компании уже настроен смартфон на Android, отказ от почты можно выполнить без покупки модемов. Для этого в конфигурации 1С создается и публикуется объект HTTPСервис.

В мобильном приложении автоматизации (или специализированном SMS-клиенте на телефоне) настраивается триггер: при входящем сообщении от банка отправлять POST-запрос напрямую на опубликованный адрес базы 1С. Это гарантирует мгновенную передачу сообщения (в течение 1-2 секунд) без промежуточного почтового ящика.

Резюме: Если требуется прямое подключение USB-модема к сети предприятия, оптимальным выбором будет модем с веб-интерфейсом HiLink, опрашиваемый регламентным заданием 1С через HTTP-запросы. Для высоконагруженных и критически важных задач предпочтительнее использовать автономный GSM-шлюз или публикацию собственного HTTP-сервиса 1С для приема Webhooks.

← На главную