При разработке мобильных приложений на платформе 1С программисты часто сталкиваются с ситуацией, когда push-уведомления, отправленные непосредственно из сервера 1С, работают идеально, но уведомления из сторонних систем (например, бэкенд на PHP, Python или консоль Firebase) приходят на устройство, но никак не обрабатываются кодом самого приложения. В этой статье мы подробно разберем, почему так происходит, и как правильно сформировать структуру сообщения, чтобы мобильная платформа 1С «увидела» его и передала в соответствующий обработчик.
Разберем ситуацию: мобильное приложение 1С использует стандартный механизм ДоставляемыеУведомления.ПодключитьОбработчикУведомлений. Когда уведомление отправляется через объект ДоставляемоеУведомление из кода 1С на сервере, платформа автоматически упаковывает данные в формат, понятный мобильному клиенту. Если же мы используем прямой вызов GCM (Google Cloud Messaging) или FCM (Firebase Cloud Messaging) API, мы часто передаем стандартный JSON, который операционная система Android отображает в трее, но сама мобильная платформа 1С игнорирует, так как не находит в нем своих служебных меток.
Основной секрет того, как заставить мобильное приложение 1С реагировать на внешний push, заключается в использовании специального поля v8 внутри секции data JSON-запроса. Проанализируем структуру данных, которую ожидает мобильный клиент 1С. Все данные, предназначенные для обработки внутри приложения, должны быть упакованы в одну строку и переданы под ключом v8.
Важный нюанс: значение ключа v8 должно быть не JSON-объектом, а именно экранированной строкой (serialized JSON). Внутри этой строки платформа ищет следующие сокращенные ключи:
Данные объекта ДоставляемоеУведомление в 1С.Рассмотрим два способа отправки через FCM:
notification. В этом случае уведомление обрабатывается самой ОС Android. Если приложение активно, оно может его не заметить.data. Это предпочтительный вариант для 1С, так как такие сообщения передаются напрямую в приложение, что позволяет обработчику 1С сработать даже в активном режиме.Проанализируем пример правильного формирования JSON-тела для отправки через сторонний сервис (например, PHP):
{
"to": "TOKEN_RECEIVER",
"data": {
"v8": "{\"m\":\"Текст сообщения\",\"t\":\"Заголовок\",\"p\":\"Любые данные для кода 1С\"}"
},
"priority": "high"
}
Чтобы приложение могло принять и обработать этот пакет, в модуле управляемого приложения должен быть подключен обработчик. Рассмотрим пример кода на стороне 1С:
Процедура ПриНачалеРаботыСистемы()
ПодключитьОбработчикУведомлений();
КонецПроцедуры
Процедура ПодключитьОбработчикУведомлений()
ДоставляемыеУведомления.ПодключитьОбработчикУведомлений("ОбработкаУведомления");
КонецПроцедуры
Процедура ОбработкаУведомления(Уведомление, Локальное, Показано) Экспорт
// Здесь Уведомление.Данные будут содержать то, что мы передали в ключе "p"
Сообщить("Получено уведомление: " + Уведомление.Текст);
КонецПроцедуры
Выясним еще несколько причин, по которым уведомление может не доходить до обработчика:
1. Ограничение имени пакета (Package Name):
В запросе к API крайне желательно указывать параметр restricted_package_name. Платформа 1С фильтрует уведомления, и если идентификатор приложения (например, com.mycompany.myapp) не совпадает с тем, что указано в запросе, обработчик может не вызваться. Убедитесь, что вы используете правильное имя пакета, которое было задано в сборщике мобильных приложений.
2. Каналы уведомлений (Notification Channels):
В современных версиях Android (8.0+) уведомления требуют указания ID канала. Платформа 1С при установке обычно создает канал с идентификатором 1C_Notifications. Если вы отправляете уведомление через внешний API, попробуйте добавить в секцию android или data параметр android_channel_id со значением 1C_Notifications.
Многие сталкиваются с тем, что иконка в push-уведомлении от 1С отличается от иконки, отправленной через GCM API. Это происходит потому, что 1С ищет ресурсы внутри скомпилированного APK. Чтобы иконка отображалась корректно, при отправке через внешний сервис в ключе i (внутри строки v8) нужно указывать имя файла иконки без расширения, которое присутствует в ресурсах вашего собранного приложения (например, icon).
Рассмотрим пошаговый алгоритм действий для успешной интеграции:
data, а не notification."priority": "high" гарантирует доставку сообщения даже в режиме экономии энергии.Следуя этим правилам, вы обеспечите стабильную работу push-уведомлений, отправленных из любых внешних систем, и их корректную обработку в мобильном клиенте на платформе 1С.