gifts2017

Как выдать сообщение всем пользователям (для управляемого приложения)

Опубликовал Никита Долгих (Nik_1c_bitrix) в раздел Программирование - Практика программирования

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

Итак нам понадобится организовать сторону отправителя и сторону получателей сообщения.

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

Код формы:

 

&НаСервереБезКонтекста
Процедура ОтправитьНаСервере(Сообщение)
Константы._Сообщение.Установить(Сообщение);
КонецПроцедуры

&НаКлиенте
Процедура Отправить(Команда)
гПользовательОтправляющий = ИмяПользователя();
ОтправитьНаСервере(Сообщение);
Сообщение=""; 
КонецПроцедуры


 

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

При старте системы необходимо очистить константу, хранящую выводимое сообщение, иначе при входе система будет выдавать последнее отправленное сообщение, что нужно не всегда. Там же подключаем обработчик ожидания, запускающий процедуру проверки: "Не нужно ли выдать сообщение".

При чем, сообщение не должно выводится отправляещему пользователю. В моём случае оно должно "висеть" пока пользователь его не закроет, за это отвечает второй параметр метода "Предупреждение".

Если программа будет свернута в момент получения сообщения, то предупреждение выйдет на экран и в этом случае, если, конечно, ваш пользователь в этот момент не будет активно "работать" в браузере:), в этом случае он может его просто не заметить, перекрыв окно браузером.

 

Перем гСообщение Экспорт;
Перем гПользовательОтправляющий Экспорт;
///////////////////////////////////////////////////////////////////////////////////////////
Процедура ПриНачалеРаботыСистемы()
гСообщение = Доработки.ПолучитьЗначениеКонстанты();
ПодключитьОбработчикОжидания("ПрочитатьСообщение", 1);
... 

Процедура ПрочитатьСообщение() Экспорт 
Сообщение = Доработки.ПолучитьЗначениеКонстанты();
Если ЗначениеЗаполнено(Сообщение) Тогда
Если Сообщение <> гСообщение Тогда 
гСообщение = Сообщение; 
Если гПользовательОтправляющий<>ИмяПользователя() Тогда
Предупреждение(Сообщение,0); 
Иначе
ПоказатьОповещениеПользователя("Сообщение отправлено: 
|"+Сообщение);
КонецЕсли;
КонецЕсли;
КонецЕсли; 
КонецПроцедуры


Для получения и установки значения константы. Необходимо добавить общий модуль с установленными свойствами: Сервер,ВызовСервера. У меня он называется "Доработки". Его код:

 

Функция ПолучитьЗначениеКонстанты() Экспорт 
Возврат Константы._Сообщение.Получить(); 
КонецФункции

Процедура УстановитьЗначениеКонстанты(Строка) Экспорт 
Константы._Сообщение.Установить(Строка); 
КонецПроцедуры


И последний нюанс. Создать константу "_Сообщение" с типом "Строка".


См. также

Подписаться Добавить вознаграждение
Комментарии
1. Алексей (Alexey_) 05.03.15 09:46
Ситуация: в базе находятся не все пользователи или вообще никого, устанавливаем значение константы, сразу же заходит какой-то пользователь и стирает значение в константе
Доработки.УстановитьЗначениеКонстанты("");

и никто не прочитает "сообщение"
sergelemon; ded00786; Fox-trot; +3 Ответить 1
2. Алексей Ко (Жолтокнижниг) 06.03.15 09:58
В 1с появился спящий режим и таким подходом мы убиваем этот функционал. Надо придумывать что - то новое.
3. Никита Долгих (Nik_1c_bitrix) 06.03.15 14:07
(2) Жолтокнижниг, это в зависимости от того какая стоит задача. Продолжать спать или проснуться.
4. Никита Долгих (Nik_1c_bitrix) 06.03.15 14:10
(1) Alexey_, исправил. Строку очищающую константу заменил на гСообщение = Доработки.ПолучитьЗначениеКонстанты();
Спасибо за внимание к статье.
5. Илья Галицков (galich) 06.03.15 16:10
На большом количестве пользователей проблемы с блокировками таблицы констант обеспечены.
6. Никита Долгих (Nik_1c_bitrix) 06.03.15 16:39
(5) galich, даже при условии что отправлять имеет право только 1 пользователь?
7. Кирилл Бондаренко (karapuzzzz) 11.03.15 13:26
Зачем Константа? Если пользователь захочет отправить еще одно сообщение, то предыдущее уже никто не увидит. Регистр сведений с данными:
Измерения:
    Получатель - Справочник.Пользователи
    Отправитель - Справочник.Пользователи
    Сообщение - Строка(150)
    Дата - ДатаВремя
Сообщение в измерениях, чтобы реализовать возможность отправки нескольких сообщений от одного отправителя одному адресату.

Создать такой регистр вместо константы и реализовать обмен сообщениями. Сложность не особо возрастет, а эффект будет огромный.
8. Константин Юрин (kostyaomsk) 11.03.15 20:58
Не понял, это опять конфу править с Вашей константой?
9. Дмитрий Смирнов (dimassm) 12.03.15 10:21
Ну т.е. обработчик ожидания с таймингом 1 сек это вообще очень круто
10. Никита Долгих (Nik_1c_bitrix) 12.03.15 13:37
(7) karapuzzzz, читайте внимательно поставленную задчу: "Как вывести сообщение всем активным пользователям системы 1С:Предприятие". Ваш вариант: А если нужно выводить сообщение не только активным а всем, тогда...
11. Никита Долгих (Nik_1c_bitrix) 12.03.15 13:39
(8) kostyaomsk, что вы имеете в виду? Программирование при помощи мантр или заклинаний , тогда конфу править не нужно? Или что-то другое?
12. Никита Долгих (Nik_1c_bitrix) 12.03.15 13:42
(9) dimassm, Ваше право поставить любое другое значение, которое вас будет устраивать. Я писал под конфигурацию в которой уже есть один обработчик ожидания, с интервалом в секунду, поэтому механизм просто туда добавлен.
13. евг волк (ben19791010) 18.03.15 05:25
(12) Nik_1c_bitrix, Спасибо. А то на УФ для файловых не получилось сделать.
14. Павел Колмаков (Stim213) 23.03.15 10:20
эхх. ожидал что-то крутое, без изменения конфигурации, а тут константа с обработчиком ожидания((

15. kirk kirk (kirk_ufa) 26.03.16 15:01
почему-то не работает. если у общего модуля проставить только галки Сервер,ВызовСервера, при вызове из модуля управляемого приложения пишет что Переменная не определена. если поставить галку клиента, то соответственно весь модуль не работает т.к. сделан под сервер, но в модуле управляемого приложения ошибок нет - он его находит.
з.ы. похоже это из-за галки "глобальный"