Отправка сообщения активным пользователям

Печать (Ctrl+P)

Вывести сообщение всем активным пользователям системы 1С:Предприятие является простой задачей, имеющей практическое значение .

Для вывод сообщения текущего пользователя используется метод Сообщить :

 Сообщить (<Текст сообщения>, <Статус>) 

Однако, не существует метод глобального контекста для отправки сообшения всем активным пользователям .

Для рещения задачи нужно создать обрабочик ожидания события внутри процедуры ПриНачалеРаботыСистемы() в модуле управляемого приложения в процедуре:

  ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>,  <Однократно>) 

Данная предопределенная процедура модуля управляемого приложения подключает указанную процедуру <ИмяПроцедуры> в качестве обработчика ожидания. Процедура будет вызываться в период ожидания системы каждый раз по истечению указанного интервала времени.

Процедура ПриНачалеРаботыСистемы()
 ПодключитьОбработчикОжидания("ВывестиСообщенияПользователям",10);
 КонецПроцедуры

 Процедура ВывестиСообщенияПользователям() Экспорт
 _ДополнительныйМодуль.ВывестиСообщения();
 КонецПроцедуры

Для хранения сообщения пользователям я создал регистр сведений в конфигурации:

Процедура ВывестиСообщения я поместил в общем модуле _ДополнительныйМодуль:

Процедура ВывестиСообщения() Экспорт
 Запрос = Новый Запрос;
 Запрос.Текст ="ВЫБРАТЬ
     |    СообщенияПользователям.Пользователь КАК Пользователь,
     |    СообщенияПользователям.ТекстЗаголовка КАК ТекстЗаголовка,
     |    СообщенияПользователям.ТекстСообщения КАК ТекстСообщения 
    |ИЗ 
    |    РегистрСведений._СообщенияПользователям КАК СообщенияПользователям";
 РезультатЗапроса = Запрос.Выполнить();
 Выборка = РезультатЗапроса.Выбрать();
 Пока Выборка.Следующий() Цикл
     СоообщениеВыведено = ВывестиСообщениеПользователю(Выборка.Пользователь, Выборка.ТекстЗаголовка, Выборка.ТекстСообщения);
     Если СоообщениеВыведено Тогда  
       Попытка
             НаборЗаписей = РегистрыСведений._СообщенияПользователям.СоздатьНаборЗаписей();             НаборЗаписей.Отбор.Пользователь.Установить(Выборка.Пользователь);             НаборЗаписей.Записать();
         Исключение 
        КонецПопытки; 
    КонецЕсли; 
   КонецЦикла;
 КонецПроцедуры
 Функция ВывестиСообщениеПользователю(Получатель,ТекстЗаголовка,ТекстСообщения) 
 Если ПользователиИнформационнойБазы.ТекущийПользователь().ПолноеИмя=Получатель.Наименование Тогда 
 Shell= Новый COMОбъект("Wscript.Shell");     Shell.Popup(ТекстСообщения,30, ТекстЗаголовка, 4+16);
 Возврат Истина;
 КонецЕсли;
 Возврат Ложь;
 КонецФункции

Для вывода сообщения я использую метод Popup объекта Wscript.Shell :

Popup(<ТекстСообщения>, <ВремяЗадержки>, <ТексЗаголовка>, <КнопкаИконка>)


Выводит в окне текстовое сообщение. Возвращает код нажатой кнопки. Возможные значения: -1 – таймаут; 1 – OK; 2 – Cancel; 3 – Abort; 4 – Retry; 5 – Ignore; 6 – Yes; 7 – No;
Метод объединяет в себе функционал стандартных методов 1С Предупреждение() и Вопрос(). Описание объекта Wscript.shell, его своиств и методов можно посмотреть в документации к Microsoft Win32.

 Теперь нам понадобится создать форму обработки отправки, например:

Програмнный код модули формы обработки показан в следующем фрагменте:

&НаСервере
 Процедура ОтправитьНаСервере()
     Запрос = Новый Запрос; 
    Запрос.Текст =      "ВЫБРАТЬ  
   |   Пользователи.Ссылка КАК Ссылка 
    |ИЗ
     |   Справочник.Пользователи КАК Пользователи
     |ГДЕ 
    |   Пользователи.Ссылка <> &ТекущийПользователь";  Запрос.УстановитьПараметр("ТекущийПользователь",Пользователи.ТекущийПользователь());
     РезультатЗапроса = Запрос.Выполнить();
     ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл  
        Запись= РегистрыСведений._СообщенияПользователям.СоздатьМенеджерЗаписи();         Запись.ТекстЗаголовка = ТекстЗаголовка;
         Запись.ТекстСообщения =  ТекстСообщения;         Запись.Пользователь =  ВыборкаДетальныеЗаписи.Ссылка;         Запись.Записать(); 
    КонецЦикла;
 КонецПроцедуры

 &НаКлиенте
 Процедура Отправить(Команда)
     Если не ЗначениеЗаполнено(ТекстСообщения)  Тогда
     Сообщить("ТекстСообщения не заполнено"); 
    возврат; КонецЕсли; 
 ОтправитьНаСервере(); 
ПоказатьПредупреждение(," Сообщение отправлено") ; 
     Закрыть();
 КонецПроцедуры
0

Автор публикации

не в сети 3 недели

master1c8

0
Комментарии: 13Публикации: 426Регистрация: 25-12-2016

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.