Как программно очистить Центр оповещений и список напоминаний в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсных решений в среде «1С:Предприятие 8» программисты часто сталкиваются с задачей информирования пользователей. Платформа предоставляет для этого удобный инструмент — метод ПоказатьОповещениеПользователя, который выводит всплывающее окно в углу экрана. Начиная с интерфейса «Такси», важные сообщения не просто исчезают с экрана, а накапливаются в специальном списке на панели инструментов под иконкой «колокольчика» (Центр оповещений). Однако со временем этот список переполняется, и возникает закономерный вопрос: как программно управлять этим списком и очищать его без участия пользователя?

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

В чем сложность: ограничения Центра оповещений в платформе 1С

Для начала разберем природу Центра оповещений. Этот элемент интерфейса управляется непосредственно платформой на клиенте. Большинство разработчиков ошибочно полагают, что эти уведомления хранятся в какой-то таблице базы данных (например, в регистре сведений), откуда их можно легко удалить обычным запросом или набором записей. На самом деле это не так.

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

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

Решение 1. Использование ключа уникальности для «затирания» уведомлений (Лайфхак)

Мало кто из разработчиков знает, что у метода ПоказатьОповещениеПользователя есть недокументированная в широких кругах особенность работы с ключом уникальности. Начиная с версии платформы 8.3.10, разработчикам доступен шестой параметр этого метода — КлючУникальности. Он позволяет управлять жизненным циклом конкретного оповещения.

Рассмотрим, как с его помощью можно программно убрать ненужное или устаревшее уведомление из-под «колокольчика».

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


// Отправляем важное оповещение о новом заказе клиента
КлючОповещения = "НовыйЗаказ_" + СокрЛП(Строка(Объект.Ссылка.УникальныйИдентификатор()));
ПоказатьОповещениеПользователя(
    "Поступил новый заказ!", 
    ПолучитьНавигационнуюСсылку(Объект.Ссылка), 
    "Требуется срочная обработка менеджером", 
    БиблиотекаКартинок.Важно, 
    СтатусОповещенияПользователя.Важное, 
    КлючОповещения
);

Шаг 2. Предположим, что заказ был успешно обработан (этим же пользователем или в фоновом режиме на сервере). Нам больше не нужно, чтобы под «колокольчиком» висело это уведомление и отвлекало внимание. Чтобы удалить его, мы повторно вызываем метод ПоказатьОповещениеПользователя с тем же самым ключом уникальности, но меняем статус на обычный (информационный) и очищаем текст:


// Программное "гашение" уведомления в Центре оповещений
КлючОповещения = "НовыйЗаказ_" + СокрЛП(Строка(Объект.Ссылка.УникальныйИдентификатор()));
ПоказатьОповещениеПользователя(
    "", // Пустой текст
    , 
    "", // Пустое пояснение
    , 
    СтатусОповещенияПользователя.Информация, // Обычный статус вместо Важного
    КлючОповещения
);

Как это работает под капотом платформы: Платформа находит в Центре оповещений старую запись с ключом КлючОповещения и замещает ее новой. Поскольку новая запись имеет статус Информация, она не подлежит хранению под «колокольчиком» и сразу же удаляется из интерфейса. Таким образом, старое важное оповещение бесследно исчезает из списка без каких-либо действий со стороны пользователя!

Решение 2. Переход на механизм «Напоминания пользователя» из БСП

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

В отличие от платформенного Центра оповещений, напоминания БСП физически хранятся в базе данных — в регистре сведений НапоминанияПользователя. Это дает разработчику полную свободу действий.

Рассмотрим, как программно очистить список напоминаний конкретного пользователя через работу с регистром сведений БСП:


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

Если вам требуется удалить не все напоминания, а только связанные с конкретным объектом (например, определенным контрагентом или договором), вы можете наложить дополнительный отбор по измерению Источник:


// Удаление напоминаний по конкретному документу-источнику
Процедура ОчиститьНапоминанияПоИсточнику(СсылкаНаИсточник) Экспорт
    
    НаборЗаписей = РегистрыСведений.НапоминанияПользователя.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Пользователь.Установить(Пользователи.ТекущийПользователь());
    НаборЗаписей.Отбор.Источник.Установить(СсылкаНаИсточник);
    
    НаборЗаписей.Записать(Истина);
    
КонецПроцедуры

Использование БСП является более надежным и гибким решением для enterprise-систем, так как оно позволяет синхронизировать напоминания между различными рабочими местами и не зависит от кэша локального веб-клиента или тонкого клиента 1С.

Резюме и рекомендации

Подведем итоги нашего анализа. Выбор метода управления уведомлениями зависит от архитектуры вашей конфигурации:

  1. Если вы используете стандартный метод ПоказатьОповещениеПользователя платформы «1С:Предприятие» и не хотите засорять интерфейс, старайтесь не злоупотреблять статусом СтатусОповещенияПользователя.Важное без реальной необходимости. Большинство рутинных сообщений прекрасно смотрятся со статусом Информация.
  2. Если статус Важное необходим, всегда используйте уникальный КлючУникальности. Это позволит вам впоследствии программно «погасить» уведомление, прислав пустое сообщение с тем же ключом и статусом Информация.
  3. Для сложных бизнес-процессов, где критически важен аудит уведомлений и возможность их гарантированного удаления на сервере, откажитесь от платформенного колокольчика в пользу регистра сведений НапоминанияПользователя из состава БСП.
← На главную