Как исправить ошибку «Несоответствие типов» при отправке Push-уведомлений в 1С

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

При реализации механизма Push-уведомлений в мобильных приложениях на платформе 1С программисты часто сталкиваются с ошибкой «Несоответствие типов (параметр номер '1')» при вызове метода ОтправкаДоставляемыхУведомлений.Отправить. Эта проблема может быть вызвана как синтаксическими нюансами заполнения параметров, так и глобальными изменениями в сервисах доставки уведомлений от Google (переход с GCM на FCM). В этой статье мы подробно разберем, как правильно настроить отправку, какие требования предъявляются к платформе и как избежать типичных ошибок при работе с идентификаторами устройств.

Анализ причины ошибки «Несоответствие типов»

Рассмотрим ситуацию: разработчик передает в метод Отправить объект уведомления, в котором заполнен список получателей. В коде это выглядит примерно так:


Уведомление = Новый ДоставляемоеУведомление;
// ... заполнение текста и заголовка ...
Пока Выборка.Следующий() Цикл
    Уведомление.Получатели.Добавить(Выборка.Идентификатор);
КонецЦикла;
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, КлючДоступа);

Если система выдает ошибку в первом параметре, нам необходимо проанализировать состав объекта ДоставляемоеУведомление. Выясним основные причины:

  1. Неверный тип элементов в массиве получателей: Коллекция Получатели должна содержать исключительно строки (идентификаторы подписчиков). Если в цикл попадает значение Неопределено или объект другого типа (например, сама ссылка на элемент справочника вместо строки-идентификатора), метод Отправить выдаст ошибку типа для всего объекта уведомления.
  2. Работа с Хранилищем Значений: Часто идентификаторы Push-уведомлений хранятся в реквизитах с типом ХранилищеЗначения. Проанализируем типичную ошибку: если вызвать Выборка.ИдентификаторPushУведомления без метода Получить(), вы передадите в массив объект хранилища, а не строку. Правильный код должен выглядеть так: Уведомление.Получатели.Добавить(Выборка.ИдентификаторPushУведомления.Получить()).
  3. Контекст исполнения: Метод Отправить должен выполняться на стороне сервера. Проверьте, что вызов происходит в серверном модуле или процедуре с директивой &НаСервере.

Переход с GCM на FCM: глобальные изменения

Одной из самых частых причин неработоспособности 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).

Если в объекте ДоставляемоеУведомление не указано свойство ИмяКанала, система использует настройки по умолчанию, которые могут блокировать звук. Чтобы решить эту задачу, выполните следующие шаги:

  1. В коде мобильного приложения при инициализации создайте канал с определенным ID и настройками звука.
  2. В серверном коде при формировании уведомления укажите это же имя: Уведомление.ИмяКанала = "OrdersChannel";.

Рекомендации по использованию сервиса 1C:Notifications

Если настройка прямого взаимодействия с Firebase кажется слишком сложной или платформа не позволяет использовать современные методы, рассмотрим альтернативу — использование облачного сервиса 1C:Notifications. Это посредник от фирмы «1С», который берет на себя сложности взаимодействия с Google и Apple.

В этом случае вместо Server Key от Google вы будете использовать API-ключ, полученный на портале 1С:ИТС. Это значительно упрощает код и делает его более универсальным, так как платформа сама подстраивается под актуальные требования внешних API.

Подведем итог: для успешной отправки Push-уведомлений без ошибок типов необходимо убедиться в чистоте массива получателей (только строки), использовать актуальную версию платформы (не ниже 8.3.13) и перенастроить проект на использование протокола FCM вместо устаревшего GCM.

← На главную