Как настроить отправку push-уведомлений из 1С на Android через FCM и исправить ошибку DeprecatedEndpoint

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

Разберем ситуацию, которая стала массовой для разработчиков мобильных приложений на платформе 1С: внезапное прекращение доставки push-уведомлений. Основная причина — отключение компанией Google старого протокола GCM (Google Cloud Messaging) и принудительный переход на FCM (Firebase Cloud Messaging). При использовании старых методов в 1С программисты получают ошибку DeprecatedEndpoint. Проанализируем, как перенастроить систему, чтобы уведомления снова начали приходить пользователям, и выясним, какие нюансы есть у современных версий мобильной платформы.

Причина возникновения ошибки DeprecatedEndpoint

Эта ошибка означает, что точка доступа (URL-адрес), к которой обращается 1С для отправки сообщения, больше не поддерживается серверами Google. Раньше 1С по умолчанию использовала шлюзы GCM. Теперь же необходимо явно указать использование FCM. Рассмотрим два основных способа решения проблемы: через стандартные объекты 1С и через прямой HTTP-запрос к API Firebase.

Способ 1. Настройка штатных средств 1С (объект ОтправкаДоставляемыхУведомлений)

Многие разработчики совершают ошибку, продолжая передавать "Номер проекта" при получении идентификатора устройства. Выясним, почему этого делать не стоит. Если в методе получения идентификатора указан номер проекта, система считает, что вы работаете через старый протокол GCM.

Шаг 1. Получение идентификатора в мобильном приложении

Проанализируем код в мобильной конфигурации. Чтобы получить токен типа FCM, необходимо вызвать метод без параметров:


// В мобильном приложении
ИдентификаторПодписчика = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений();
ID_ДляСервера = ИдентификаторПодписчика.ИдентификаторУстройства;

Важно: если вы передадите в скобках НомерПроекта, вы получите идентификатор типа GCM, который на новых серверах Google работать не будет. После получения ID_ДляСервера его необходимо передать в основную базу (через HTTP-сервис или обмен данными) и сохранить в привязке к пользователю.

Шаг 2. Отправка уведомления из основной базы

В коде серверной базы при заполнении данных авторизации нужно использовать соответствие с ключом ТипПодписчикаДоставляемыхУведомлений.FCM:


Уведомление = Новый ДоставляемоеУведомление;
Уведомление.Текст = "Текст сообщения";
Уведомление.Заголовок = "Заголовок";
Уведомление.Получатели.Добавить(СохраненныйIDУстройства);

ДанныеАвторизации = Новый Соответствие;
// Используем FCM вместо GCM
ДанныеАвторизации.Вставить(ТипПодписчикаДоставляемыхУведомлений.FCM, "ВАШ_КЛЮЧ_СЕРВЕРА_ИЗ_FIREBASE");

ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, ДанныеАвторизации);

Способ 2. Использование прямого HTTP-запроса к API Firebase

Этот метод считается более гибким и надежным, если штатные средства 1С по какой-то причине не отрабатывают (например, на старых релизах платформы). Рассмотрим, как реализовать отправку через JSON-запрос.

Подготовка данных

Нам потребуется КлючСервера (Server Key), который находится в консоли Firebase (Project Settings -> Cloud Messaging). Обратите внимание, что Google постепенно переходит на FCM HTTP v1, где используется авторизация через токен доступа, но Legacy API (использование ключа сервера) пока часто встречается в решениях.

Пример формирования запроса:


Процедура ОтправитьПушЧерезHTTP(ТокенУстройства, Заголовок, Текст, IDБазы)
    
    КлючСервера = "AAAABBBCCCDDD..."; // Ваш ключ из консоли Firebase
    АдресСервера = "fcm.googleapis.com";
    Ресурс = "/fcm/send";
    
    ssl = Новый ЗащищенноеСоединениеOpenSSL;
    Соединение = Новый HTTPСоединение(АдресСервера, , , , , , ssl);
    
    // Формируем структуру сообщения
    // Параметр 'base' критически важен для мобильной платформы 1С!
    ДанныеСообщения = Новый Структура;
    ДанныеСообщения.Вставить("title", Заголовок);
    ДанныеСообщения.Вставить("text", Текст);
    ДанныеСообщения.Вставить("body", Текст);
    ДанныеСообщения.Вставить("base", IDБазы);
    ДанныеСообщения.Вставить("sound", "default");
    
    ПараметрыЗапроса = Новый Структура;
    ПараметрыЗапроса.Вставить("to", ТокенУстройства);
    ПараметрыЗапроса.Вставить("data", ДанныеСообщения);
    
    // Сериализация в JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
    СтрокаТелоЗапроса = ЗаписьJSON.Закрыть();
    
    Запрос = Новый HTTPЗапрос(Ресурс);
    Запрос.Заголовки.Вставить("Content-Type", "application/json");
    Запрос.Заголовки.Вставить("Authorization", "key=" + КлючСервера);
    Запрос.УстановитьТелоИзСтроки(СтрокаТелоЗапроса, КодировкаТекста.UTF8);
    
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    
    Если Ответ.КодСостояния <> 200 Тогда
        ЗаписьЖурналаРегистрации("Push.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , Ответ.ПолучитьТелоКакСтроку());
    КонецЕсли;
    
КонецПроцедуры

Разберем важные параметры структуры сообщения

Проанализируем состав полей в JSON, так как от них зависит, "проснется" ли мобильное приложение и как оно обработает входящий пакет.

Проблемы с обработчиком уведомлений на новых платформах (8.3.25 и выше)

Многие пользователи замечают, что push приходит в системную шторку, но при нажатии на него процедура ОбработкаУведомлений не вызывается. Рассмотрим причины этой ситуации:

  1. Разрешения Android: Начиная с Android 13, приложение обязано явно запросить разрешение на показ уведомлений. Убедитесь, что при первом запуске пользователь нажал "Разрешить".
  2. Состояние приложения: Если приложение полностью выгружено из памяти (убито системой), платформа 1С не всегда может корректно инициализировать контекст для обработки данных уведомления. В этом случае срабатывает стандартное открытие базы.
  3. Использование API v1: С июня 2024 года Google окончательно отключает Legacy API. Если вы создаете новый проект в Firebase, вам придется реализовать авторизацию через OAuth 2.0. Для этого потребуется файл JSON с закрытым ключом сервисного аккаунта, а вместо статичного ключа сервера нужно будет генерировать временный access_token.

Рекомендации по стабильной работе

Проанализируем дополнительные шаги, которые помогут избежать потерь сообщений:

Во-первых, проверьте размер сообщения. Суммарный объем data не должен превышать 4 Кб (в некоторых старых реализациях 1С — 2 Кб). Если вам нужно передать много данных, отправляйте в push только короткий сигнал (флаг), по которому мобильное приложение само инициирует HTTP-запрос к серверу для получения полной информации.

Во-вторых, используйте Центр уведомлений 1С. Это облачный сервис от фирмы 1С, который выступает посредником между вашей базой и Google/Apple. Это упрощает настройку, так как 1С сама следит за изменениями в API гигантов, а вам остается только зарегистрировать приложение в сборщике и отправлять пуши через стандартные методы платформы.

Таким образом, для исправления ошибки DeprecatedEndpoint нам необходимо обновить логику получения токена на мобильном устройстве (убрать номер проекта), переключить тип авторизации на FCM в серверном коде или перейти на прямые HTTP-запросы к Firebase с обязательным указанием технического параметра base.

← На главную