Была поставлена задача разработать мобильное приложение для приема заявок в УНФ.
Штатное не подошло, там Заказы покупателей.
Встал вопрос об обратной связи с приложением и тут начались танцы... так как на сей момент мобильное приложение не поддерживает Систему взаимодействия. Как только добавят, изврат, описанный в статье, станет не актуален.
Было принято решение использовать интеграцию с Web Chat. Сразу надо отметить: разбить Web Chat на обсуждения не выйдет, такого функционала нет, все "одной портянкой".
Итак обсуждения в системе активны, Web Chat создан, 1С нам выдает ссылку точки подключения.
(на эту тему много роликов на ютуб)
На форме документа была создана гиперссылка по которой открывается HTML страница примерно с таким содержимым:
Функция ОбсуждениеHTML() Экспорт
HTML = "
|<!DOCTYPE html>
|<html lang=""ru"">
|<head>
| <meta charset=""UTF-8"">
| <meta name=""mobile1C""
| content=""width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"">
| <title>mobile1C</title>
| <link rel=""stylesheet"" href=""css/style.css"">
|</head>
|<body>
| <script src=""https://integrations.1cdialog.com/integration/webchat/тута ваша часть ссылки на точку доступа"" async></script>
| <script>
| var interactionVariable = null;
| var messageSend = fulse;
|
| </script>
| <main class = 'main'>
| <div class = 'container'>
| <div class = 'title'> </div>
| </div>
| </main>
| <div id = 'RUNJS' />
| <button id=""interactionButton"" style=""display: none""> Кнопка взаимодействия </button>
| </body>
|</html>";
Возврат HTML;
КонецФункции
Пусть реквизит на форме называется "ОбсуждениеHTML"
На форме документа добавляем код
Код на форме документа, обрабатывающий событие формирования HTML документа
&НаКлиенте
Перем Документ, ОкноБраузера;
# Область Обсуждение
&НаКлиенте
Процедура ОбсуждениеHTMLДокументСформирован(Элемент)
ПодключитьОбработчикОжидания("ОжиданиеОбсуждениеHTMLДокументСформирован", 1);
ПодключитьОбработчикОжидания("ОжиданиеОбсуждениеHTMLДокументСформирован", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ОжиданиеОбсуждениеHTMLДокументСформирован()
Документ = Элементы.ОбсуждениеHTML.Документ;
Если Документ <> Неопределено Тогда
ОкноБраузера = Документ.parentWindow;
Если ОкноБраузера = Неопределено Тогда
ОкноБраузера = Документ.defaultView;
КонецЕсли;
CollaborationSystemWebChat1CE = ОкноБраузера.CollaborationSystemWebChat1CE;
Если CollaborationSystemWebChat1CE <> Неопределено Тогда
ОтключитьОбработчикОжидания("ОжиданиеОбсуждениеHTMLДокументСформирован");
УстановитьПользователяСистемыВзаимодействия(Документ, CollaborationSystemWebChat1CE);
ПодключитьОбработчикОжидания("ОткрытьWebChat" , 0.1, Истина);
ПодключитьОбработчикОжидания("ПроверитьОткрытиеЧата", 1);
ПодключитьОбработчикОжидания("ПроверкаОтправкаСообщения", 1);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьОткрытиеЧата()
Если ОкноБраузера.interactionVariable = "ЧатОткрыт" Тогда
ОтключитьОбработчикОжидания("ПроверитьОткрытиеЧата");
Иначе
ОткрытьWebChat();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьWebChat()
CollaborationSystemWebChat1CE = ОкноБраузера.CollaborationSystemWebChat1CE;
CollaborationSystemWebChat1CE.open();
КонецПроцедуры
&НаКлиенте
Процедура ПроверкаОтправкаСообщения()
Если Не ОкноБраузера.messageSend = Истина Тогда
СкриптОтравкиСообщения = СкриптОтравкиСообщенияОткрытияДокумента("Обсуждение документа № " + Объект.Номер);
ВыполнитьСкрипт(СкриптОтравкиСообщения);
Иначе
ОтключитьОбработчикОжидания("ПроверкаОтправкаСообщения");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьПользователяСистемыВзаимодействия(Документ, CollaborationSystemWebChat1CE)
Скрипт = СкриптУстановкиКонтактнойИнформации(ТекущийПользователь, ПолноеИмяПользователя);
ВыполнитьСкрипт(Скрипт);
СкриптПриЗагрузкеЧата = СкриптПриЗагрузкеЧата("Обсуждение документа № " + Объект.Номер);
ВыполнитьСкрипт(СкриптПриЗагрузкеЧата);
КонецПроцедуры
Функция СкриптПриЗагрузкеЧата(ТекстСообщения = "") Экспорт
Скрипт = "
| try {
|
| CollaborationSystemWebChat1CE.addListener('open', function (event) {
|
| var message = {
| text : '" + ТекстСообщения + "',
| textFormat: 'text/plain'
| };
| CollaborationSystemWebChat1CE.sendMessage(message);
| messageSend = true;
|
| interactionVariable = 'ЧатОткрыт';
|
|
| });
| } catch (err) { alert(err);
| }
|";
Возврат Скрипт;
КонецФункции
Функция СкриптУстановкиКонтактнойИнформации(ТекущийПользователь, Знач ПолноеИмяПользователя) Экспорт
Скрипт = "
| try {
| var contactInfo = {
| name: '" + ТекущийПользователь + "',
| fullName: '" + ПолноеИмяПользователя + "',
| email: '""',
| phone: '""'
| };
| CollaborationSystemWebChat1CE.setContactInfo(contactInfo);
| contactInfoPromise = CollaborationSystemWebChat1CE.getContactInfo();
| contactInfoPromise.then('onFulfilled', function() { alert(CollaborationSystemWebChat1CE.getContactInfo().name) });
| //alert(CollaborationSystemWebChat1CE);
| } catch (err) { alert(err);
| }
|";
Возврат Скрипт;
КонецФункции
Функция СкриптОтравкиСообщенияОткрытияДокумента(ТекстСообщения = "") Экспорт
Скрипт = "
| try {
|
| var message = {
| text : '" + ТекстСообщения + "',
| textFormat: 'text/plain'
| };
| CollaborationSystemWebChat1CE.sendMessage(message);
| messageSend = true;
|
| } catch (err) { //alert(err);
| }
|";
Возврат Скрипт;
КонецФункции
&НаКлиенте
Процедура ВыполнитьСкрипт(ТекстСкрипт)
ДИВ = Элементы.ОбсуждениеHTML.Документ.getElementById("RUNJS");
ДИВ.setAttribute("onclick", ТекстСкрипт);
ДИВ.click();
КонецПроцедуры
# КонецОбласти
где ТекущийПользователь, ПолноеИмяПользователя - реквизиты формы, их определяем при создании формы.
Я эти значения получаю из основной базы данных через Web сервис при пинге соединения.
Данные из мобильного приложения в основную БД уходят / приходят тоже через Web сервис.
Что пытается сделать приведенный выше код - при открытии станицы точки подключения к web чату,
отслеживает что объект CollaborationSystemWebChat1CE инициализировался, после этого чат открывается а пользователю назначается имя и полное имя. В 90% случаев код отрабатывает ).
Далее на стороне сервера заводим служебного пользователя, которого назначаем как участника обсуждения Web чата по умолчанию.
Самые танцевальные танцы начинаются на стороне сервера, который по регламентному заданию обрабатывает все полученные сообщения, распихивает их по нужным документам, чистит системные.
Повесить обработчик на бота, у меня не вышло, так как Процедура ОбработкаСообщенияСистемыВзаимодействия(Сообщение, ДополнительныеПараметры) не взлетело, хотя было все по феншую.
Если будет кому интересно что происходит на стороне сервера в комментах добавлю.
// про PUSH уведомления
при открытии основной формы приложения надо перечитать ключ получателя PUSH уведомлений, который назначит Андроид (речь тут и далее о приложении на нем).
Получение идентификатора подписчика уведомлений
&НаКлиенте
Процедура ПолучитьИдентификаторУведомлений()
#Если МобильныйКлиент Или МобильноеПриложениеКлиент Тогда
Попытка
Идентификатор = ДоставляемыеУведомления.ПолучитьИдентификаторПодписчикаУведомлений();
УстановитьИдентификаторУведомлений(Идентификатор);
Исключение
КонецПопытки;
#КонецЕсли
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УстановитьИдентификаторУведомлений(Идентификатор)
ИдентификаторXML = СериализоватьОбъект(Идентификатор);
Константы.КлючПолучателя.Установить(ИдентификаторXML);
КонецПроцедуры
&НаСервереБезКонтекста
Функция СериализоватьОбъект(Объект) Экспорт
//Преобразуем массив в объект XDTO
ЗначениеВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(Объект);
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
//Записываем объект XDTO в XML строку
ФабрикаXDTO.ЗаписатьXML(Запись, ЗначениеВОбъектеXDTO);
ДанныеXML = Запись.Закрыть(); // документ готов!
Возврат ДанныеXML;
КонецФункции
когда я дергаю Ping сервера, отправляю его в параметрах
Вызов веб сервиса Ping на сервере с параметрами
КлючПолучателя = КлючПолучателя();
ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
Ping = WSПрокси.Ping(ТекущийПользователь, КлючПолучателя);
ОтветСтруктура = ДесериализоватьОбъект(Ping);
Если ТипЗнч(ОтветСтруктура) = Тип("Структура") Тогда
ПроверитьПолноеИмяПользователя(ОтветСтруктура);
Результат = Истина;
Иначе
Ошибка = Ping;
КонецЕсли;
Функция КлючПолучателя()
КлючПолучателя = Константы.КлючПолучателя.Получить();
Возврат КлючПолучателя;
КонецФункции
Функция ДесериализоватьОбъект(ДанныеXML) Экспорт
ЧтениеXMLДанных = Новый ЧтениеXML;
ЧтениеXMLДанных.УстановитьСтроку(ДанныеXML);
Объект = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
ЧтениеXMLДанных.Закрыть();
Возврат Объект;
КонецФункции
Процедура ПроверитьПолноеИмяПользователя(ОтветСтруктура)
Перем ФИО, ИдентификаторПользователяВнешнейСистемы;
ОтветСтруктура.Свойство("ФИО", ФИО);
Если Не ПустаяСтрока(ФИО) Тогда
ПараметрыСеанса.ПолноеИмяПользователя = ФИО;
Константы.ПолноеИмяПользователя.Установить(ФИО);
КонецЕсли;
КонецПроцедуры
На стороне сервера обработка метода Ping веб сервиса:
Обработчик веб сервиса Ping на сервере
Функция Ping(ПользовательИмя, КлючПолучателя)
ПользовательИБ = НайтиПользователя(ПользовательИмя);
Если ПользовательИБ = Неопределено Тогда
Возврат "Не найден пользователь ИБ " + ПользовательИмя;
Иначе
Сотрудник = НайтиСотрдникаПоИдентификаторуПользователя(ПользовательИБ.УникальныйИдентификатор);
Если Сотрудник = Неопределено Тогда
Возврат "Не найден сотрудник пользователя ИБ " + ПользовательИмя;
Иначе
ЗаписатьКлючПолучателя(Сотрудник, КлючПолучателя);
КонецЕсли;
//ТокенДоступаСтрокой = ТокенДоступаСтрокой(ПользовательИБ);
ТокенДоступаСтрокой = "";
Ответ = Новый Структура("ФИО", Строка(Сотрудник));
Ответ.Вставить("ИдентификаторПользователяВнешнейСистемы", ТокенДоступаСтрокой);
ОтветXML = СериализоватьОбъект(Ответ);
Возврат ОтветXML;
КонецЕсли;
Возврат "OK";
КонецФункции
Процедура ЗаписатьКлючПолучателя(Сотрудник, КлючПолучателя)
Если ПустаяСтрока(КлючПолучателя) Тогда
Возврат;
КонецЕсли;
МЗ = РегистрыСведений.GD_КлючиПолучателей.СоздатьМенеджерЗаписи();
МЗ.Сотрудник = Сотрудник;
МЗ.КлючПолучателя = КлючПолучателя;
МЗ.Записать();
КонецПроцедуры
Функция НайтиПользователя(ПользовательИмя) Экспорт
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ПользовательИмя);
Возврат ПользовательИБ;
КонецФункции
Функция НайтиСотрдникаПоИдентификаторуПользователя(УникальныйИдентификатор) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СотрудникиПользователя.Сотрудник КАК Сотрудник
|ИЗ
| РегистрСведений.СотрудникиПользователя КАК СотрудникиПользователя
|ГДЕ
| СотрудникиПользователя.Пользователь.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ";
Запрос.УстановитьПараметр("ИдентификаторПользователяИБ", УникальныйИдентификатор);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Сотрудник;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Токен доступа оказался бесполезен, так как 1С пользователей веб чата не признает как внешних, но код его формирования приведу, вдруг кому надо
Формирование токена доступа
Функция ТокенДоступаСтрокой(ПользовательИБ)
Перем ПользовательСВ;
УстановитьПривилегированныйРежим(Истина);
ТокенДоступаСтрокой = "";
Возврат "";
Попытка
ОтборПользователейСистемыВзаимодействия = Новый ОтборПользователейСистемыВзаимодействия;
ОтборПользователейСистемыВзаимодействия.Внешний = Истина;
ОтборПользователейСистемыВзаимодействия.ПолноеИмя = ПользовательИБ.ПолноеИмя;
ПользователиСВ = СистемаВзаимодействия.ПолучитьПользователей(ОтборПользователейСистемыВзаимодействия);
Если ПользователиСВ.Количество() > 0 Тогда
ПользовательСВ = ПользователиСВ[0];
КонецЕсли;
Если ПользовательСВ = Неопределено Тогда
ПользовательСВ = СистемаВзаимодействия.СоздатьПользователя();
ПользовательСВ.Имя = ПользовательИБ.Имя;
ПользовательСВ.ПолноеИмя = ПользовательИБ.ПолноеИмя;
ПользовательСВ.Внешний = Истина;
ПользовательСВ.Записать();
КонецЕсли;
ИдентификаторПользователяВнешнейСистемы = ПользовательСВ.ИдентификаторПользователяВнешнейСистемы;
Если ИдентификаторПользователяВнешнейСистемы = Неопределено Тогда
Возврат "";
КонецЕсли;
ТокенДоступаСтрокой = СформироватьJWTТокен(ИдентификаторПользователяВнешнейСистемы);
Исключение
ОписаниеОшибки = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("ТокенДоступаСтрокой", УровеньЖурналаРегистрации.Ошибка, , ,ОписаниеОшибки);
Конецпопытки;
Возврат ТокенДоступаСтрокой;
КонецФункции
Функция СформироватьJWTТокен(ИдентификаторПользователя)
АлгоритмПодписи = АлгоритмПодписиТокенаДоступа.HS256;
ТокенДоступа = Новый ТокенДоступа;
ТокенДоступа.Заголовки.Вставить("alg", Строка(АлгоритмПодписи));
ТокенДоступа.Эмитент = "ssl";
ТокенДоступа.КлючСопоставленияПользователя = ИдентификаторПользователя;
ТокенДоступа.ВремяСоздания = ТекущаяУниверсальнаяДата() - Дата(1970, 1, 1, 0, 0, 0);
ТокенДоступа.ВремяЖизни = 3600 * 24;
ТокенДоступа.Идентификатор = Новый УникальныйИдентификатор;
ТокенДоступа.ПолезнаяНагрузка.Вставить("sub", ИдентификаторПользователя);
ТокенДоступа.ПолезнаяНагрузка.Вставить("iat", ТокенДоступа.ВремяСоздания);
ТокенДоступа.Подписать(АлгоритмПодписи, "WebChat");
Возврат Строка(ТокенДоступа);
КонецФункции
Чтобы уходило пуш-уведомление, создал два общих модуля в расширении
GD_СистемаВзаимодействияКлиент
GD_СистемаВзаимодействияСервер
(последний с вызовом сервера)
GD_СистемаВзаимодействияКлиент
Процедура ПриНачалеРаботыСистемы() Экспорт
Если НЕ СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована() Тогда
Возврат;
КонецЕсли;
Обработчик = Новый ОписаниеОповещения("ОбработкаОтправкиСообщения", ЭтотОбъект);
СистемаВзаимодействия.ПодключитьОбработчикПослеОтправкиСообщения(Обработчик);
КонецПроцедуры
Процедура ОбработкаОтправкиСообщения(Сообщение, Обсуждение, ДопПараметры) Экспорт
Перем ОбсуждениеWebChat, Заголовок, КлючПолучателяPUSHУведомлений;
КонтекстОбсуждения = Обсуждение.КонтекстОбсуждения;
Если КонтекстОбсуждения <> Неопределено Тогда
НавигационнаяСсылка = Обсуждение.КонтекстОбсуждения.НавигационнаяСсылка;
КонецЕсли;
// + эта часть кода касается перенаправления сообщений в обсуждении документа в веб чат
Если Не ПустаяСтрока(НавигационнаяСсылка) Тогда
ИдентификаторАвтора = GD_СистемаВзаимодействияСервер.АвторОбсужденияПоНавигационнойСсылке(НавигационнаяСсылка, ОбсуждениеWebChat);
КонецЕсли;
Текст = Сообщение.Текст;
Автор = Сообщение.Автор;
Если ЗначениеЗаполнено(ОбсуждениеWebChat) Тогда
СообщениеСтруктурой = Новый Структура("Автор, Данные, Дата, Действия, Обсуждение, Текст");
ЗаполнитьЗначенияСвойств(СообщениеСтруктурой, Сообщение);
GD_СистемаВзаимодействияСервер.НовоеСообщениеНаОснованииОтправленного(НавигационнаяСсылка,
ОбсуждениеWebChat,
СообщениеСтруктурой,
ИдентификаторАвтора,
Текст,
Заголовок,
КлючПолучателяPUSHУведомлений);
// - эта часть кода касается перенаправления сообщений в обсуждении документа в веб чат
Иначе
КлючПолучателяPUSHУведомлений = GD_СистемаВзаимодействияСервер.КлючПолучателяПоНавигационнойСсылке(НавигационнаяСсылка, Заголовок);
КонецЕсли;
Если Не ПустаяСтрока(КлючПолучателяPUSHУведомлений) Тогда
Попытка
ПолноеИмяПользователя = GD_СистемаВзаимодействияСервер.ПолноеИмяПользователяСВПоИдентификатору(Автор);
Если Не ПустаяСтрока(ПолноеИмяПользователя) Тогда
Текст = ПолноеИмяПользователя + Символы.ПС + Текст;
КонецЕсли;
КлючПолучателя = ДесериализоватьОбъект(КлючПолучателяPUSHУведомлений);
ОтправитьПушУведомление(Заголовок, Текст, КлючПолучателя);
Исключение
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Асинх Процедура ОтправитьПушУведомление(Заголовок, Текст, КлючПолучателя)
Перем ИнформацияОПроблемахОтправкиДоставляемыхУведомлений;
ДанныеАутентификации = ДанныеАутентификацииДоставляемыхУведомлений();
Уведомление = Новый ДоставляемоеУведомление;
Уведомление.Заголовок = Заголовок;
Уведомление.Текст = Текст;
Уведомление.ДатаПоявленияУниверсальноеВремя = УниверсальноеВремя(ТекущаяДата());
Уведомление.Получатели.Добавить(КлючПолучателя);
ОтправкаДоставляемыхУведомлений.Отправить(Уведомление, ДанныеАутентификации, , ,ИнформацияОПроблемахОтправкиДоставляемыхУведомлений);
КонецПроцедуры
Функция ДанныеАутентификацииДоставляемыхУведомлений()
ДанныеАутентификации = "AAAAavfz... ваш очень длинный ключ как получить для андроида есть на ютуб ролики";
Возврат ДанныеАутентификации;
КонецФункции
Функция ДесериализоватьОбъект(ДанныеXML)
ЧтениеXMLДанных = Новый ЧтениеXML;
ЧтениеXMLДанных.УстановитьСтроку(ДанныеXML);
Объект = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
ЧтениеXMLДанных.Закрыть();
Возврат Объект;
КонецФункции
GD_СистемаВзаимодействияСервер
Функция АвторОбсужденияПоНавигационнойСсылке(НавигационнаяСсылка, ОбсуждениеWebChat) Экспорт
ИдентификаторАвтора = РегистрыСведений.GD_ОбсужденияУчастниковWebChat.АвторОбсужденияПоНавигационнойСсылке(НавигационнаяСсылка, ОбсуждениеWebChat);
Возврат ИдентификаторАвтора;
КонецФункции
Функция КлючПолучателяПоНавигационнойСсылке(НавигационнаяСсылка, Заголовок) Экспорт
Перем КлючПолучателя;
ДокументСсылка = ПолучитьСсылкуИзНавигационной(НавигационнаяСсылка);
Если ЗначениеЗаполнено(ДокументСсылка) Тогда
Заголовок = "Заявка № " + Прав(ДокументСсылка.Номер, 6);
КлючПолучателя = КлючПолучателя(ДокументСсылка);
КонецЕсли;
Возврат КлючПолучателя;
КонецФункции
Процедура НовоеСообщениеНаОснованииОтправленного(НавигационнаяСсылка, ОбсуждениеWebChat, Сообщение, ИдентификаторАвтора,Знач Текст = "", Заголовок, КлючПолучателя) Экспорт
ДокументСсылка = ПолучитьСсылкуИзНавигационной(НавигационнаяСсылка);
Если ЗначениеЗаполнено(ДокументСсылка) Тогда
Заголовок = "Заявка № " + Прав(ДокументСсылка.Номер, 6);
КлючПолучателя = КлючПолучателя(ДокументСсылка);
НовоеСообщение = СистемаВзаимодействия.СоздатьСообщение(ОбсуждениеWebChat);
ЗаполнитьЗначенияСвойств(НовоеСообщение, Сообщение, , "Обсуждение" );
НовоеСообщение.Получатели.Добавить(ИдентификаторАвтора);
Если Не ПустаяСтрока(Текст) Тогда
НовоеСообщение.Текст = "К документу № " + ДокументСсылка.Номер + Символы.ПС + Текст;
КонецЕсли;
НовоеСообщение.Записать();
КонецЕсли;
Конецпроцедуры
Функция КлючПолучателя(ДокументСсылка)
Сотрудник = ДокументСсылка.Автор;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| GD_КлючиПолучателей.КлючПолучателя КАК КлючПолучателя
|ИЗ
| РегистрСведений.GD_КлючиПолучателей КАК GD_КлючиПолучателей
|ГДЕ
| GD_КлючиПолучателей.Сотрудник = &Сотрудник";
Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.КлючПолучателя;
КонецЕсли;
Возврат ДокументСсылка.КлючПолучателяPUSHУведомлений;
КонецФункции
Функция ПолучитьСсылкуИзНавигационной(НС)
Если ПустаяСтрока(НС) Тогда
Возврат Неопределено;
КонецЕсли;
ПерваяТочка = Найти(НС, "e1cib/data/");
ВтораяТочка = Найти(НС, "?ref=");
ПредставлениеТипа = Сред(НС, ПерваяТочка + 11, ВтораяТочка - ПерваяТочка - 11);
ШаблонЗначения = ЗначениеВСтрокуВнутр(ПредопределенноеЗначение(ПредставлениеТипа + ".ПустаяСсылка"));
ЗначениеСсылки = СтрЗаменить(ШаблонЗначения, "00000000000000000000000000000000", Сред(НС, ВтораяТочка + 5));
Ссылка = ЗначениеИзСтрокиВнутр(ЗначениеСсылки);
Возврат Ссылка;
КонецФункции
Функция ПолноеИмяПользователяСВПоИдентификатору(Идентификатор) Экспорт
ПолноеИмя = "";
ПользовательСистемыВзаимодействия = СистемаВзаимодействия.ПолучитьПользователя(Идентификатор);
Если ПользовательСистемыВзаимодействия <> Неопределено Тогда
ПолноеИмя = ПользовательСистемыВзаимодействия.ПолноеИмя;
КонецЕсли;
Возврат ПолноеИмя;
Конецфункции
Регистр GD_КлючиПолучателей
Туда мы пишем ключ получателя от андроида, который получили в приложении.
Плюс в модуле управляемого приложения добавляем
&После("ПриНачалеРаботыСистемы")
Процедура GD_ПриНачалеРаботыСистемы()
GD_СистемаВзаимодействияКлиент.ПриНачалеРаботыСистемы();
КонецПроцедуры