Оповещение пользователю в 1С показывают методом ПоказатьОповещениеПользователя(): в правом нижнем углу экрана появляется окно с текстом, пояснением и картинкой, которое не нужно закрывать — оно исчезает само. Щелчок по нему открывает документ, список или отчёт либо вызывает вашу процедуру. Метод есть только на клиенте, поэтому после серверного вызова или фонового задания оповещение показывают клиентским кодом, когда результат уже вернулся. Ниже — все шесть параметров, отличие от Сообщить и ПоказатьПредупреждение и готовые процедуры для трёх сценариев.
Типовые конфигурации делают так постоянно. В форме заказа клиента УТ 11.4 после расчёта скидок на сервере появляется оповещение «Скидки (наценки)» с пояснением «Скидки (наценки) рассчитаны». БСП сообщает об установленном обновлении программы важным оповещением с ключом уникальности и ссылкой e1cib/app/ОбщаяФорма.КонтрольДинамическогоОбновления.
Имя метода так и читается: «показать оповещение пользователя». Синтаксис: ПоказатьОповещениеПользователя(Текст, ДействиеПриНажатии, Пояснение, Картинка, СтатусОповещенияПользователя, КлючУникальности). Все параметры необязательные, пропущенный оставляют пустым между запятыми.
| Параметр | Тип | Что задаёт |
|---|---|---|
| Текст | Строка | Главная строка — что произошло |
| ДействиеПриНажатии | Строка, ОписаниеОповещения | Навигационная ссылка для перехода или процедура, которую вызовет щелчок. После щелчка окно закрывается |
| Пояснение | Строка | Уточнение под текстом: количество, номер документа, подсказка «нажмите, чтобы…» |
| Картинка | Картинка | Значок в окне оповещения |
| СтатусОповещенияПользователя | СтатусОповещенияПользователя | Информация (по умолчанию) или Важное |
| КлючУникальности | Строка | Если открыто оповещение с тем же ключом, новое его заменит |
Картинка — любое значение типа Картинка. Стандартные БиблиотекаКартинок.ДиалогИнформация, ДиалогВосклицание и ДиалогСтоп есть в любой конфигурации, в УТ 11 и КА 2 есть ещё общие картинки Информация32, Предупреждение32, Ошибка32, Успешно32.
Статус и ключ появились в 8.3.10 вместе с центром оповещений. Тогда же второй параметр переименовали из НавигационнаяСсылка в ДействиеПриНажатии и разрешили передавать в нём ОписаниеОповещения. Оба новых параметра работают только в интерфейсе «Такси», в остальных режимах платформа их игнорирует. Поведение по справке:
Справка советует: если по оповещению можно щёлкнуть, скажите об этом в тексте. Три процедуры для модуля формы закрывают большинство случаев:
// Три процедуры для модуля формы: вставьте и вызывайте из своего клиентского кода.
// Примеры вызова:
// ПоказатьГотово(НСтр("ru = 'Цены обновлены'"), НСтр("ru = 'Изменено строк: 12'"));
// ПоказатьСсылкуНаОбъект(НСтр("ru = 'Создан заказ поставщику'"), НовыйЗаказ);
// ПоказатьВажное(НСтр("ru = 'Остатки не сходятся'"), НСтр("ru = 'Нажмите, чтобы открыть ведомость'"),
// "e1cib/app/Отчет.ВедомостьПоТоварамНаСкладах", "СверкаОстатков");
// Итог без перехода: текст, пояснение и стандартная картинка платформы
&НаКлиенте
Процедура ПоказатьГотово(Текст, Пояснение = "")
ПоказатьОповещениеПользователя(Текст, , Пояснение, БиблиотекаКартинок.ДиалогИнформация);
КонецПроцедуры
// Щелчок по оповещению откроет объект: во втором параметре - строка навигационной ссылки
&НаКлиенте
Процедура ПоказатьСсылкуНаОбъект(Текст, СсылкаНаОбъект)
Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
ПоказатьГотово(Текст);
Возврат;
КонецЕсли;
ПоказатьОповещениеПользователя(Текст,
ПолучитьНавигационнуюСсылку(СсылкаНаОбъект), // "e1cib/data/Документ.ЗаказКлиента?ref=..."
Строка(СсылкаНаОбъект), // представление объекта - в пояснение
БиблиотекаКартинок.ДиалогИнформация);
КонецПроцедуры
// Важное: окно скроется через 10 секунд и останется в центре оповещений.
// Оповещение с тем же ключом заменит открытое, а не встанет рядом.
// Действие - строка навигационной ссылки или ОписаниеОповещения.
&НаКлиенте
Процедура ПоказатьВажное(Текст, Пояснение, Действие = Неопределено, Ключ = Неопределено)
ПоказатьОповещениеПользователя(Текст, Действие, Пояснение,
БиблиотекаКартинок.ДиалогВосклицание,
СтатусОповещенияПользователя.Важное,
Ключ);
КонецПроцедуры
Коротко — что когда выбирать. Оповестить() сюда не относится: она ничего не показывает, а рассылает событие открытым формам, см. оповещения форм 1С.
| Способ | Где вызывать | Что видит пользователь | Когда уместен |
|---|---|---|---|
| ПоказатьОповещениеПользователя | только клиент | окно в углу, исчезает само; важное остаётся в центре оповещений | итог операции, ссылка на результат |
| Сообщить, СообщениеПользователю | клиент и сервер | строка в окне сообщений формы; СообщениеПользователю привязывается к полю | ошибки заполнения, замечания по строкам |
| ПоказатьПредупреждение | только клиент | окно с кнопкой, которое закрывает пользователь или таймаут | без прочтения продолжать нельзя |
Сообщения, выданные на сервере, приходят на клиент после завершения серверного вызова. Оповещение с сервера не показать вообще, зато оно не засоряет форму и ведёт к результату по щелчку.
Пример: команда формы списка проводит выделенные документы и показывает одно итоговое оповещение. Само проведение лежит в модуле менеджера обработки ПерепроведениеДокументов — ту же функцию дальше запустим в фоне. Сервер ничего не показывает, он собирает итог в структуру.
// Модуль менеджера обработки ПерепроведениеДокументов.
// Проводит документы и собирает итог для одного оповещения на клиенте.
// Функцию вызывает форма напрямую и БСП в фоновом задании.
Функция ПровестиДокументы(Знач МассивДокументов) Экспорт
Итог = Новый Структура;
Итог.Вставить("Проведено", 0);
Итог.Вставить("Ошибки", Новый Массив); // строки "документ: причина"
Итог.Вставить("ПоследнийДокумент", Неопределено); // для ссылки, если документ один
Итог.Вставить("ПолноеИмя", ""); // "Документ.ЗаказКлиента" - для ссылки на список
ТипыДокументов = Документы.ТипВсеСсылки();
Для Каждого ДокументСсылка Из МассивДокументов Цикл
// В выделении динамического списка бывают строки группировки - пропускаем
Если Не ТипыДокументов.СодержитТип(ТипЗнч(ДокументСсылка)) Тогда
Продолжить;
КонецЕсли;
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
Если ДокументОбъект = Неопределено Тогда
Продолжить; // документ успели удалить
КонецЕсли;
Если ДокументОбъект.ПометкаУдаления Тогда
Итог.Ошибки.Добавить(СтрШаблон(НСтр("ru = '%1: помечен на удаление'"), ДокументСсылка));
Продолжить;
КонецЕсли;
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Итог.Проведено = Итог.Проведено + 1;
Итог.ПоследнийДокумент = ДокументСсылка;
Итог.ПолноеИмя = ДокументСсылка.Метаданные().ПолноеИмя();
Исключение
Итог.Ошибки.Добавить(СтрШаблон("%1: %2", ДокументСсылка,
КраткоеПредставлениеОшибки(ИнформацияОбОшибке())));
КонецПопытки;
КонецЦикла;
Возврат Итог;
КонецФункции
Модуль формы списка. Свою форму или команду к типовому документу удобно добавить расширением.
// Модуль формы списка документов. Команда ПровестиСИтогом проводит
// выделенные документы и показывает одно оповещение на всю операцию.
&НаКлиенте
Процедура ПровестиСИтогом(Команда)
Выделенные = Элементы.Список.ВыделенныеСтроки;
Если Выделенные.Количество() = 0 Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Выделите документы в списке'"));
Возврат;
КонецЕсли;
Итог = ПровестиНаСервере(Выделенные);
Элементы.Список.Обновить();
ПоказатьИтогПроведения(Итог, Ложь);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПровестиНаСервере(Знач МассивДокументов)
Возврат Обработки.ПерепроведениеДокументов.ПровестиДокументы(МассивДокументов);
КонецФункции
// ВФоне = Истина: пользователь мог уйти в другое окно, поэтому итог важный -
// после закрытия окна он останется в центре оповещений.
&НаКлиенте
Процедура ПоказатьИтогПроведения(Итог, ВФоне)
Если Итог.Проведено = 0 И Итог.Ошибки.Количество() = 0 Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Документы для проведения не найдены'"));
Возврат;
КонецЕсли;
Если Итог.Ошибки.Количество() = 0 Тогда
// Один документ - щелчок откроет его, несколько - список документов этого вида
Если Итог.Проведено = 1 Тогда
ДействиеПриНажатии = ПолучитьНавигационнуюСсылку(Итог.ПоследнийДокумент);
Иначе
ДействиеПриНажатии = "e1cib/list/" + Итог.ПолноеИмя;
КонецЕсли;
ПоказатьОповещениеПользователя(
НСтр("ru = 'Документы проведены'"),
ДействиеПриНажатии,
СтрШаблон(НСтр("ru = 'Проведено: %1'"), Итог.Проведено),
БиблиотекаКартинок.ДиалогИнформация,
?(ВФоне, СтатусОповещенияПользователя.Важное, СтатусОповещенияПользователя.Информация),
"ПроведениеСИтогом");
Иначе
// Ошибки: щелчок откроет их список, массив уйдет в обработчик параметром
ПоказатьОшибки = Новый ОписаниеОповещения("ПоказатьОшибкиПроведения", ЭтотОбъект, Итог.Ошибки);
ПоказатьОповещениеПользователя(
НСтр("ru = 'Есть ошибки проведения - нажмите, чтобы посмотреть'"),
ПоказатьОшибки,
СтрШаблон(НСтр("ru = 'Проведено: %1, ошибок: %2'"), Итог.Проведено, Итог.Ошибки.Количество()),
БиблиотекаКартинок.ДиалогВосклицание,
СтатусОповещенияПользователя.Важное,
"ПроведениеСИтогом");
КонецЕсли;
КонецПроцедуры
// Обработчик щелчка: Экспорт и ровно один параметр - ДополнительныеПараметры описания
&НаКлиенте
Процедура ПоказатьОшибкиПроведения(Ошибки) Экспорт
ТекстОшибок = Новый ТекстовыйДокумент;
Для Каждого ТекстОшибки Из Ошибки Цикл
ТекстОшибок.ДобавитьСтроку(ТекстОшибки);
КонецЦикла;
ТекстОшибок.Показать(НСтр("ru = 'Ошибки проведения'"));
КонецПроцедуры
Если документов сотни, серверный вызов подвесит интерфейс. Ту же функцию запускаем в фоне через длительные операции БСП, окно ожидания отключаем, итог показываем в обработчике завершения. Пользователь тем временем работает дальше, поэтому итог важный: он дождётся его в центре оповещений.
// Тот же модуль формы списка: сотни документов проводим в фоне через БСП.
// Итог показывает ПоказатьИтогПроведения из предыдущего листинга.
&НаКлиенте
Процедура ПровестиВФоне(Команда)
Выделенные = Элементы.Список.ВыделенныеСтроки;
Если Выделенные.Количество() = 0 Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Выделите документы в списке'"));
Возврат;
КонецЕсли;
ДлительнаяОперация = НачатьПроведениеВФоне(Выделенные);
// Задание еще идет: говорим, что можно работать дальше. Ключ тот же,
// что у итога, - итог заменит это оповещение, если оно еще на экране.
Если ДлительнаяОперация.Статус = "Выполняется" Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Проведение запущено'"), ,
НСтр("ru = 'Итог придет оповещением, работу можно продолжать'"),
БиблиотекаКартинок.ДиалогИнформация, , "ПроведениеСИтогом");
КонецЕсли;
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь; // форма не блокируется
// ОповещениеПользователя.Показать не включаем: итог покажем сами
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация,
Новый ОписаниеОповещения("ПроведениеВФонеЗавершено", ЭтотОбъект), ПараметрыОжидания);
КонецПроцедуры
&НаСервере
Функция НачатьПроведениеВФоне(Знач МассивДокументов)
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Проведение выделенных документов'");
Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения,
"Обработка.ПерепроведениеДокументов.ПровестиДокументы", МассивДокументов);
КонецФункции
&НаКлиенте
Процедура ПроведениеВФонеЗавершено(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат; // задание отменено
КонецЕсли;
Если Результат.Статус = "Ошибка" Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Проведение прервано'"), ,
Результат.КраткоеПредставлениеОшибки, БиблиотекаКартинок.ДиалогСтоп,
СтатусОповещенияПользователя.Важное, "ПроведениеСИтогом");
Возврат;
КонецЕсли;
Итог = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
Если ТипЗнч(Итог) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
Элементы.Список.Обновить();
ПоказатьИтогПроведения(Итог, Истина);
КонецПроцедуры
Форма списка должна оставаться открытой: без окна ожидания БСП отменяет задание, когда закрывается форма-владелец. Без БСП схема та же — фоновое задание, опрос его состояния и оповещение в клиентской процедуре.
Оповещение видит только сеанс, где его показали. Чтобы каждый менеджер узнал о заказах на согласовании, форма рабочего места раз в пять минут спрашивает сервер и показывает важное оповещение с постоянным ключом. Как устроены сами обработчики — в статье про обработчик ожидания.
// Модуль формы рабочего места менеджера: раз в 5 минут проверяет заказы,
// которые ждут согласования. Имена документа и перечисления - из УТ 11.4 и КА 2.5.
&НаКлиенте
Перем ПоказаноЗаказов; // число заказов из последнего оповещения
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПоказаноЗаказов = 0;
ПодключитьОбработчикОжидания("ПроверитьЗаказыНаСогласовании", 300);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьЗаказыНаСогласовании()
ЧислоЗаказов = ЗаказовНаСогласовании();
Если ЧислоЗаказов = ПоказаноЗаказов Тогда
Возврат; // ничего не изменилось - не отвлекаем
КонецЕсли;
ПоказаноЗаказов = ЧислоЗаказов;
Если ЧислоЗаказов = 0 Тогда
Возврат;
КонецЕсли;
// Один ключ на все проверки: свежее оповещение заменит открытое, а не встанет рядом
ПоказатьОповещениеПользователя(
НСтр("ru = 'Заказы ждут согласования'"),
"e1cib/list/Документ.ЗаказКлиента",
СтрШаблон(НСтр("ru = 'Не согласовано: %1. Нажмите, чтобы открыть список'"), ЧислоЗаказов),
БиблиотекаКартинок.ДиалогВосклицание,
СтатусОповещенияПользователя.Важное,
"ЗаказыНаСогласовании");
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаказовНаСогласовании()
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КОЛИЧЕСТВО(ЗаказКлиента.Ссылка) КАК ЧислоЗаказов
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| НЕ ЗаказКлиента.ПометкаУдаления
| И ЗаказКлиента.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.НеСогласован)");
Выборка = Запрос.Выполнить().Выбрать();
Возврат ?(Выборка.Следующий(), Выборка.ЧислоЗаказов, 0);
КонецФункции
ПоказатьОповещениеПользователя(Текст, , Пояснение, …) — пропущенный параметр оставляют пустым. Явное Неопределено тоже допустимо: так поступает БСП, когда ссылки нет.ПолучитьНавигационнуюСсылку(Итог.ПоследнийДокумент) возвращает строку вида e1cib/data/Документ.ЗаказКлиента?ref=…, для ссылки на объект — без обращения к серверу. Список открывает e1cib/list/Документ.ЗаказКлиента, отчёт или обработку — e1cib/app/Отчет.ВедомостьПоТоварамНаСкладах. Полное имя метаданных считаем на сервере: в тонком клиенте у ссылки нет метода Метаданные().Новый ОписаниеОповещения("ПоказатьОшибкиПроведения", ЭтотОбъект, Итог.Ошибки) — третий параметр придёт в обработчик. У обработчика щелчка один параметр, и процедура обязана быть экспортной. Если к моменту щелчка форму могут закрыть, надёжнее держать обработчик в общем клиентском модуле и указывать этот модуль вторым параметром ОписаниеОповещения — так сделаны оповещения обмена с ЕГАИС и ВетИС в УТ 11.4.?(ВФоне, СтатусОповещенияПользователя.Важное, …) — после серверного вызова пользователь смотрит на форму, ему хватит информационного окна. Ошибки показываем важными всегда."ПроведениеСИтогом" общий для «Проведение запущено» и итога: если первое ещё на экране, итог займёт его место.ДлительнаяОперация.Статус = "Выполняется" — ВыполнитьФункцию по умолчанию ждёт задание до 2 секунд, и короткое вернётся уже выполненным. Тогда «Проведение запущено» не нужно: итог покажет обработчик, который БСП вызовет прямо из ОжидатьЗавершение.ПоказаноЗаказов — переменная модуля формы: оповещение появляется, только когда число заказов изменилось. РАЗРЕШЕННЫЕ нужно, чтобы запрос не падал у менеджеров с ограниченным доступом к заказам.&НаСервере, в модуле объекта или менеджера, в серверном общем модуле. Показать оповещение в 1С можно только на клиенте: сервер возвращает данные, клиент показывает. Подробнее о контекстах — директивы компиляции 1С.ОписаниеОповещения, ссылку на объект сначала пропустите через ПолучитьНавигационнуюСсылку().Экспорт и одним параметром, сигнатуру не копируйте из обработчика ПоказатьВопрос — там параметров два.ПараметрыОжидания.ОповещениеПользователя.Показать и показали своё в обработчике. При статусе «Выполнено» БСП выводит оповещение сама — оставьте одно.Напрямую нет: на сервере метода не существует. Серверная функция возвращает итог, клиент показывает его после вызова или в обработчике завершения задания. Сообщения по ходу работы задание пишет через СообщениеПользователю, а БСП отдаёт их в Результат.Сообщения, если включить ПараметрыОжидания.ВыводитьСообщения.
ПоказатьОповещениеПользователя работает только в своём сеансе. Для остальных есть три пути: периодическая проверка в каждом сеансе, как в последнем листинге; на платформе 8.3.26 и новее — УведомленияКлиента, которыми сервер отправляет данные клиентским сеансам, а клиент уже показывает оповещение (пример есть в статье об оповещениях форм); сообщение в обсуждение системы взаимодействия, если она подключена.
Параметра для времени нет. Информационное окно гаснет само, важное скрывается через 10 секунд и лежит в центре оповещений, пока пользователь его не удалит или не щёлкнет по нему. Если текст обязательно должен быть прочитан, нужна ПоказатьПредупреждение — у неё есть параметр Таймаут в секундах.
По справке метод доступен в толстом клиенте с версии 8.2, то есть и в обычном приложении. Статус и ключ там игнорируются, а обработчик щелчка размещают в общем клиентском модуле: ОписаниеОповещения принимает модуль управляемой формы, общий модуль или модуль команды.
Если нужно, чтобы массовые операции, обмены и проверки сообщали итог оповещением со ссылкой на результат и при этом не подвешивали интерфейс, поручите доработку программисту — это профиль услуги доработки отчётов и обработок 1С. Опишите сценарий на странице «Разместить задание»: оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.