Push сообщения с использованием Firebase cloud message
Разработка - Мобильная разработка
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Всех приветствую.
Сегодня расскажу о том, как можно быстро и легко отправить произвольное push сообщение с сервера на мобильное устройство на базе Android (на iOS нет возможности попробовать, на Windows Phone этот метод работать не будет, по крайней мере пока).
Чтобы пример был осмысленным, внесем немного ясности. Допустим есть некая конфигурация, которая крутится на неком ПК - назовем это Сервер. Есть необходимость в том, чтобы при наступлении какого-либо события на Сервере была инициирована, например, синхронизация с одним или несколькими телефоном/ТСД (далее просто мобильное устройство или МУ). На самом деле можно придумать любой другой пример, но суть в том, что инициатива какого-либо действия будет именно со стороны Сервера а не МУ. Сигналом к действию для МУ и будет выступать push сообщение.
Вот такая вот небольшая задача, которую надо решить.
Нам потребуется:
- Платформа 8.3.6 и выше
- Мобильная платформа 8.3.6 и выше
- Аккаунт Google
- Около 20 мин свободного времени )
О том, как развернуть мобильную платформу для разработчика на своем устройстве писать не буду, информации много (я лично слушал бесплатный курс многоуважаемого DitriX).
Ну, приступим. Откроем конфигурацию Сервера и создадим в ней общую форму, из которой будем отправлять пуши клиенту. На форме создадим одну команду, которая и будет отправлять сообщение. Теперь разберемся, каким объектом на уровне платформы представлено push сообщение. СП подскажет нам, что это ДоставляемоеУведомление. Его инициализация довольно простая, объект доступен везде, кроме Вэб-клиента, что нас вполне устраивает. Поместим следующий код в обработчик нажатия команды общей формы. Контекст выполнения в данном случае не важен. Сразу оговорюсь, что дальше по тексту не будет каких либо проверок на корректность данных, это и так все понятно.
Уведомление = Новый ДоставляемоеУведомление;
Уведомление.Заголовок = "Необходимо выполнить синхронизацию";
Уведомление.Текст = "Новые задания ожидают загрузки на устройство.";
Уведомление.Данные = "ВыполнитьСинхронизацию";
Уведомление.ЗвуковоеОповещение = ЗвуковоеОповещение.ПоУмолчанию;
Если бы мы хотели использовать локальные уведомления мобильной платформы на самом МУ, то такой инициализации было бы вполне достаточно, но у нас задача прислать пуш от сервера. Поэтому придется разобраться с еще одним свойством объекта ДоставляемоеУведомление, а именно Получатели. Это массив, то есть при желании можно отправить сообщение сразу нескольким МУ (например, если документ уже был выгружен на МУ1, а затем менеджер решил, что документ должен быть на МУ2). Тип данных элементов этого массива ИдентификаторПодписчикаДоставляемыхУведомлений, и опять же смотрим СП и видим, что о нас позаботились разработчики 1С и придумали замечатльный метод ПолучитьИдентификаторПодписчикаУведомлений, который возвращает как раз то, что нам нужно. Казалось бы практически все готово, но тут начинается самое интересное. Смотрим, что данный метод доступен только на мобильном клиенте, и вдобавок в качестве параметра необходимо указывать какой-то НомерПриложенияGoogleCloud. Получить его довольно просто. Для этого идем в Консоль разработчика Google, авторизуемся и попадаем на стартовую страницу. Тут необходимо создать новый проект.

Мастер создания проектов попросить придумать проекту какое-либо имя (оно будет нужно только для того, чтобы отличать проекты в самой консоли) и согласиться с условиями гугла. После создания проекта уже можно посмотреть необходимый нам НомерПриложенияGoogleCloud. Для этого перейдем в панель администрирования проекта, а затем в настройки.

Попробуем теперь получить ИдентификаторПодписчикаДоставляемыхУведомлений, который доступен через менеджера доставляемых уведомлений, но вспомним, что это все доступно только на мобильном клиенте. Поэтому надо решить, как мы будем передавать полученный ИдентификаторПодписчикаДоставляемыхУведомлений на Сервер. Способов на самом деле достаточно, но я предлагаю использовать http-сервис. Естественно он должен быть создан на Сервере. Итак, создадим http-сервис, с корневым URL testpush и одним методом типа GET, в модуль которого поместим следующий код
ПараметрыЗапроса = Запрос.ПараметрыЗапроса;
Если ПараметрыЗапроса.Количество() <> 1 Тогда
Ответ = Новый HTTPСервисОтвет(400);
Ответ.Заголовки.Вставить("Content-Type","text/text; charset=UTF-8");
Ответ.УстановитьТелоИзСтроки("Неверное количество параметров.");
Возврат Ответ;
КонецЕсли;
IDПодписчика = ПараметрыЗапроса.Получить("reginfo");
Константы.IDПодписчика.Установить(Новый ХранилищеЗначения(IDПодписчика, Новый СжатиеДанных(9)));
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type","text/text; charset=UTF-8");
Ответ.УстановитьТелоИзСтроки("Все прошло успешно.");
Возврат Ответ;
Что здесь происходит? Так как мы планируем, что этот сервис будет вызываться с МУ, то ожидаем от МУ 1 параметр reginfo (можно его сделать обязательными, или вообще использовать POST и передавать все в теле, но сейчас не про это) - это сериализованный объект ИдентификаторПодписчикаДоставляемыхУведомлений. Поместим все это в Хранилище значения и запишем в константу, предварительно создав ее. Теперь наконец-то на сервере у нас будет нужный нам параметр для отправки, но пока у нас до сих пор нечего отправлять, да и неоткуда. Займемся этим вопросом и начнем делать конфигурацию для МУ. Так как объект ИдентификаторПодписчикаДоставляемыхУведомлений имеет переменчивую природу и реккомендуется его переодически обновлять то поступим следующим образом. В модуле управляемого приложения поместим следующий код (конфигурация для МУ)
Процедура ПриНачалеРаботыСистемы()
ОбновитьIDПодписчика();
ПодключитьОбработчикОжидания("Подключаемый_ОбновитьIDПодписчика", 7200);
КонецПроцедуры
Процедура Подключаемый_ОбновитьIDПодписчика() Экспорт
ОбновитьIDПодписчика();
КонецПроцедуры
Процедура ОбновитьIDПодписчика()
#Если МобильноеПриложениеКлиент Тогда
НомерПроекта = ОбщийМодульВызовСервера.ПолучитьНомерПроекта();
Если ПустаяСтрока(НомерПроекта) Тогда
Возврат
КонецЕсли;
Попытка
IDПодписчика = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(НомерПроекта);
Исключение
Возврат
КонецПопытки;
ПараметрыЗапроса = Новый Структура("АдресСервера, ИмяБазы, IDПодписчика");
// указываем IP Сервера, он может быть как локальный, так и нет
ПараметрыЗапроса.АдресСервера = "192.168.0.11";
// имя базы, под которым она была опубликована на вэб сервере
// о том, как выполнить публикацию информации в Интернете информации предостаточно
ПараметрыЗапроса.ИмяБазы = "base";
ПараметрыЗапроса.IDПодписчика = IDПодписчика;
ОбщийМодульВызовСервера.ОтправитьIDНаСервер(ПараметрыЗапроса);
#КонецЕсли
КонецПроцедуры
Для того, чтобы IDПодписчика всегда был актуальным на Сервере, подключим обработчик ожидания, который будет получать "свежий" ИдентификаторПодписчикаДоставляемыхУведомлений и отправлять его на Сервер, кроме того получение и отправку будем вызывать при самом старте системы. Все эти операции можно выполнять в фоне, чтобы это было незаметно для пользователя. Важным моментом является то, что при вызове метода ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений будет происходить обращение к серверам Google, поэтому на МУ должен быть доступен Интернет. Стоит заметить, что у меня не вышло получить таким образом IDПодписчика на вирутальном устройстве, все вываливалось в ошибку неправильного параметра НомерПроекта (может это как-то связано с ограничением бесплатного функционала Genymotion), но на реальном устройстве все прекрасно отрабатывает. В общих модулях поместим следующий код.
ОМ Вызов сервера
Функция ПолучитьНомерПроекта() Экспорт
Возврат Константы.НомерПроекта.Получить();
КонецФункции // ПолучитьНомерПроекта()
Процедура ОтправитьIDНаСервер(ПараметрыЗапроса) Экспорт
ОбщийМодульСервер.ОтправитьIDНаСервер(ПараметрыЗапроса);
КонецПроцедуры
ОМ Сервер
Процедура ОтправитьIDНаСервер(ПараметрыЗапроса) Экспорт
ПараметрыЗадания = Новый Массив();
ПараметрыЗадания.Добавить(ПараметрыЗапроса);
ФоновыеЗадания.Выполнить("ОбщийМодульСервер.ОтправитьIDНаСерверВФоне", ПараметрыЗадания, , "ОтправкаIDПодписчика");
КонецПроцедуры
Процедура ОтправитьIDНаСерверВФоне(ПараметрыЗапроса) Экспорт
Попытка
Соединение = Новый HTTPСоединение(ПараметрыЗапроса.АдресСервера);
// первым параметров HTTPЗапрос является адрес ресурса
// в данном случае сначала идет имя серверной базы, под которым она опубликована на вэб-сервере
// т.к. мы использовали http-сервис, то после имени идет служебный параметр hs
// при создании http-сервиса мы указывали коревой URL - testpush
// т.к. в сервисе 1 нас всего один метод, и он имеет тип GET, то через знак ? укажем имя параметра reginfo
// и далее сериализованный IDПодписчика
// если все ок, то в браузере можно набрать полученный URL и на нашем Сервере все отработает как нужно
Запрос = Новый HTTPЗапрос(ПараметрыЗапроса.ИмяБазы + "/hs/testpush?reginfo="+Сериализовать(ПараметрыЗапроса.IDПодписчика));
Запрос.Заголовки.Вставить("Content-Type","text/xml; charset=UTF-8");
Соединение.ВызватьHTTPМетод("GET", Запрос);
Исключение
КонецПопытки;
КонецПроцедуры
Функция Сериализовать(Данные)
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(Данные);
ЗаписьXML = Новый ЗаписьXML;
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
ЗаписьXML.УстановитьСтроку(ПараметрыЗаписиXML);
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
Возврат ЗаписьXML.Закрыть();
КонецФункции // Сериализовать()
Теперь у нас все готово чтобы на Сервере наконец-то оказался ИдентификаторПодписчикаДоставляемыхУведомлений, запускаем мобильное приложение, указываем наш номер проекта, перезапускаем приложение и вуаля, на Сервере константа IDПодписчика теперь хранит что-то типа
<DeliverableNotificationSubscriberID xmlns="http://v8.1c.ru/8.3/data/ext" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<subscriberType>GCM</subscriberType>
<deviceID>APA91bHaICui92Jdsbv9vrBQsmebjhXvEhUgswKRkCoFwFVHcrCR6RlRH0OqTYRNWUUoM19nv_emkL-OuLfuAwVZfz8u07SDLTwffphWJ71yzTn3YRAKL6M</deviceID>
<applicationID>com.e1c.mobile</applicationID>
<databaseID>7e874fd6-e97e-6c1f-ac33-683d141e189d</databaseID>
</DeliverableNotificationSubscriberID>
Сервер уже знает практически все, чтобы отправить пуш, поэтому вернемся к нему. В общей форме добавим следующий код
Уведомление.Получатели.Добавить(Десериализовать(Константы.IDПодписчика.Получить().Получить()));
Получаем из константы хранилище значения, а из него уже нашу сериализованную строку и десериализуем ее.
Функция Десериализовать(Данные, ТипПреобразования = Неопределено)
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(Данные);
ПрочитанныеДанные = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, ТипПреобразования);
ЧтениеXML.Закрыть();
Возврат ПрочитанныеДанные;
КонецФункции // Десериализовать()
Теперь у нас есть готовое к отправке пуш сообщение. Для отправки необходимо использовать метод глобального контекста ОтправкаДоставляемыхУведомлений.Отправить. В качестве первого параметра необходимо передать сформированный объект ДоставляемоеУведомление, а вот вторым параметром идет строка с ключом авторизации для подключения к службе доставки "Google Cloud Messaging" (из СП). Стоит заметить, что Google Cloud Messaging уже не получится использовать, т.к. гугл использует более новую технологию Firebase Cloud Messaging или просто FCM. Таким образом нам нужно получить этот заветный ключ авторизации у гугла. Для этого вернемся в консоль разработчика Google и перейдем по ссылке.

Перед нами откроется страница Firebase Cloud Messaging, там много чего интересно, но нам надо перейти в консоль.

Добавим новый проект, указав имя, которое мы указывали при создании проекта в консоли разработичка гугл. После ввода первых символов мастер создания предложить выбрать этот проект. Соглашаемся, также выбираем страну и нажимаем Добавить FireBase. Псоле этого возвращаемся в консоль разработчика гугл (теперь панель управления консоли примет иной вид нежели ранее) и идем в раздел Учетные данные. Тут нас будет интересовать ключи API, а именно ключ сервера.

Копируем его, ведь именно он нам и нужен для отправки пуша, то есть это и есть ключ авторизации для подключения к службе доставки. Возвращаемся в конфигуратор Сервера и немного добавим кода в общей форме. В итоге код отправки push сообщения будет выглядеть следующим образом
Уведомление = Новый ДоставляемоеУведомление;
Уведомление.Заголовок = Заголовок;
Уведомление.Текст = ТекстСообщения;
Уведомление.Данные = Данные;
Уведомление.ЗвуковоеОповещение = ЗвуковоеОповещение.ПоУмолчанию;
Уведомление.Получатели.Добавить(Десериализовать(ПолучитьIDПодписчика()));
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, КлючСервера);
Где Заголовок, ТекстСообщения, Данные, КлючСервера - это реквизиты формы, а функция ПолучитьIDПодписчика возвращает значение одноименной константы.
Настало время первого теста. Запускаем приложение на МУ, блокируем экран или сворачиваем приложение, открываем в режиме Предприятие конфигурацию Сервер и жмем Отправить.

Ура, МУ прожужжал/пропищал или что-то в этом роде, в общем, все получилось, сообщение доставлено.

Остался еще один небольшой нюанс. Пока толку от такого сообщения немного, приложение ничего не делает при получении пуша. Исправим этот момент. В конфигурации МУ, в модуле управляемого приложения в событие ПриСтартеСистемы добавим следующий код
#Если МобильноеПриложениеКлиент Тогда
ДоставляемыеУведомления.ПодключитьОбработчикУведомлений("Подключаемый_ОбработкаУведомления");
#КонецЕсли
Процедура Подключаемый_ОбработкаУведомления
Процедура Подключаемый_ОбработкаУведомления(Уведомление, Локальное, Показано) Экспорт
// просто сообщим тест пуша
Сообщить(Уведомление.Текст);
КонецПроцедуры
Теперь после отправки сообщения с сервера можно выполнить любые действия на клиенте. В данном случае мы просто покажем текст сообщения.

Вместо заключения
Firebase это не только отправка push сообщений, но как мимнимум позволяет работать с рекламой в мобильных приложениях (с этим пока не разбирался), и, наверно еще много чего интересного, так что есть чем заниматься, господа!
p.s. в архиве 2 конфигурации - Сервер и Клиент, код которых на 90% изложен в этой публикации.
Вступайте в нашу телеграмм-группу Инфостарт
См. также
Мобильная разработка Сканер штрих-кода Терминал сбора данных 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)
Сбор заказов, инвентаризация, проверка ценников, просмотр полной информации об остатках и ценах со смартфона Онлайн - все это содержит в себе решение 1С "Штрихкод-информер" (штрих-код чекер). Отправка данных со смартфона выполняется либо напрямую в открытую форму документа, отсканировав QR-код, либо в общую корзину учетной системы, не подходя к компьютеру. Кассир или оператор сможет просмотреть список присланных данных и загрузить в любую форму, поддерживающую работу с ТСД. Для работы с мобильным приложением требуется опубликовать HTTP-сервис из поставляемого расширения.
3050 руб.
03.12.2018 72927 250 108
Сканер штрих-кода Терминал сбора данных Мобильная разработка Монитор заказов Оптовая торговля Розничная торговля Ценообразование, анализ цен Разработчик Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)
Простой мобильный ТСД (терминал сбора данных) сканер для 1С для смартфонов на iOS и Android, не требующий сложных настроек и установки дополнительных программ. Обмен между Вашей 1С и мобильным приложением осуществляется через облачный сервис и расширение конфигурации. Работает с конфигурациями УТ 11, ERP, КА2, Розница 2, Розница 3, УНФ 1.6, УНФ 3.0. Полнофункциональный демо-доступ для своей конфигурации можно запросить в настройках мобильного приложения - все необходимое придет на почту автоматически. Решение предназначено для считывания штрихкодов, а не для их создания и печати.
3050 руб.
22.04.2019 124923 739 207
Сканер штрих-кода Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Терминал сбора данных Мобильная разработка Разработчик Пользователь 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Управленческий учет Платные (руб)
Android смартфон как беспроводной сканер штрих-кодов, QR-кодов (2D), терминал сбора данных (ТСД), подписка на штрих-код Комбайн
2196 руб.
18.01.2017 152662 235 237
Мобильная разработка Бесплатно (free)
Android-клиент: конструктор и выполнение запросов 1С по HTTP к опубликованной базе. Часть экосистемы КонфигРедактор.
06.10.2026 1897 54 aleksandrboldyusov 0
Мобильная разработка Разработчик 1С 8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)
Эта подключаемая обработка для любой конфигурации 1С, позволяет отправить любой объект (и рекуррентно связанные с ним объекты) на устройства c NodaLogic, где они будут полнофункциональны и доступны офлайн, по ним можно вести переписку как со стороны чата в NodaLogic, так и со стороны 1С, заполнять данные и загрузить в 1С по мере надобности. Т.е. обработка содержит генератор UI/UX интерфейса NodaLogic и создает объекты для обмена. При этом не надо ни разбираться в NodaLogic вообще, ни иметь базу/сервер/решение на стороне NL – только учетка и мобильное устройство, а со стороны 1С достаточно галочками отметить, какие поля должны быть на формах. Все данные хранятся в ХранилищеОбщихНастроек, поэтому никакого расширения не нужно, сервера со стороны 1С для связи с устройствами тоже не нужно. Тестировалось на 1С:Предприятие 8.3 (8.3.27.1326), 1С:Комплексная автоматизация 2 (2.4.8.63)
1 стартмани
12.05.2026 1559 6 informa1555 1
Мобильная разработка Разработчик Бесплатно (free)
Мне нужен был высокопроизводительный язык для фронт-сайда, я его сделал, а потом подумал, а что, если сделать 1С-синтаксис? Вот что из этого вышло. Продолжение статьи https://infostart.ru/1c/articles/2614496/
12.03.2026 2843 informa1555 11
Мобильная разработка Разработчик 1С 8.3 1С:Комплексная автоматизация 2.х 1С:КА Управленческий учет Абонемент ($m)
В этой статье простейший документ - ориентированный пример складского учета на клиент-серверной платформе NodaLogic с автономными мобильными рабочими местами. Это чисто скелетный пример как можно вынести часть учета во внешний контур. И расширение - модуль связи с 1С. Тестировалось на платформе 1С:Предприятие 8.3 (8.3.27.1326), 1С:Комплексная автоматизация 2 (2.4.8.63).
1 стартмани
13.02.2026 4135 informa1555 5
WEB-интеграция Мобильная разработка Разработчик 1С:Предприятие 8 1С:Библиотека стандартных подсистем Россия Бесплатно (free)
Бесплатное приложение для интеграции веб-клиента 1С с Android-устройством. Просто установите, укажите веб-адрес вашей базы 1С - и пользуйтесь привычным интерфейсом с расширенным доступом к функциям устройства: лазерный и имидж-сканер ТСД, сканер штрихкода камерой, GPS, Bluetooth, фотокамера, NFC и многое другое.
05.08.2025 4693 221 OneScan 25
Еще можно напрямую через http-запрос отправить через любой сторонний сервис, но опять же не сервера 1С. Или быть может речь про локальные уведомления самой мобильной платформы?
Да, это промежуточный сервис, который обращается к нативным сервисам платформ.
Просто его настройка и использование намного проще, чем рассказано у вас в статье. Вот и интересуюсь, стоит ли оно того?
Еще вопрос, пробовал ли оправлять пуш из консоли firebase?
И еще вопрос, пуш успешно получен когда мобильное приложение собрано сборщиком и установлен на девайс или установленным мибильным приложением в "режиме разработки"?
В консоли firebase не разбирался, пока не было времени и необходимости.
Пуш будет получен и если приложение собрано в apk и если опубликовано на вэб-сервере, т.е. в "режиме разработки" (в статье именно 2 вариант)
Если будет время прошу попробовать все-таки отправить пуш из firebase консоли (firebase консоль - Notifications - Новое сообщение) и посмотреть пример ли его мобильная платформа. Тогда поймем действительно ли мобильная платформа принимает именно FCM пуши.
И я так понимаю в кишки мобильного приложения залезть не получится и поправить это, только ждать пока 1с это сами реализуют.
Уведомление = Новый ДоставляемоеУведомление;
Уведомление.Получатели.Добавить("12345);
Уведомление.Текст = "Текст уведомления";
Уведомление.ЗвуковоеОповещение = ЗвуковоеОповещение.Нет;
Уведомление.Наклейка = 2;
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, "PUSH_SRV_API_KEY_12345");
ПоказатьПолучаю ошибку:
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, "PUSH_SRV_API_KEY_12345");
по причине:
Несоответствие типов (параметр номер '1')
Принимаемые типы первого параметра:
Тип: ДоставляемоеУведомление, Массив.
Что я делаю не так?
Пока руки не дошли до полной реализации http сервера (чтобы весь ид передавать), сделал вот такую функцию для создания ИД на сервере по строке
&НаСервереБезКонтекста
Функция ПолучитьПолучателя(DeviceID, Type)
xdtoПодписчик = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://v8.1c.ru/8.3/data/ext","DeliverableNotificationSubscriberID"));
xdtoПодписчик.DeviceID = DeviceID;
xdtoПодписчик.SubscriberType = ФабрикаXDTO.Создать(
ФабрикаXDTO.Тип("http://v8.1c.ru/8.3/data/ext","DeliverableNotificationSubscriberType")
, ?(Type = Перечисления.ТипыУстройств.Андроид, "GCM", "APNS")
);
НовыйСериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
Подписчик = НовыйСериализаторXDTO.ПрочитатьXDTO(xdtoПодписчик);
Возврат Подписчик;
КонецФункции
ПоказатьНо на этапе получения исключённых
масИсключения = ОтправкаДоставляемыхУведомлений.ПолучитьИсключенныхПолучателей(НаборКонстант.КлючДляGOOGLE);
получаю ошибку
"Не переданы данные для авторизации в сервисе отправки уведомлений"
Ключик пробовал и "Ключ API 1" и серверный - всё равно реакция одна.
Может вы сможете подсказать, куда копать ?
Теперь уже лучше - ошибка выглядит иначе
"Отправка сообщения 1 через GCM завершилась ошибкой: ключ отправителя не подходит для получателя"
Ну тут видимо всё же придётся передавать ИД целиком с сериализацией.
Подытожу для истории: получить ключ сервера для GCM API на данный момент можно только в Firebase console. Вот подробно расписано. Конкретно я споткнулся на том, что из-за всех этих экспериментов с проектами гугла и ключами для их API я забыл перегенерировать идентификатор мобильного клиента и он оставался подписан на другой проект гугла.
Скажите пожалуйста, как именно перегенерировать идентификатор мобильного устройства? Какие действия сделать?
так |
|---|
| НомерПриложенияGCM = "123"; //идентификатор проекта гугл из Firebase Console
ИдентификаторПодписчика = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(НомерПриложенияGCM); |
Уведомление = Новый ДоставляемоеУведомление;
Для каждого IDGCM Из IDGCMs.IDGCM Цикл
Уведомление.Получатели.Добавить(IDGCM.Получить());
КонецЦикла;
Уведомление.Заголовок = "Заголовок";
Уведомление.Текст = "Текст";
Уведомление.Данные = "654654";
Уведомление.Наклейка = 2;
Уведомление.ИнтервалПовтора = 0;
Уведомление.ЗвуковоеОповещение = ЗвуковоеОповещение.ПоУмолчанию;
Если Уведомление.Получатели.Количество() > 0 Тогда
Попытка
мИсключенныеПолучатели = Новый Массив;
мИнформацияОПроблемахОтправкиДоставляемыхУведомлений = Новый Массив;
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, "AIzaSyCp1J..............................jdazL8", мИсключенныеПолучатели,,мИнформацияОПроблемахОтправкиДоставляемыхУведомлений);
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, "AAAApAOy1s4:..............................................................................................................................................VHePtr2APYA39UWA7rl8IM4e9GYPzf7", мИсключенныеПолучатели,,мИнформацияОПроблемахОтправкиДоставляемыхУведомлений);
Исключение
КонецПопытки;
КонецЕсли;
ПоказатьПробовал ключ и новый и старый. По итогу в мИнформацияОПроблемахОтправкиДоставляемыхУведомлений получаю ошибку с "Не переданы данные для авторизации в сервисе отправки уведомлений.".
Что блин я не так делаю?
ДанныеАвторизации = Новый Соответствие;
ДанныеАвторизации.Вставить(ТипПодписчикаДоставляемыхУведомлений.GCM, КлючСервера);
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, ДанныеАвторизации, ,,мИнформацияОПроблемахОтправкиДоставляемыхУведомлений);
Мне этот совет помог.
Пробовал
на 8.3.11 в режиме совместимости с 8.3.8 - работает.
на 8.3.8 без режима совместимости - работает.
на 8.3.8 в режиме совместимости с 8.3.7 НЕ работает с ошибкой "Ошибка работы с Интернет: Удаленный узел не прошел проверку"
на 8.3.7 без режима совместимости НЕ работает с ошибкой "Ошибка работы с Интернет: Удаленный узел не прошел проверку"
использовал все самые последние варианты работы на момент 04.2018. firebase.google.com длинный ключ сервера.
Скорее всего ниже совместимости с версией 8.3.8 отправка средствами 1с не работает.
1. Зачем обновлять ПодключитьОбработчикОжидания("Подключаемый_ОбновитьIDПодписчика", 7200)?
IDПодписчика у меня уже неделю один и тот же.
2. Кому-то удалось все же получить Push при закрытом моб. приложении (у меня нет)?
Вот что написано здесь:
Если мобильное приложение работает в фоновом режиме (неактивно) или вообще не исполняется (выгружено из памяти), то уведомление отображается операционной системой. При этом используется звуковое оповещение и наклейка. В iOS наклейка будет установлена у иконки мобильного приложения на домашнем экране, а в Android она задаёт число, которое будет отображено в сообщении на панели уведомлений. После того, как пользователь нажмёт на уведомление, будет активизировано (или запущено) мобильное приложение, и будет выполнен (если он подключён) обработчик уведомлений.
При этом с этой ошибка платформа предлагает завершить работу, в исключение в коде не уходит
Был до этого ключ GCM , потом импортировал в FCM и при этом все осталось так же
Самое интересное что иногда проходит push иногда нет.
И то ли проблема в нашем все таки окружении или в каких то изменениях у google.
Сделано все через объекты 1с
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление,ДанныеАвторизации)2. Непонятно что является ID проекта в FCM для получения идентификатора мобильного устройства , то ли Project ID , то ли Sender ID?
проблема началась 27 февраля 2018 года
Ранее работало без збоя.
Решения в интернете не нашел.
Есть решение данной проблемы?
Платформа: 1С:Предприятие 8.3 (8.3.11.3034)
Конфигурация: Сервер
Режим: Файловый (без сжатия)
Приложение: Тонкий клиент
Локализация: Информационная база: украинский (Украина), Сеанс: русский
Вариант интерфейса: Такси
Ошибки:
--------------------------------------------------------------------------------
12.03.2018 16:44:00
Ошибка работы с Интернет: Удаленный узел не прошел проверку
Проблема в платформе, которая работает в режиме совместимости версии старше 8.3.7. Если есть возможность совместимость снять, то проверка сертификата будет выполняться средствами ОС.
Мне установка сертификата не помогла. Работаю с УПП в режиме совместимости 8.2.13. Сегодня отпишу по разбору лога.
Спасибо.
Тоже увидели форум и там нашли решение. Нам установка сертификата помогла, мы в свое время заморочились и сняли совместимость.
Там есть вариант и без снятия совместимости через запросы напрямую, минуя объекты 1С. Идет активное обсуждение.
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEg
A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2Jh
Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjEx
MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjET
A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJ
hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeM
eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZf
tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKR
C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpR
zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOB
mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2Ny
bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwe
3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQL
J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4
291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenV
ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCM
AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRu
TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGT
-----END CERTIFICATE-----
Сервер (2008R2) с которого push перестали отправляться. Платформа 8.3.10.2466 совместимость 8.2.13 клиент-сервер, обычные формы.
Что сделал. Так как логи CAPI2 ничего не показывали - установил Wireshark на сервер 1с, запустил и в момент отправки push в глаза бросилась ошибка "Unknown CA". Смотрю адрес сервера с которого получил ответ, забиваю его в IE - открылся гугл. Захожу в сертификаты сайта, скачиваю, смотрю наименование - GIA3.
Окей. 1й вариант - вбить его название в гугле и искать ключ сертификата. 2й вариант - разбирать сертификат в .pem формат через openssl, но это черезчур для моих навыков. 3й вариант - спросить на форуме, как я и поступил.
Ключ сертификата в спойлере. Если вбить в поисковик 1ю строку, то можно убедиться, что в инете их выкладывают и не составит труда найти его без помощи форумов.
-----BEGIN CERTIFICATE-----
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEg -----END CERTIFICATE----- |
|---|
| Сертификат google GIA3 |
Дописал его в cacert,pem. УБЕДИЛСЯ, что дата изменения у файла обновилась и только тогда перезапустил 1с сервер (не факт, что требуется). Вуаля, вопрос решён.
Всем добра!
Также решил описать прямой запрос.
Пока есть ошибки.
Может скооперироваться та довести до логической работы прямой запрос.
Вот мой текст запроса:
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина));
СтруктураЗапроса = Новый Структура;
Данные = Новый Структура;
СтруктураЗапроса.Вставить("data", Новый Структура("message,title","GCM Notifier:Message Success","GCM Notifier:Title Success"));
Данные = Новый Структура;
Данные.Вставить("title","GCM Notifier:Title Success");
Данные.Вставить("body", "GCM Notifier:Message Success");
Данные.Вставить("sound","default");
Данные.Вставить("badge","1");
СтруктураЗапроса.Вставить("notification", Данные);
//Можно так
//СтруктураЗапроса.Вставить("to", "APA91bFFUQHGAOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXiA");//То что генерируется в мобильном устройсве
//Если отмпарвка нескольким то
массивИД = Новый Массив;
массивИД.Добавить("APA91bFFUQHGAOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXiA");//То что генерируется в мобильном устройсве
СтруктураЗапроса.Вставить("registration_ids", массивИД);
СтруктураЗапроса.Вставить("ApplicationID", "com.e1c.mobile");
ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
strJSON = ЗаписьJSON.Закрыть();
Соединение = Новый HTTPСоединение("gcm-http.googleapis.com/gcm/send");
HTTPЗапрос = Новый HTTPЗапрос();
HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");
HTTPЗапрос.Заголовки.Вставить("Authorization", "key=AIzaXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX9o");//Ключ Google
HTTPЗапрос.УстановитьТелоИзСтроки(strJSON,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);
ОтветHTPP = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
Сообщить(ОтветHTPP.ПолучитьТелоКакСтроку());
//Ответ
//{"multicast_id":5396816832955369423,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]} ПоказатьОтправка сообщения 1 через GCM завершилась ошибкой: <HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
Вот мой текст запроса:
Oleg P, Получилось в итоге отправить таким запросом на андроид?
АдресСервера = "fcm.googleapis.com/fcm/send";
ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(
СпособВыбораСертификатаWindows.Выбирать),
Новый СертификатыУдостоверяющихЦентровWindows());
Соединение = Новый HTTPСоединение(АдресСервера,,,,,,ssl);И еще. Долго бился, не мог понять почему приходит ответ Unauthorized, в итоге оказалось, что в консоли Firebase в свойствах проекта нужно брать ключ АПИ не из общих параметров а на закладке Cloud Messaging.
ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(
СпособВыбораСертификатаWindows.Выбирать),
Новый СертификатыУдостоверяющихЦентровWindows());
Соединение = Новый HTTPСоединение(АдресСервера,,,,,,ssl);
Руслан, не могли бы вы подсказать. Писал прямым запросом. Получается принимать пуш через параметр notification(т.е в фоновом режиме) , а вот с параметром data не получается. Пуш не приходит в открытом приложении
У меня формирование сообщения сделано вот так (по сути тело вставляется два раза, один раз для обработки на клиенте в фоновом режиме, другой для обычного режима)
само сообщение: ТелоСообщения
для уведомления: ПараметрыУведомления
всё вместе: ПараметрыСообщения
ТелоСообщения = Новый Структура;
ТелоСообщения.Вставить("title", ДанныеСообщения.Заголовок);
ТелоСообщения.Вставить("body", ДанныеСообщения.Сообщение);
ТелоСообщения.Вставить("document_guid", ДанныеСообщения.Идентификатор);
ПараметрыУведомления = Новый Структура;
ПараметрыУведомления.Вставить("title", ДанныеСообщения.Заголовок);
ПараметрыУведомления.Вставить("body", ДанныеСообщения.Сообщение);
ПараметрыУведомления.Вставить("data", ТелоСообщения);
ПараметрыСообщения = Новый Структура;
ПараметрыСообщения.Вставить("to", ТокенПолучателя);
ПараметрыСообщения.Вставить("data", ТелоСообщения);
ПараметрыСообщения.Вставить("notification", ПараметрыУведомления);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыСообщения);
СтрокаТелоЗапроса = ЗаписьJSON.Закрыть(); ПоказатьПриложение нативное. Мне кажется, моя проблема в том, что на клиенте я неправильно делаю вывод сообщения. Буду признателен, если подскажите. Получается, в обработчик доставляемых уведомлений вы передаете ПараметрыУведомления?
т.е как-то так?
Процедура ПриНачалеРаботыСистемы()
#Если МобильноеПриложениеКлиент Тогда
ДоставляемыеУведомления.ПодключитьОбработчикУведомлений("Подключаемый_ОбработкаУведомления");
#КонецЕсли
КонецПроцедуры
Процедура Подключаемый_ОбработкаУведомления(ПараметрыУведомления, Локальное, Показано) Экспорт
#Если МобильноеПриложениеКлиент Тогда
Сообщить(ПараметрыУведомления);
#КонецЕсли
КонецПроцедуры
ПоказатьЗдравствуйте, получилось у вас довести запрос до рабочего состояния?
Ошибка работы с Интернет: Удаленный узел не прошел проверку
обновил платформу до 8.3.11.3034 теперь такая ошибка у меня:
{ОбщаяФорма.ОтправитьPushсообщение.Форма(41)}: Ошибка при вызове метода контекста (Отправить)
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, ЭтотОбъект.КлючСервера);
по причине:
Не переданы данные для авторизации в сервисе отправки уведомлений.
ОтправкаДоставляемыхУведомлений.ПолучитьИсключенныхПолучателей(КлючСервера)
Не переданы данные для авторизации в сервисе отправки уведомлений
После этой ошибки я обновил платформу на 8.3.11, ошибка: Не переданы данные для авторизации в сервисе отправки уведомлений.
Приложения для мобильника я не менял, ID подписчика всегда выдает один и тот же, он не изменен.
Может настало время платить за сервис google?
и еще замечание
//так работает
ДанныеАвторизации = Новый Соответствие;
ДанныеАвторизации.Вставить(ТипПодписчикаДоставляемыхУведомлений.GCM, Ключ);
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, ДанныеАвторизации);
//а так можно было раньше, больше не работает
//ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, Ключ);
1. Установили сертификат из (27)
2. Сделали вызов как в (39)
3. Режим совместимости оставили 8.3.6
4. Платформа 8.3.10.2667
И все работает?
И какая у Вас ОС?
Вопрос уже был решен.
Если режим совместимости 8.3.7+ то ищем сертификат GIA3 в консоле certmgr.msc и проверяем даты. Просроченный обновляем.
Если 8.3.7 и менее, то пишем ключ сертификата в cacert.pem
Платформа 8.3.11 и 8.3.12 (последние с сайта).
Попытка отправить push на Андроид.
На строке
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, ДанныеАвторизации, , , МассивОшибокОтправкиPUSH);тонкий клиент просто крашится, и Windows предлагает "отладка" или "закрыть программу".
В технологическом журнале пусто.
Кто-нибудь сталкивался?
Уведомление = Новый ДоставляемоеУведомление;
Уведомление.Заголовок = "111";
Уведомление.Текст = "123";
Уведомление.Данные = "213";
Уведомление.ЗвуковоеОповещение = ЗвуковоеОповещение.ПоУмолчанию;
xdtoПодписчик = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://v8.1c.ru/8.3/data/ext","DeliverableNotificationSubscriberID"));
xdtoПодписчик.DeviceID = "ID1";
xdtoПодписчик.SubscriberType = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://v8.1c.ru/8.3/data/ext","DeliverableNotificationSubscriberType"), "GCM");
НовыйСериализаторXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
Подписчик = НовыйСериализаторXDTO.ПрочитатьXDTO(xdtoПодписчик);
Уведомление.Получатели.Добавить(Подписчик);
ДанныеАвторизации = Новый Соответствие;
ДанныеАвторизации.Вставить(ТипПодписчикаДоставляемыхУведомлений.GCM, "ID2");
МассивУв=Новый массив;
МассивУв.Добавить(Уведомление);
ОтправкаДоставляемыхУведомлений.Отправить(МассивУв, ДанныеАвторизации);
Показатьв итоге не получается отправить сообщение.
на сколько я знаю для отправки уведомления APNS необходимо в операторе во второй параметр "ДанныеАутентификации"
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, ДанныеАутентификации);подсунуть Файл сертификата (а не ключСервера, как это на андроиде), необходимый для подключения к службе доставки "Apple Push Notification Service" (расширение .pem). у кого-то получилось это сделать, если да, то какие были особенности, у меня что-то никак не взлетит и сертификат сгенерил и подсунул его в виде макета, но уведомление не проходят, ошибок со стороны 1с не выходит
IDПодписчика = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений("10412********");
выдает ошибку
{Обработка.Тест.Форма.Форма.Форма(498)}: Ошибка при вызове метода контекста (ПолучитьИдентификаторПодписчикаУведомлений)
по причине:
Не удалось получить идентификатор подписчика push-уведомлений.
Мобильная платформа 8.3.12.74. Подскажите что не так то(
I working on push notification. My code is:
Mobile;
//managed application module
Procedure OnStart()
UpdateClientID();
AttachIdleHandler("Connectable_UpdateFollowingID", 7200);
#If MobileAppClient Then
DeliverableNotifications.AttachNotificationHandler("Plugin_ProcessingNotifications");
#EndIf
EndProcedure
Procedure Connectable_UpdateFollowingID() Export
UpdateClientID();
EndProcedure
Procedure UpdateClientID()
#If MobileAppClient Then
mProjectNumber = CommonCallServer.GetProjectNumber();
If IsBlankString(mProjectNumber) Then
Return;
EndIf;
Try
SubscriberID = DeliverableNotifications.ReceiveNotificationSubscriberID(mProjectNumber);
Except
Message(ErrorDescription());
Return;
EndTry;
mQueryOptions = New Structure("ServerAddress, NameBase, ClientID");
// указываем IP Сервера, он может быть как локальный, так и нет
mQueryOptions.ServerAddress = "192.168.0.14";
// имя базы, под которым она была опубликована на вэб сервере
// о том, как выполнить публикацию информации в Интернете информации предостаточно
mQueryOptions.NameBase = "GELAL";
mQueryOptions.ClientID = SubscriberID;
CommonCallServer.SendIDToServer(mQueryOptions);
#EndIf
EndProcedure
Procedure Plugin_ProcessingNotifications(Notification, IsLocal, IsShow) Export
// просто сообщим тест пуша
Message(Notification.Text);
#If MobileAppClient Then
MultimediaTools.PlaySoundAlert(SoundAlert.Default,True);
Noti = New DeliverableNotification;
Noti.Title = Notification.Text;
Noti.Text = Notification.Text;
Noti.SoundAlert = SoundAlert.Default;
DeliverableNotifications.AddLocalNotification(Noti);
#EndIf
EndProcedure
It is working. my mobile device get id from firebase and update server constant is clientID.
Than, i was try send a deliverablenotification on server to mobile device.
Server;
&AtServer
Procedure OnCreateAtServer(Cancel, StandardProcessing)
ThisForm.ServerKey = "AAAA5L5rYdQ:APA91bEY0GG6FZB2GCW3OwnUhBtAREB65pghyZvc9UKJC64IyOenBJFTDYVq
ThisForm.Başlık = "AA";
ThisForm.Mesaj = "AAA";
EndProcedure
&AtClient
Function DeSerialize(Data, ConversionType = Undefined)
XMLReader = New XMLReader;
XMLReader.SetString(Data);
mReadXML = XDTOSerializer.ReadXML(XMLReader, ConversionType);
XMLReader.Close();
Return mReadXML;
EndFunction
&AtServerNoContext
Function GetClientID()
Return Constants.ClientID.Get().Get();
EndFunction
&AtClient
Procedure Gönder(Command)
Notification = New DeliverableNotification;
Notification.Title = Başlık;
Notification.Text = Mesaj;
Notification.SoundAlert = SoundAlert.Default;
pXML = DeSerialize(GetClientID());
Notification.Recipients.Add(pXML);
DeliverableNotificationSend.Send(Notification, ServerKey);
EndProcedure
&AtClient
Procedure OnOpen(Cancel)
ThisForm.ClientID = DeSerialize(GetClientID()).DeviceID;
EndProcedure
This code is working. Not give error. But notification not received my mobile device.
My versions are:
Mobile device: Android 5.1
Mobile App: 8.3.12.67
Server: 8.3.12.1567
How can i fix this issue? Please help me.
i bought this program. Not working. The notification is not forwarded to the phone. I want to give back. Will you solve my problem?
Then make sure that the client sends the recipient's identifier to the server (in the sending form, the lowest field should be filled in).
And there are a lot of nuances with the publication of a web service and a mobile application.
And of course here
DeliverableNotificationSend.Send (Notification, ServerKey);
must be changed to Соответствие (I do not know the English equivalent)
Please provide more error information.
Перелопатил многие варианты... в итоге заработало по следующему сценарию:
1. cacert.pem с сайта ИТС
2. добавляем Google Internet Authority G3 (взять можно чуть ли не на любом компьютере сертификат с расширением .crt, преобразовать к pem по сценарию
WireShark по-прежнему ловит ошибку Unknown CA. Думал, что с моими манипуляциями что-то не то, а на деле все оказалось проще. Случайно обратил внимание, что сертификат GlobalSign в cacert.pem, служащий корневым для GIAG3, истек еще в 2014.
3. добавляем актуальный GlobalSign в cacert.pem
PROFIT
Платформа: 1С:Предприятие 8.3 (8.3.11.2867)
Режим совместимости: 8.3.4
Клиент-сервер
GIAG3.txt
GlobalSign.txt
Так же вопрос автору. В качестве сервера может выступать второй мобильный клиент? Какая скорость такого общения? В шахматы в режиме онлайн сможет работать?
Дебри Google, которые больше всего не понятны, в статье описаны очень криво картинки нереальные и обрезанные, от чего наступает полная дезориентация.
Возможно у автора какая-то продвинутая консоль разработчика, но у меня она выглядит
и я не нашел ни одного пункта описанного в статье.
Через всё получается намного проще в два клика и работает как часы. Но хотелось всё сделать без посредников.
Код 1С элементарный к нему вопросов нет.
Т.к. на стороне мобильной платформы нет http сервисов, универсальный обмен json не подойдет, т.к. отсылка идет со стороны сервера. Со стороны мобильного приложения запрашивать обновления и синхронизацию не хочу.
МенеджерОтправкиДоставляемыхУведомлений (DeliverableNotificationSendManager)
Примечание:
Суммарная длина полей уведомления в системе APNS не может превышать 2 КБайт. Суммарная длина полей уведомления в системе GCM не может превышать 4 КБайт. При превышении установленного лимита будет сгененировано исключение.
у меня 8.3.12 нет примечания к FCM, предполагаю там тоже есть ограничения
Самое забавное, что суммарная информация передачи push уведомления по полям: "заголовок, текст, данные" - не должна превышать 2кб, иначе не приходит.
Печаль, беда... Кто-нибудь сталкивался? есть пути обхода? Скажем, мне бы JSON передать, где 2000 символов, не получится...
Есть идеи, как по другому с сервера сразу передавать данные на мобилку? Возможно, я загоняюсь уже =)
Отправлять уведомления из 1С можно:
1) http-запросом к Google;
2) методом ОтправкаДоставляемыхУведомлений.Отправить();
У Google доступно два метода
a) GCM - старый, уже не поддерживается;
б) FCM - новый, поддерживает (возможно) и iOS (не проверял)
Первый метод
Для работы необходимо передать на сервер идентификатор подписчика уведомлений с мобильного устройства, полученный методом:
ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений(<идентификатор отправителя из консоли firebase>)
Если не указать "идентификатор отправителя", идентификатор подписчика получает тип FCM, но таким образом можно только использовать код для сборки проекта.
В случае же разработки и тестирования на мобильной платформе необходимо указать "идентификатор отправителя", тип подписчика станет GCM, но работать будет.
Дальше на сервере мы создаём JSON строку и отправляем HTTPЗапрос (выше в комментариях есть пример).
Ньюанс: получателем является строка(массив строк) с идентификатором устройства из идентификатора подписчика
Второй метод
Поддерживает отправку:
1) через посредника 1С () - в моем случае оказался неработоспособен, но это частный случай.
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, ДанныеАвторизации, , Истина,);
2) напрямую сервисам
а) клиент iOS
на сервер передаем идентификатор подписчика (параметр - идентификатор отправителя не требуется) полученный
ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений()
б) клиент Android
тоже самое что и для первого метода;
на сервере:
ДанныеАвторизации = Новый Соответствие;
ДанныеАвторизации.Вставить(ТипПодписчикаДоставляемыхУведомлений.<нужный тип>, <ключ сервера или сертификат для APNS> )
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, ДанныеАвторизации, , Ложь,);
Ньюанс: получателем является массив идентификаторов подписчиков уведомлений
как и при использовании первого метода - FCM будет работать только на конечном приложении, поэтому для отладки на мобильной платформе для Android этот метод не подойдет.
Выводы: для разработки надо четко разделять платформу и режим работы - разработка или конечное приложение, от этого зависит выбор необходимого инструментария. Для разработки на Android - http запрос,
для iOS - ОтправкаДоставляемыхУведомлений.Отправить(). Для конечного продукта можно оставить код, а можно переписать под использование типового функционала (любителям перфекционизма использовать ОтправкаДоставляемыхУведомлений.Отправить() для обоих платформ.)
и опять таки это все справедливо при невозможности(нежелании) работать через посредника 1С.
Почитайте выводы и отталкивайтесь от режима разработки - возможно прийдётся что-то переписать... Или опишите суть проблемы, могу помочь выбрать нужный метод..
ps: к сожалению помочь без более подробной информации не представляется возможным.
ошибки валяться одна за другой.
firebase Ключ сервера и идентификатор получил...но не работает..
Если отправлять с сервака на приложение с использованием ИД, то ошибка:
Ошибка отправки PUSH. КодСостояние: 400
JSON_PARSING_ERROR: Unexpected character () at position 0.
на мобильной платформе 8.3.17 перестали приходить пуши, отправленные с помощью REST API. Ошибка "MismatchSenderId".
Похоже метод ПолучитьИдентификаторПодписчикаУведомлений() выдаёт некорректный идентификатор.
После отката на платформу 8.3.15 работает
<DeliverableNotificationSubscriberID xmlns="http://v8.1c.ru/8.3/data/ext" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<subscriberType>FCM</subscriberType>
<deviceID>fJzOC2t</deviceID>
<applicationID>com.</applicationID>
<databaseID/>
</DeliverableNotificationSubscriberID>
{
"error": {
"code": 400,
"message": "Invalid JSON payload received. Unknown name \"registration_ids\" at 'message': Cannot find field.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"field": "message",
"description": "Invalid JSON payload received. Unknown name \"registration_ids\" at 'message': Cannot find field."
}
]
}
]
}
у меня так обыграно:
Если МассивУстройств.Количество() = 1 Тогда
ПараметрыСообщения.Вставить("to", МассивУстройств[0]);
Иначе
ПараметрыСообщения.Вставить("registration_ids", МассивУстройств);
КонецЕсли;Проверено на 8.3.16 моб версия
Процедура ОсновнойИнтерфейсДействие() Экспорт
ЗаголовокСообщения = "Test message";
ТекстСообщения = "4567";
ДанныеСообщения = "123";
КлючСервера = "_____________взять его с ;
ИдентификаторПодписчикаXML = "________взять с мобильного приложения_____"
FCMPushСервер.ОтправитьPUSH_Android(ИдентификаторПодписчикаXML, КлючСервера, ЗаголовокСообщения, ДанныеСообщения, ТекстСообщения);
КонецПроцедуры
Процедура ОтправитьPUSH_Android(ИдентификаторПодписчикаXML, КлючСервера, Заголовок, Данные, Текст) Экспорт
Попытка
ИдентификаторПодписчикаОбъект = ДесериализоватьXDTO(ИдентификаторПодписчикаXML);
СоединениеHTTP = Новый HTTPСоединение("fcm.googleapis.com",443,,,,, Новый ЗащищенноеСоединениеOpenSSL(,));
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "key=" + КлючСервера);
Заголовки.Вставить("Content-Type", "application/json");
АдресРесурса = "fcm/send";
ЗапросHTTP = Новый HTTPЗапрос(АдресРесурса, Заголовки);
ТелоСообщения = Новый Структура;
ТелоСообщения.Вставить("title", Заголовок);
ТелоСообщения.Вставить("data", Данные);
ТелоСообщения.Вставить("text", Текст);
ПараметрыСообщения = Новый Структура;
Н =Новый Массив;
Н.Добавить(ИдентификаторПодписчикаОбъект.ИдентификаторУстройства);
ПараметрыСообщения.Вставить("registration_ids", Н);
ПараметрыСообщения.Вставить("data", ТелоСообщения);
СообщениеJSON = ЗаписатьДанныеВJSON(ПараметрыСообщения);
Если СообщениеJSON = Неопределено Тогда
Возврат;
КонецЕсли;
ЗапросHTTP.УстановитьТелоИзСтроки(СообщениеJSON, "UTF-8",ИспользованиеByteOrderMark.НеИспользовать);
Ответ = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);
Если НЕ Ответ.КодСостояния = 200 Тогда
Сообщить("Ошибка отправки PUSH. КодСостояние: "+Ответ.КодСостояния + Символы.ПС + Ответ.ПолучитьТелоКакСтроку());
Иначе
Сообщить("Код ответа:"+Ответ.КодСостояния+ Символы.ПС + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Ошибка"+ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
ПоказатьПопытка
ИдентификаторПодписчикаОбъект = ДесериализоватьXDTO(ИдентификаторПодписчикаXML);
СоединениеHTTP = Новый HTTPСоединение("fcm.googleapis.com",443,,,,, Новый ЗащищенноеСоединениеOpenSSL(,));
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "key=" + КлючСервера);
Заголовки.Вставить("Content-Type", "application/json");
АдресРесурса = "fcm/send";
ЗапросHTTP = Новый HTTPЗапрос(АдресРесурса, Заголовки);
ТелоСообщения = Новый Структура;
ТелоСообщения.Вставить("title", Заголовок);
ТелоСообщения.Вставить("data", Данные);
ТелоСообщения.Вставить("text", Текст);
ПараметрыСообщения = Новый Структура;
Н =Новый Массив;
Н.Добавить(ИдентификаторПодписчикаОбъект.ИдентификаторУстройства);
ПараметрыСообщения.Вставить("registration_ids", Н);
ПараметрыСообщения.Вставить("data", ТелоСообщения);
СообщениеJSON = ЗаписатьДанныеВJSON(ПараметрыСообщения);
Если СообщениеJSON = Неопределено Тогда
Возврат;
КонецЕсли;
ЗапросHTTP.УстановитьТелоИзСтроки(СообщениеJSON, "UTF-8",ИспользованиеByteOrderMark.НеИспользовать);
Ответ = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);
Если НЕ Ответ.КодСостояния = 200 Тогда
Сообщить("Ошибка отправки PUSH. КодСостояние: "+Ответ.КодСостояния + Символы.ПС + Ответ.ПолучитьТелоКакСтроку());
Иначе
Сообщить("Код ответа:"+Ответ.КодСостояния+ Символы.ПС + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Ошибка"+ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Короче если не хотите рисковать не обновляйте 1С, особенно до 8.3.19 – будут проблемы.
так и не смогли отправить на 8.3.17?
У меня аналогичная ошибка на мобильном клиенте.
Нет никакой новой информации?
Даже тестировщик запросов гугла в справке по методу send говорит, что моюильный клиент 1С генерирует неверные токены.
Так, что это в 1С, что-то поменялось. Теперь не будут походу больше FCM уведомления работать.
Я ТРИ НЕДЕЛИ уже копаюсь в это галиматье не работает и всё СОБАКА!!!! Целый год всё работало. Не пойму в чём дело.
Вот мой ИДПодписчика в сериализованном виде
<DeliverableNotificationSubscriberID xmlns="http://v8.1c.ru/8.3/data/ext" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><subscriberType>FCM</subscriberType><deviceID>dUH4
Рейтинг: 842
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 606748
Создание 06.04.17 14:08
Обновление 06.04.17 14:08
Просмотры 56653
Загрузки 79
Рейтинг
82
Комментарии 151
Код открыт Не указано
Рубрики Мобильная разработка
Кому Разработчик
Тип файла Архив с данными
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)