При реализации механизма Push-уведомлений в мобильных приложениях на платформе 1С программисты часто сталкиваются с ошибкой «Несоответствие типов (параметр номер '1')» при вызове метода ОтправкаДоставляемыхУведомлений.Отправить. Эта проблема может быть вызвана как синтаксическими нюансами заполнения параметров, так и глобальными изменениями в сервисах доставки уведомлений от Google (переход с GCM на FCM). В этой статье мы подробно разберем, как правильно настроить отправку, какие требования предъявляются к платформе и как избежать типичных ошибок при работе с идентификаторами устройств.
Рассмотрим ситуацию: разработчик передает в метод Отправить объект уведомления, в котором заполнен список получателей. В коде это выглядит примерно так:
Уведомление = Новый ДоставляемоеУведомление;
// ... заполнение текста и заголовка ...
Пока Выборка.Следующий() Цикл
Уведомление.Получатели.Добавить(Выборка.Идентификатор);
КонецЦикла;
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, КлючДоступа);
Если система выдает ошибку в первом параметре, нам необходимо проанализировать состав объекта ДоставляемоеУведомление. Выясним основные причины:
Получатели должна содержать исключительно строки (идентификаторы подписчиков). Если в цикл попадает значение Неопределено или объект другого типа (например, сама ссылка на элемент справочника вместо строки-идентификатора), метод Отправить выдаст ошибку типа для всего объекта уведомления.ХранилищеЗначения. Проанализируем типичную ошибку: если вызвать Выборка.ИдентификаторPushУведомления без метода Получить(), вы передадите в массив объект хранилища, а не строку. Правильный код должен выглядеть так: Уведомление.Получатели.Добавить(Выборка.ИдентификаторPushУведомления.Получить()).Отправить должен выполняться на стороне сервера. Проверьте, что вызов происходит в серверном модуле или процедуре с директивой &НаСервере.Одной из самых частых причин неработоспособности Push-уведомлений является использование устаревшего сервиса Google Cloud Messaging (GCM). На текущий момент GCM полностью деактивирован. Ему на смену пришел Firebase Cloud Messaging (FCM).
Рассмотрим важные аспекты этого перехода:
Во-первых, для работы с FCM платформа 1С должна быть версии не ниже 8.3.13.1865. Если ваша конфигурация работает в режиме совместимости с более старыми версиями (например, 8.2), современные механизмы FCM могут не поддерживаться, что приведет к непредсказуемым ошибкам типов или сетевым отказам.
Во-вторых, изменился способ получения идентификатора на мобильном устройстве. Проанализируем метод ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(). Раньше в него передавались параметры, специфичные для Google (Sender ID). Теперь рекомендуется вызывать его без параметров — в этом случае мобильная платформа автоматически определит настройки и вернет актуальный токен FCM.
// На стороне мобильного приложения
Идентификатор = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений();
// Отправляем этот идентификатор на основной сервер 1С для сохранения
Посмотрим на пример кода, который учитывает проверку на заполненность идентификаторов и правильную инициализацию объекта уведомления. Выясним, как структурировать серверную процедуру:
Процедура ОтправитьPushУведомление(ТекстСообщения, МассивТокенов) Экспорт
// Инициализируем объект уведомления
Уведомление = Новый ДоставляемоеУведомление;
Уведомление.Текст = ТекстСообщения;
Уведомление.Звук = "default"; // Указываем стандартный звук
// Заполняем список получателей, проверяя типы данных
Для Каждого Токен Из МассивТокенов Цикл
Если ТипЗнч(Токен) = Тип("Строка") И НЕ ПустаяСтрока(Токен) Тогда
Уведомление.Получатели.Добавить(Токен);
КонецЕсли;
КонецЦикла;
// Проверяем наличие получателей перед отправкой
Если Уведомление.Получатели.Количество() > 0 Тогда
КлючСервера = Константы.КлючДоступаFCM.Получить(); // Ваш Server Key из консоли Firebase
Попытка
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, КлючСервера);
Исключение
ЗаписьЖурналаРегистрации("Push.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Иногда после успешной отправки (когда ошибка «Несоответствие типов» уже побеждена) пользователи жалуются, что уведомления приходят без звука или вибрации. Проанализируем ситуацию: начиная с Android 8.0, для управления звуками используются каналы уведомлений (Notification Channels).
Если в объекте ДоставляемоеУведомление не указано свойство ИмяКанала, система использует настройки по умолчанию, которые могут блокировать звук. Чтобы решить эту задачу, выполните следующие шаги:
Уведомление.ИмяКанала = "OrdersChannel";.Если настройка прямого взаимодействия с Firebase кажется слишком сложной или платформа не позволяет использовать современные методы, рассмотрим альтернативу — использование облачного сервиса 1C:Notifications. Это посредник от фирмы «1С», который берет на себя сложности взаимодействия с Google и Apple.
В этом случае вместо Server Key от Google вы будете использовать API-ключ, полученный на портале 1С:ИТС. Это значительно упрощает код и делает его более универсальным, так как платформа сама подстраивается под актуальные требования внешних API.
Подведем итог: для успешной отправки Push-уведомлений без ошибок типов необходимо убедиться в чистоте массива получателей (только строки), использовать актуальную версию платформы (не ниже 8.3.13) и перенастроить проект на использование протокола FCM вместо устаревшего GCM.