Рассылка СМС-уведомлений напрямую из учетной системы 1С — это отличный способ информировать клиентов или мониторить состояние базы данных без привлечения дорогостоящих сторонних СМС-шлюзов. Для небольших объемов отправки (в пределах 50–100 сообщений в день) идеально подходит обычный USB 3G/4G-модем с SIM-картой. Однако при программной реализации этой задачи разработчики часто сталкиваются с аппаратными тонкостями, особенностями синтаксиса AT-команд и блокировками со стороны оборудования.
В этой статье мы подробно разберем, как правильно настроить подключение к модему, найдем рабочий COM-порт, составим корректную последовательность AT-команд и напишем готовый рабочий код на языке 1С.
Прежде чем приступать к написанию кода в 1С, необходимо правильно настроить и подготовить аппаратную часть. Подключим USB-модем к компьютеру или серверу и выполним следующие действия:
Mobile Connect - Application Interface и Mobile Connect - PC UI Interface). Вопреки многим стандартным инструкциям, порт интерфейса управления (PC UI) далеко не всегда подходит для непосредственной отправки СМС.Проанализируем ситуацию: для точного определения рабочего порта рекомендуется использовать сторонние терминальные программы, например, PuTTY или HyperTerminal. Подключаясь поочередно к доступным портам на стандартной скорости (обычно 9600 или 115200), введите команду AT. Тот порт, который вернет в ответ заветное OK, и является нашим рабочим каналом связи.
Общение с модемом через COM-порт происходит посредством текстовых AT-команд. Давайте пошагово разберем классический сценарий отправки СМС в текстовом режиме:
ATZ — команда инициализации (мягкого сброса) модема. Она переводит устройство в исходное стабильное состояние.AT+CMGF=1 — переключение модема в текстовый режим работы (Text Mode). По умолчанию многие модемы работают в сложном двоичном режиме PDU, но для простых задач латиницы текстовый режим гораздо удобнее.AT+CMGS="+79261234567" — команда инициации отправки СМС. Обратите внимание: номер телефона получателя обязательно должен быть заключен в двойные кавычки и указан в международном формате. Отсутствие кавычек — это самая частая ошибка, из-за которой модем возвращает ошибку выполнения.>).Рассмотрим пример готового программного кода в 1С. Для записи данных в COM-порт мы будем использовать встроенный объект платформы ЗаписьТекста, открывая физический адрес порта в режиме монопольного доступа.
Ниже представлен рабочий шаблон процедуры отправки сообщения (поддерживает латиницу):
Процедура ОтправитьСМСЧерезМодем(ПортНомер, ТелефонПолучателя, ТекстСообщения) Экспорт
// Формируем системный путь к COM-порту
ПутьКПорту = "\\.\COM" + СокрЛП(ПортНомер);
Попытка
// Открываем порт в кодировке ANSI
ЗаписьВПорт = Новый ЗаписьТекста(ПутьКПорту, КодировкаТекста.ANSI);
// 1. Инициализируем модем
ЗаписьВПорт.ЗаписатьСтроку("ATZ");
// 2. Устанавливаем текстовый режим работы
ЗаписьВПорт.ЗаписатьСтроку("AT+CMGF=1");
// 3. Передаем команду отправки с номером получателя в двойных кавычках
// Используем экранирование кавычек в строке 1С
ЗаписьВПорт.ЗаписатьСтроку("AT+CMGS=""" + СокрЛП(ТелефонПолучателя) + """");
// 4. Записываем текст сообщения и обязательно завершаем его спецсимволом Ctrl+Z (ASCII 26)
ЗаписьВПорт.ЗаписатьСтроку(ТекстСообщения + Символ(26));
// Закрываем порт для освобождения ресурса операционной системой
ЗаписьВПорт.Закрыть();
Сообщить("Команды успешно отправлены в порт " + ПутьКПорту);
Исключение
ВызватьИсключение "Не удалось получить доступ к COM-порту " + ПутьКПорту + ". Описание ошибки: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Разберем важные особенности работы с COM-портом через объект ЗаписьТекста:
ЗаписьТекста работает только на "отдачу". Платформа 1С успешно завершит выполнение процедуры, если порт был физически открыт, однако вы не узнаете, доставил ли модем СМС-сообщение получателю или вернул ошибку выполнения (например, из-за отсутствия средств на балансе). Для получения полноценного ответа от модема требуется использовать специализированные внешние компоненты (например, ActiveX-объект MSComm) или осуществлять чтение из порта.КодировкаТекста.ANSI надежно работает только с латинскими символами. При попытке отправить русский текст адресат получит нечитаемые символы. Для отправки кириллицы требуется перевести модем в кодировку UCS2 с помощью инициализирующей команды AT+CSCS="UCS2", настроить параметры отображения AT+CSMP=17,167,0,8 и программно преобразовать текст сообщения в шестнадцатеричный HEX-формат в кодировке UCS2.