Асинхронный вызов клиентской процедуры из серверной
Для чего может понадобиться.
1. Печать на принтер документа из http,web – сервисов.
2. Открытие форм из http,web – сервисов. Например, открыть карточку клиента при входящем звонке.
3. Различного рода оповещения при проведении документов (не только из формы но из журнала по правой кнопке мыши), например, при ошибках проведения оповещать ответственного менеджера.
- Описание
- Подробнее
Описание
1. Для чего может понадобиться.
- Печать на принтер документа из http,web – сервиса, как пример нужно печатать этикетки со стороннего вэб приложения.
- Открытие форм из http,web – сервисов. Например, открыть карточку клиента при входящем звонке.
- Различного рода оповещения при проведении документов, например, при ошибках проведения оповещать ответственного менеджера.
2. Используемые инструменты
- Подключенная система взаимодействия.
3. Недостатки
- Данный метод можно использовать для асинхронного использования, т.е. ответа от клиента по результатам выполнения не будет.
Предварительно нужно подключить систему взаимодействия https://its.1c.ru/db/v8311doc#bookmark:dev:TI000001900
Реализация
Создадим обсуждение, в котором будут храниться наши сообщения для клиента
&НаСервере
Процедура СоздатьСлужебныйЖурналЗвонковСистемыВзаимодействия() Экспорт
ОбсуждениеЖурналИдентификатор = Неопределено;
#Если НЕ ВнешнееСоединение Тогда
Ключ = "ТестовоеОбсуждение";
ОбсуждениеЖурнал = СистемаВзаимодействия.СоздатьОбсуждение();
ОбсуждениеЖурнал.Ключ = Ключ;
ОбсуждениеЖурнал.Отображаемое = Ложь;
ОбсуждениеЖурнал.Заголовок = НСтр("ru='Журнал тест'");
ОбсуждениеЖурнал.Участники.Добавить(СистемаВзаимодействия.СтандартныеПользователи.ВсеПользователиПриложения);
УстановитьПривилегированныйРежим(Истина);
Попытка
ОбсуждениеЖурнал.Записать();
ОбсуждениеЖурналИдентификатор = ОбсуждениеЖурнал.Идентификатор;
Исключение
ЗаписьЖурналаРегистрации(НСтр("ru='Создание служебного обсуждения Системы взаимодействия'"), УровеньЖурналаРегистрации.Ошибка,, Ключ, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
УстановитьПривилегированныйРежим(Ложь);
#КонецЕсли
КонецПроцедуры
в месте серверной процедуры откуда нужно запустить клиентскую вызываем ОтправитьВКлиентскоеПриложение(параметр1,параметр2)
&НаСервере
процедура ОтправитьВКлиентскоеПриложение(параметр1,параметр2)
ИдОбсуждения = ИдентификаторОбсуждения();
Если ИдОбсуждения <> Неопределено Тогда
ДанныеСообщения = СтрШаблон("param1=""%1"";param2=""%2""", параметр1,параметр2);
СообщениеОбсуждения = СистемаВзаимодействия.СоздатьСообщение(ИдОбсуждения);
СообщениеОбсуждения.Данные = ДанныеСообщения;
СообщениеОбсуждения.Получатели.Добавить(СистемаВзаимодействия.ПолучитьИдентификаторПользователя
(пользователи.АвторизованныйПользователь().ИдентификаторПользователяИБ));
СообщениеОбсуждения.Записать();
КонецЕсли;
конецпроцедуры
&НаСервере
Функция ИдентификаторОбсуждения() Экспорт
ОбсуждениеИдентификатор = Неопределено;
#Если НЕ ВнешнееСоединение Тогда
Ключ = "ТестовоеОбсуждение";
Если НЕ СистемаВзаимодействия.ИнформационнаяБазаЗарегистрирована() Тогда
Возврат ОбсуждениеИдентификатор;
КонецЕсли;
Обсуждение = Неопределено;
УстановитьПривилегированныйРежим(Истина);
Попытка
Обсуждение = СистемаВзаимодействия.ПолучитьОбсуждение(Ключ);
Исключение
ЗаписьЖурналаРегистрации(НСтр("ru='Поиск обсуждения Системы взаимодействия по ключу'"), УровеньЖурналаРегистрации.Ошибка,, Ключ, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
УстановитьПривилегированныйРежим(Ложь);
Если Обсуждение <> Неопределено Тогда
ОбсуждениеИдентификатор = Обсуждение.Идентификатор;
КонецЕсли;
#КонецЕсли
Возврат ОбсуждениеИдентификатор;
КонецФункции
Далее что бы клиент видел сообщения — в глобальном модуле объявляем и запускаем ПодключитьОбработчикНовыхСообщенийСистемыВзаимодействия() при начале работы системы
Процедура ПодключитьОбработчикНовыхСообщенийСистемыВзаимодействия() Экспорт
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработчикНовогоСообщенияОбсуждениеЖурнал", МодульКлиент);
СистемаВзаимодействия.НачатьПодключениеОбработчикаНовыхСообщений(,
ИдентификаторОбсуждения(),
ОписаниеОповещения
);
КонецПроцедуры
далее в модуле модульклиент определяем экспортную процедуру, которая будет вызывать логику клиентской части.
&НаКлиенте
Процедура UNF_PH_ОбработчикНовогоСообщенияОбсуждениеЖурнал(Сообщение, ДополнительныеПараметры)
Если ТипЗнч(Сообщение.Данные) <> Тип("Строка") Тогда
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Сообщение.Данные) Тогда
Возврат;
КонецЕсли;
ДанныеОповещения = СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(Сообщение.Данные);
если ДанныеОповещения.свойство("param1") и ДанныеОповещения.свойство("param2") тогда
//ПечатьЭтикетки, открытие формы, в общем любое клиентское действие
конецесли;
КонецПроцедуры