Информирование пользователя. Работа с объектом «СообщениеПользователю»

Публикация № 1004554

Программирование - Практика программирования

вывод сообщения пользователю показать оповещение пользователя состояния предупреждение

172
Различные варианты и нюансы использования объекта СообщениеПользователю и другие способы информирования пользователя: без привязки к какой-либо форме и с выводом сообщения в отдельном окне.

Объект «СообщениеПользователю» пришел на замену команды «Сообщить», которая использовалась в обычном интерфейсе, и перешла в управляемый. Команда удобна своей простотой и тем, что она, в отличии от других вариантов оповещения пользователя, доступна как на клиенте так и на сервере. На данный момент команда является устаревшей и ее не рекомендуется применять для управляемого интерфейса.

Объект «СообщениеПользователю» более громоздкий, но имеет ряд дополнительных возможностей, о которых и пойдет речь в данной статье. Объект можно использовать только для управляемого интерфейса.

Объект также можно использовать как на клиенте так и на сервере. Основным преимуществом перед командой «Сообщить», является возможность привязки сообщений к реквизитам формы. Дополнительно, при нажатии на текст сообщения, можно открывать новую форму с привязкой сообщения к ее реквизитам. Однако, следует понимать, что основным назначением объекта является информирование об ошибках, так как сообщение, привязанное к реквизитам формы всегда имеет заголовок  «Ошибка»:

Сообщение пользователю об ошибке

Рассмотрим различные варианты использования объекта «СообщениеПользователю».

 

Вариант 1. Вывод сообщения в текущую активную форму с привязкой к ее элементам

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Сообщение";
Сообщение.Поле = "Объект.Наименование";
Сообщение.Сообщить();

Поле – путь к реквизиту, к которому необходимо привязать сообщение. Путь к реквизитам объекта формы необходимо указывать задав ключевое слово «Объект». Путь к остальным реквизитам формы указывается просто, в виде наименования реквизита:

Сообщение.Поле = "РеквизитФормы";

Можно прикрепить сообщение к строке табличной части объекта:

Сообщение.Поле = "Объект.Товары[1].Номенклатура";

Следует иметь в виду, что сообщение всегда выводится в текущую активную форму. Даже в том случае, если сообщение формируется в другой форме, но она еще не открыта.

Например, при обработке события формы «ПриОткрытии» можно выполнить проверку некоторого условия и выводить сообщение об ошибке не открывая форму. Сообщение будет выведено в форму из которой выполнялось открытие новой формы.

 

Вариант 2. Вывод сообщения в текущую активную форму с привязкой к элементам дополнительной формы

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Сообщение";
Сообщение.Поле = "Наименование";
Сообщение.КлючДанных = Объект.Склад;
Сообщение.ПутьКДанным = "Объект";
Сообщение.Сообщить();

Поле – наименование реквизита без указания ключевого слова «Объект».

КлючДаных – ссылка на объект дополнительной формы, к реквизиту которой требуется привязать сообщение. Система попробует найти открытую форму по значению стандартного параметра формы «Ключ». Если форма не будет найдена, будет открыта новая.

ПутьКДанным – имя основного реквизита формы, через который можно получить доступ к реквизитам объекта.

В данном варианте использования, сообщение можно привязать только к реквизитам объекта формы.

 

Вариант 3. Вывод сообщения в форму, которая не является активной

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", Объект.ОсновнойДоговор);
Форма = ОткрытьФорму("Справочник.Договоры.ФормаОбъекта",
ПараметрыФормы, ЭтаФорма);

Сообщение = Новый СообщениеПользователю;
Сообщение.ИдентификаторНазначения = Форма.УникальныйИдентификатор;
Сообщение.Текст = "Сообщение";
Сообщение.Поле = "Объект.Наименование";
Сообщение.Сообщить();

УникальныйИдентификатор – уникальный идентификатор формы, в которой будет выведено сообщение.

Сообщение может быть привязано как к реквизитам объекта, так и к остальным реквизитам формы.

 

Вариант 4. Совмещение второго и третьего вариантов. Вывод сообщения не в текущую форму, с привязкой к реквизиту в третьей форме

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", Объект.Контрагент);
Форма = ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы, ЭтаФорма);

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Текст сообщения";
Сообщение.ИдентификаторНазначения = Форма.УникальныйИдентификатор;
Сообщение.Поле = "Наименование";
Сообщение.КлючДанных = Объект.Договор;
Сообщение.ПутьКДанным = "Объект";
Сообщение.Сообщить();

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

 

Вариант 5. Вывод сообщения из модуля объекта

Для вывода сообщения из модуля объекта, можно использовать следующий синтаксис:

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Текст сообщения";
Сообщение.Поле = "Наименование";
Сообщение.КлючДанных = Ссылка;
Сообщение.ПутьКДанным = "Объект";
Сообщение.Сообщить();

Сообщение будет выведено и привязано к реквизитам корректно, причем параметры: «КлючДанных» и «ПутьКДанным» можно опустить, указав в параметре «Поле» полный путь к данным формы. 

Важно. Без указания параметров: «КлючДанных» и «ПутьКДанным» сообщение будет привязано к реквизитам формы только в том случае, если форма объекта открыта и является активной . Однако, код процедуры модуля объекта может быть выполнен и без открытия формы. В этом случае сообщение будет выведено в текущей активной форме. И, чтобы при нажатии на тексте сообщения, открывалась форма объекта с привязкой сообщения к реквизитам формы (например при проведении документа из формы списка), должны быть заполнены параметры: «КлючДанных» и «ПутьКДанным». Параметр «Поле» в этом случае, должен содержать наименование реквизита объекта.

Также, как и на клиенте, есть возможность привязать сообщение к реквизитам формы объекта, который не является текущим. Для этого необходимо присвоить параметру «КлючДанных» ссылку на объект:

Сообщение.КлючДанных = ОсновнойДоговор;

В этом случае, будет открыта новая форма, по указанному ключу (ссылке) и сообщение будет привязано к ее реквизитам.

Однако, в модуле объекта, более корректно использовать метод объекта «УстановитьДанные» с указанием объекта, к которому требуется привязать сообщение:

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Текст сообщения";
Сообщение.Поле = "Наименование";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();

По своей сути, данный метод устанавливает значения для параметров: «КлючДанных» и «ПутьКДанным». Ключу данных будет присвоена ссылка на объект, а вот установка параметра «ПутьКДанным» происходит несколько сложнее. Дело в том, что работа с объектом может производится из разных форм. Имя основного реквизита формы, в общем случае, может отличатся от стандартного «Объект». Метод «УстановитьДанные» определяет имя основного реквизита формы по установленному соответствию. Причем, при записи объекта это соответствие устанавливается автоматически. В тех случаях, когда автоматического сопоставления нет, его необходимо указать явно с помощью метода «УстановитьСоответствиеОбъектаИРеквизитаФормы». Например, необходимо выполнить какие-либо действия с объектом, привязанным к текущей форме, и вывести в процессе этих действий сообщение:

//Серверная процедура в модуле  формы
&НаСервере
Процедура ОбработкаОбъекта()
       КонтрагентОбъект = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Контрагенты"));
       УстановитьСоответствиеОбъектаИРеквизитаФормы (КонтрагентОбъект, "Объект");
       КонтрагентОбъект.ВыполнитьРаботуСОбъектом();
КонецПроцедуры
 
//Процедура в модуле объекта
Процедура ВыполнитьРаботуСОбъектом() Экспорт
      ……

      Сообщение = Новый СообщениеПользователю;
      Сообщение.Текст = "Текст сообщения";
      Сообщение.Поле = "Наименование";
      Сообщение.УстановитьДанные(ЭтотОбъект);
      Сообщение.Сообщить();
КонецПроцедуры

 

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

Следует иметь в виду, что сообщения, выведенные командой «Сообщить» или через объект «СообщениеПользователю» всегда привязаны к какой-либо форме. Если после вывода сообщения форма закрывается, пользователь не сможет его прочитать. В данном случае удобнее использовать другие методы глобального контекста: «ПоказатьОповещениеПользователю» или «Состояние». Вызов методов возможен только на клиенте.

Метод «ПоказатьОповещениеПользователю» выводит всплывающее оповещение в нижний часть экрана, которое не привязано к какой-либо открытой форме:

Вывод оповещения пользователю

Синтаксис метода в справке:

ПоказатьОповещениеПользователя(<Текст>, 
                               <ДействиеПриНажатии>, 
                               <Пояснение>, 
                               <Картинка>, 
                               <СтатусОповещенияПользователя>, 
                               <КлючУникальности>)

Первый параметр «Текст» вводит в заблуждение, на самом деле – это заголовок окна оповещения.

Второй параметр «ДействиеПриНажатии» может содержать либо навигационную ссылку, по которой необходимо перейти при нажатии на сообщении, либо описание процедуры оповещения.

Параметр «Пояснение» - это как раз текст оповещения.

Дополнительно, есть возможность вывести картинку, указать важность оповещения и задать ключ уникальности для поиска уже открытых оповещений. 

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

Команда «Состояние» выводит информацию в специальную панель состояния. Ее следует использовать для информирования пользователя о ходе выполнения кого либо действия. Дополнительно есть возможность показать прогресс выполнения:

Состояние(«Выполнение операции, 50, «Операция выполняется»);

Вывод состояния с прогресом

 

Вывод сообщения пользователю в отдельном окне

В некоторых случаях требуется вывести сообщение пользователю в отдельном окне. Для этой цели можно использовать как собственную разработанную форму, так и не модальный метод глобального контекста «ПоказатьПредупрежедение». (В отличие от модальных методов, данный не ожидает выполнения действия с формой, а продолжает выполнение программного кода). Вызов метода возможен только на клиенте

В качестве первого параметра необходимо указать процедуру - описание оповещения. В качестве второго – текст выводимого сообщения. Причем, в качестве текста сообщения можно использовать форматированную строку. Это позволяет вывести в тексте сообщения ссылку на какой-либо объект:

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


&НаКлиенте
Процедура ПредупрежедениеЗавершение(Параметры) Экспорт
       //Обработка закрытия предупреждения
КонецПроцедуры    

Вывод предупреждения      

 

Если информация оказалась для Вас полезной, ставьте звездочку J

 

Другие мои статьи про механизмы платформы 1С

  1. Автоматические и управляемые блокировки. Разделение итогов

 

172

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. FesenkoA 36 15.02.19 11:04 Сейчас в теме
Вот такие статьи я люблю. Вроде какая то фигня о сообщениях, но раскрывается потенциал платформы!
Кстати у нас работает обработчик ожидания, который проверяет сообщения в рег.сведений. И новые выводит как "ПоказатьОповещениеПользователю". При том что сами записи в регистр создаются при создании нового тикета, новой заявки или вручную из любого документа другим пользователем или рег.заданием. Немного раздражает что приходится каждые 20 сек дергать сервер. Может у вас есть опыт работы с этим и подскажете более элегантное решение?
TreeDogNight; gradi; rpgshnik; +3 Ответить
3. Goleff74 147 15.02.19 12:23 Сейчас в теме
(1)
Сервер взаимодействия
6. pbabincev 112 17.02.19 01:32 Сейчас в теме
(1)
Сервер взаимодействия на раз решает это
9. Roin2512 26 20.02.19 11:52 Сейчас в теме
(1)Глянте в сторону подписок на события
13. FesenkoA 36 20.02.19 13:23 Сейчас в теме
(9)Подписка на событие, при записи - все едино. Есть пользователь ШЕФ, он сидит в отчетах,или вообще ничего не делает, и пользователи 1,2,3...н, которые создают заявки. Заявка создана - у шефа уведомление. То есть разные клиентские сеансы.
15. ids79 1839 20.02.19 16:58 Сейчас в теме
(13)Наверно только сервер взаимодействия
18. FesenkoA 36 20.02.19 17:39 Сейчас в теме
(15)Сейчас бы я ее так бы и решил ) Но когда ее проектировали СВ то ли не было, то ли в какой то глубокой бете был...
2. mifka186 6 15.02.19 11:20 Сейчас в теме
Команда удобна своей простатой

Наверное простотой?
YPermitin; TreeDogNight; accounting_cons; kuzyara; Ibrogim; nbondarenko; mrmasson; catv; +8 Ответить
4. ids79 1839 15.02.19 12:44 Сейчас в теме
5. NeviD 15.02.19 13:32 Сейчас в теме
В БСП есть функция ОбщегоНазначенияКлиентСервер.СообщитьПользователю() - интерфейс над объектом СообщениеПользователю.
Удобно использовать, к тому же рекомендуется в стандартах: https://its.1c.ru/db/v8std#content:2149184067:hdoc
TreeDogNight; Somebody1; yufan; MCV; sm.artem; WhiteOwl; jif; +7 Ответить
22. ids79 1839 23.02.19 12:58 Сейчас в теме
(5)Спасибо за дополнение.
Можно пользоваться и этой процедурой или "СообщитьПользователюВФорму".
Но ничего нового они не добавляют, и не упрощают ввод, на мой взгляд.
Да и результат будет зависеть от того, что разработчики решат сделать в конкретном релизе.
По мне, удобнее использовать сам объект.
7. the1 343 18.02.19 09:10 Сейчас в теме
Срочно внести в Синтакс-помощник!
8. Inziya 20.02.19 06:46 Сейчас в теме
Спасибо! Все понятно и подробно описано.
14. ids79 1839 20.02.19 16:52 Сейчас в теме
10. Дмитрий74Чел 103 20.02.19 11:59 Сейчас в теме
Неточности:
Путь к реквизитам объекта формы необходимо указывать задав ключевое слово «Объект».
Сообщение.Поле = "Объект.Товары[1].Номенклатура";

"Объект" - обычно такое имя задано у ключевого реквизита формы документа или справочника. Но формы бывают и другие.И Имя реквизита может быть не "Объект", а например, "Список".
Лучше написать "Путь к реквизитам, подчиненным основному реквизиту формы, необходимо прописывать указывая "полный путь" с имением основного реквизита, например...".
16. ids79 1839 20.02.19 17:01 Сейчас в теме
(10)Согласен, может быть и другой основной реквизит формы.
11. Дмитрий74Чел 103 20.02.19 12:12 Сейчас в теме
Вообще, идентичны варианты
Сообщение.Поле = "Наименование";
Сообщение.ПутьКДанным = "Объект";

и
Сообщение.Поле = "Объект.Наименование";


А еще не слова не сказано про типовые процедуры. Я сторонник всегда использовать типовой функционал. Вот как обычно в типовых используют СообщениеПользователю:
//в модуле объекта [внимание: взводит флаг Отказ (если передан)]
	ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Текст ошибки",                
								ЭтотОбъект,//КлючДанных (ссылка на объект или ключ записи регистра), нужен при вызове не из формы
								"Договор", //Поле (наименование реквизита формы)
								,		   //ПутьКДанным (путь к реквизиту формы)
								Отказ);
//в форме объекта
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Дублирование пременной'"),
								,
								"Запросы["+ИдентификаторСтроки+"].ИмяПеременнойЗапроса",//таблица Запросы, строка ИдентификаторСтроки, колонка ИмяПеременнойЗапроса
								"Объект", //у какого реквизита формы искать поле, указанное выше
								 Отказ);
Показать
17. ids79 1839 20.02.19 17:05 Сейчас в теме
(11)
Вообще, идентичны варианты

Не всегда.
Если сообщение необходимо привязать к реквизитам формы, которая закрыта, только первый вариант можно использовать.
Если выводить сообщение в текущую форму, разницы нет.
12. herfis 278 20.02.19 12:22 Сейчас в теме
Может автор подскажет, есть ли возможность вывести сообщение из модуля проведения документа в привязке к форме списка, из которой этот документ проводится? В свое время у меня это не получилось, хотя перепробовал вроде все варианты.
Да и вообще в принципе хоть как-то отобразить сообщения из модуля проведения документа при проведении документа из списка без открытия его формы.
19. ids79 1839 22.02.19 11:07 Сейчас в теме
(12)Просто вывести сообщение в форме списка очень просто, так как сообщение сформированное в модуле документа будет выведено в текущем активном окне.
А вот привязать его к реквизитам формы списка не получится, только к реквизитам формы документа.
20. herfis 278 22.02.19 12:16 Сейчас в теме
(19)
Просто вывести сообщение в форме списка очень просто, так как сообщение сформированное в модуле документа будет выведено в текущем активном окне.

Вы правы. Это я напутал уже за давностью.
Проблема возникает при нажатии дефолтной кнопки "Провести и закрыть" в открытой форме документа.
В этом случае сообщение из модуля проведения адресуется форме документа, которая сразу же закрывается и пользователь в результате сообщения не видит.
Не получалось переадресовать это сообщение из формы документа в форму списка, из которого она открывалась.
21. ids79 1839 23.02.19 12:51 Сейчас в теме
(20)Я в статье писал про этот момент с закрытием форм с сообщением.
Из модуля объекта вывести такое сообщение, я думаю, не получится.
Если из клиентской процедуры формы, например "При записи" можно попробовать, передав идентификатор формы списка.
Оставьте свое сообщение