Перейти к содержанию

Уведомления: бизнес-логика

Обзор

Система уведомлений 1Формы обеспечивает многоканальное информирование пользователей о событиях: через индикатор непрочитанных сообщений ("конверт"), ленту комментариев, уведомления рабочего стола, почтовые рассылки и мобильные push-уведомления. Уведомления конфигурируются на трех уровнях: глобальные настройки по умолчанию (для новых пользователей), персональные настройки пользователя и настройки на уровне категории. Предусмотрен отдельный механизм контроля просроченных задач с автоматической рассылкой отчетов.

Типы уведомлений

Система поддерживает 19 типов событий, по каждому из которых можно независимо включить/отключить уведомление ("в конверт") и отображение в ленте комментариев:

CommentTypeID Тип уведомления Описание
1 Движения по маршруту БП Смена статуса задачи, выполнение перехода
2 Подписи Запрос, акцепт, отклонение, делегирование, отзыв подписи
3 Комментарии Отправка или редактирование комментария
5 Служебные Установка или срабатывание повторений и напоминаний
6 Подзадачи и связи Создание или удаление связей между задачами
7 Параметры Изменение значения ДП (требует включенной опции "Сохранять историю изменений ДП")
8 Создание задачи Создание новой задачи, копирование задачи
9 Изменение текста задачи Редактирование текста задачи
10 Вложение файла Вложение файла в задачу
11 Перенос задачи Перенос задачи в другую категорию
12 Перенос сроков Установка или перенос срока в задаче
13 Назначение исполнителя Назначение/удаление исполнителя, смена ответственного
23 Назначение меня исполнителем (TASKPERFORMERADDEDME) Назначение/удаление текущего пользователя из исполнителей
15 Получать уведомление о подписчиках (SUBSCRIBERS) Добавление или удаление подписчика
16 Превышение срока Превышение срока задачи
18 Смена заказчика задачи (OWNERCHANGED) Смена заказчика задачи
19 Другие действия с файлами Редактирование, замена или удаление файла
20 Трудозатраты Внесение или изменение трудозатрат
21 Календарные события (CALENDAREVENTCHANGE) Приглашение на встречу, изменение параметров встречи (push при изменении участников/статуса не отправляются)

Каждый тип уведомления управляется двумя флагами: попадание "в конверт" (увеличивает счетчик непрочитанных) и отображение в ленте комментариев. Таблица UserLentaCommentTypes хранит настройки ленты; если для пользователя в ней пусто -- все галочки уведомлений в интерфейсе считаются снятыми.

Настройки уведомлений в категории

На вкладке "Уведомления" категории настраиваются автоматические действия для конкретных пользователей и групп при событиях с задачами:

Действие Описание
Добавить в исполнители Пользователь автоматически добавляется в исполнители при создании задачи. Требуется право "Исполнять"
Назначить ответственным Пользователь добавляется в исполнители и назначается ответственным при создании задачи
Автоматически подписать Пользователь добавляется в подписчики при создании задачи
Новая задача в категории Уведомление о создании новой задачи
Смена срока Уведомление об изменении срока выполнения задачи
Отклонение задачи Уведомление об отклонении задачи

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

Приоритет выполнения: смарт-пакеты категории выполняются раньше настроек вкладки "Уведомления". Поэтому настройки вкладки «Уведомления» имеют более высокий приоритет и могут перезаписать результаты смарт-действий (последний пишет — выигрывает). Например, если смарт-действие назначает ответственного A, а настройки уведомлений -- ответственного B, в итоге будет назначен B.

Контроль просроченных задач

Два системных задания по таймеру (по умолчанию ежедневно в 17:00):

  • OverdueCommentsNotificationJob -- генерирует комментарии в просроченных задачах
  • OverdueNotificationJob -- рассылает почтовые отчеты о просроченных задачах

Условия генерации: в настройках категории включена опция напоминания о приближении срока, и в общих настройках разрешена работа с почтой. Формат отчета и письма зашит в коде (стандартный отчет "Информация по просроченным задачам").

Два параметра категории совместно управляют включением: - Исключить из отчета о просроченных сроках (страница "Основные настройки") -- исключает категорию - В отчет включать задачи со статусами (вкладка "Уведомления") -- определяет, в каких статусах задачи попадают в отчет. Этот параметр имеет более высокий приоритет: если указаны статусы, уведомления генерируются даже при включенном исключении

Отключение email-уведомлений на уровне категории

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

Практическое применение: для категории групповых чатов (GroupChatSubCatID) эта настройка решает проблему email-спама из групповых чатов, сохраняя push и ленту. Это важно для сценариев миграции из внешних мессенджеров (Telegram, WhatsApp).

Связь с per-chat mute: кнопка «Выключить уведомления» в чате (ChatNotificationMode) влияет только на push/непрочитанность и не влияет на email. Для управления email из чатов нужна именно эта настройка категории.

Пользовательские настройки

Персональные настройки уведомлений

Каждый пользователь может настроить типы уведомлений на вкладке "Уведомления" в профиле (как в пользовательском, так и в административном интерфейсе). Для каждого типа события -- два столбца: уведомлять "в конверт" и показывать в ленте.

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

Глобальные настройки по умолчанию

Настройки по умолчанию (учетная запись SystemRobot) применяются при создании новых пользователей и не затрагивают уже существующих. Ключевые опции уведомлений:

  • Получать файлы в письмах вложениями, а не ссылками -- файлы из ДП отправляются вложениями при уведомлении о новой задаче и изменении ДП. Администратор может ограничить максимальный размер
  • Не получать уведомления о просроченных задачах и подписях -- отключает ежедневные отчеты
  • Не присылать почтовые сообщения -- отключает дублирование уведомлений на почту. Режимы: "Когда я в онлайне" (почта только офлайн), "В рабочее время" (почта только в рабочие часы), "Когда я отсутствую" (почта не приходит при нерабочем отсутствии)
  • Не получать SMS -- отключает SMS-уведомления
  • Автопрочтение при просмотре задачи -- автоматическая отметка "прочитано" при открытии карточки (вручную отмеченные как непрочитанные сохраняют статус)
  • Уведомления рабочего стола -- работают только по HTTPS
  • Звуки -- звуковые оповещения и голосовые сообщения о непрочитанных при входе в систему

Логика рассылки отчетов о просроченных задачах

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

Массовая установка типов уведомлений

Для массового изменения настроек всех пользователей доступна хранимая процедура, оперирующая таблицами Users (bit-флаги типов уведомлений: NewStatusNotifyBit, SignatureNotifyBit, NewCommentNotifyBit и т.д.) и UserLentaCommentTypes (типы комментариев для ленты). Процедура также может пометить прочитанными все уведомления нежелательных типов через таблицу CommentRecipients.

Push-уведомления

Настройка сертификатов

Мобильные push-уведомления доставляются через три сервиса: Apple Push Notification service (APNs) для iOS, Firebase Cloud Messaging (FCM) для Android и Huawei Mobile Services (HMS) для устройств Huawei без сервисов Google. Устройства Huawei регистрируются с отдельным идентификатором приложения HuaweiOneFChat; система автоматически определяет нужный шлюз по appId push-токена. Для HMS используется OAuth2-авторизация и отдельный шлюз (https://push-api.cloud.huawei.com). Для iOS-приложений требуется загрузка сертификата с паролем в разделе "Push-уведомления" администрирования. Если компания использует несколько мобильных приложений 1F Mobile, для каждого нужен свой сертификат. Поля VOIP-сертификат и VOIP-пароль устарели.

Приоритеты (Android)

В текущей версии все push для Android имеют повышенный приоритет (будят устройство из спящего режима). Ранее приоритет настраивался по типам уведомлений; если пользователь систематически игнорирует high-priority push, Android может их блокировать.

Формат push-уведомлений

Содержимое push формируется по правилам:

  • Title: для личных чатов -- имя собеседника; для групп/задач -- текст задачи (до 500 символов)
  • Subtitle: для чатов -- пусто; для задач -- маршрут комментария (от кого к кому)
  • Body: текст комментария; если текст пуст (есть вложения) -- "изображение", "видео", "голосовое сообщение" или имя файла; при нескольких файлах -- "вложены файлы"
  • При включенной опции скрытия текста в push (задается в персональных настройках) title и subtitle пусты, body заменяется на "Новое сообщение"

JSON-формат различается для iOS (обертка aps c badge, sound, thread-id для группировки) и Android (плоская структура, все значения строковые). Ключевые поля: taskId, commentId, threadId, isChat, isPinnedToChat, unreadCount, userName.

Инфраструктура

Для корректной работы push в веб-интерфейсе (SignalR через pushHub) на веб-сервере или балансировщике необходимо разрешить WebSockets для пути /pushHub.

Диагностика

Если пользователь не получает push: 1. Проверить настройки типов уведомлений в профиле (столбец "Уведомлять") 2. Проверить параметр "Получать пуш-уведомление" (должно быть "Всегда") 3. Проверить разрешения на устройстве 4. Проверить актуальность сертификатов push-уведомлений 5. Проверить наличие push-токенов в отчете "Статистика использования мобильных приложений" (вкладка Push-токены). При отсутствии -- переавторизоваться или переустановить приложение

Журнал push-уведомлений

Системный журнал содержит информацию обо всех отправленных push-уведомлениях в мобильное приложение. Поддерживает фильтрацию, сортировку и экспорт в CSV/Excel.

Включение уведомлений рабочего стола

Чтобы получать уведомления рабочего стола, нужно одновременно разрешить их в браузере и в операционной системе.

В браузере (на примере Google Chrome):

  1. Открыть «Первую Форму» в браузере и нажать на значок «Сведения о сайте» в адресной строке.
  2. Перейти в «Настройки сайта».
  3. Найти пункт «Уведомления» и активировать переключатель.

В операционной системе (на примере Windows 10):

  1. Открыть настройки Windows → раздел «Система» → «Уведомления и действия».
  2. Убедиться, что общесистемные уведомления включены.
  3. В списке приложений найти браузер и активировать переключатель уведомлений.
  4. Если браузер отсутствует в списке — сначала получить любое уведомление от сайта, после чего браузер появится в списке. Также проверить, что не активирован режим «Не беспокоить».

Уведомления рабочего стола работают только по HTTPS. При прочтении сообщения соответствующее уведомление автоматически скрывается.

Логика отправки сообщений и непрочитанности

Получение уведомления (push, рабочего стола, email) и установка непрочитанности зависят от четырёх факторов:

  1. Где отправлено сообщение: задача / групповой чат / личный чат.
  2. Кому адресовано: вам / другому / всем / никому (без адресата).
  3. Включена ли в настройках уведомлений колонка «Уведомлять» для типа «Сообщения».
  4. Включены ли уведомления в конкретной задаче/чате (кнопка в тулбаре).

«Тихие» комментарии (отправленные смарт-автоматизацией без адресатов) не имеют адресатов, не увеличивают счётчик непрочитанных и не отправляют push независимо от настроек.

Задачи и групповые чаты:

Уведомления задачи/чата «Уведомлять» для «Сообщений» Адресат Уведомление Непрочитано
Включено Включено Вам / Другому / Всем / Никому Да Да
Отключено Включено Вам Да Да
Отключено Включено Другому Нет Нет
Отключено Включено Всем Да Да
Отключено Включено Никому Нет Да
Включено Отключено Вам Да Да
Включено Отключено Другому Нет Нет
Включено Отключено Всем / Никому Да Да
Отключено Отключено Вам Нет Да
Отключено Отключено Другому Нет Нет
Отключено Отключено Всем / Никому Нет Да

Личные чаты (адресат всегда определён — вы или собеседник):

Уведомления чата «Уведомлять» для «Сообщений» Сообщение от собеседника Непрочитано
Включено Включено Уведомление + push Да
Отключено Включено Уведомление + push Да
Включено Отключено Уведомление + push Да
Отключено Отключено Только непрочитанность, без push Да

Редактирование адресатов комментария

При редактировании комментария можно изменить список адресатов. Система сравнивает старый и новый набор и корректирует push-уведомления:

  • Добавленные адресаты получают push-уведомление — аналогично отправке нового комментария.
  • Исключённые адресаты получают сигнал удаления push — уведомление исчезает из центра уведомлений на устройстве (тот же механизм, что и при удалении комментария; сам комментарий при этом не удаляется).
  • Сужение «Всем» → конкретный пользователь: push удаляется у всех, кроме указанного.

Историческая справка: ранее в общих настройках приложения существовал флаг «Комментарии без адресата всегда непрочитанные для подписчиков» (поле NobodyCommentsUnread), который превращал комментарий «Никому» в эквивалент «Всем» (push + непрочитанное всем подписчикам). Настройка убрана из UI и кода в задаче #1707893 (2024-08, серия коммитов 1a20ad23d1b4fdb4f33a). Поле помечено [Obsolete("Не используется")] в core/TCDataAccess/Kernel/Domain/Entities/SettingEntity.cs:660-661, все 4 использования закомментированы (Comments.cs:3555, PushRecipientResolver.cs:155, 158, 182). Сейчас «Никому» всегда рассылается всем подписчикам с уважением их мьюта чата — см. domains/notifications/data-flow.md § 7.4.

Особенности отдельных типов уведомлений

  • Сообщения — нельзя отключить отображение в ленте (тип недоступен в колонке «Видно в ленте»). Push по личным чатам можно отключить кнопкой в чате; в групповых чатах push приходят при личном обращении и при «Всем» даже при отключённых уведомлениях чата.
  • Назначение меня исполнителем — флаг «Непрочитанные» неактивен.
  • Получать уведомления о подписчиках — на почту не отправляются и среди непрочитанных не учитываются.
  • Календарные события — уведомления об отмене встречи участникам не отправляются. Push при изменении состава или статуса не приходят.
  • Создание задачи — в чатах создание оформляется как «тихий» комментарий пользовательского типа независимо от настроек.
  • Запись и расшифровка ВКС — для автоматических уведомлений нужно включить «Видно в ленте» + «Непрочитанность» по этому типу.

Прочие пользовательские настройки

Настройка Что делает
Получать файлы в письмах вложениями ДП-файлы в email-уведомлениях приходят как вложения, а не ссылки. Размер вложений ограничивается администратором
Не получать уведомления о просроченных задачах и подписях Отключает ежедневные отчёты
Не присылать почтовые сообщения Отключает дублирование на email. Режимы: «Когда я в онлайне», «В рабочее время», «Когда я отсутствую»
Не получать SMS Отключает SMS-напоминания
Автопрочтение при просмотре задачи Новые сообщения автоматически отмечаются прочитанными при открытии карточки задачи. Помеченные вручную как непрочитанные сохраняют статус
Звуки Звуковые оповещения и голосовое сообщение о количестве непрочитанных при входе
Напоминания о встречах Всплывающий баннер за 15 минут до начала события
Счётчик на иконке Что показывать: число непрочитанных сообщений или число чатов с непрочитанными
Скрывать текст сообщения в push Отдельно для чатов и для сообщений к задачам
По чатам / Вопросы Управление push для чатов и сообщений-вопросов. При несогласованных настройках вопросы получают push, потому что вопрос — это сообщение
Звуки в мобильном приложении Разные звуки для разных типов уведомлений

Изменение настроек применяется и к уже существующим сообщениям: после отключения типа в колонке «Непрочитанные» старые сообщения этого типа перестают быть непрочитанными.

Представление «Лента»

Представление «Лента» показывает задачи и сообщения в хронологическом порядке: свежие записи находятся сверху. Экран состоит из двух областей: слева лента задач, справа сообщения из выбранных задач. По умолчанию соотношение областей 40/60, пользователь может изменить ширину перетаскиванием разделителя.

Режимы ленты задач

Режим Что показывает Особенности карточки
Заказчик Задачи, где пользователь является заказчиком. В карточке не показывается заказчик, потому что это текущий пользователь.
Исполнитель Задачи, где пользователь является исполнителем. Это режим по умолчанию. В карточке не показываются исполнители.
Подписка Все задачи, к которым пользователь имеет отношение, включая справочники. Используется для расширенного просмотра своего информационного потока.

В карточках задач отображаются аватар задачи, название, категория, статус, системные теги, приоритет, заказчик, срок, количество подзадач и исполнители. Из ленты доступна краткая форма создания личной задачи в системном разделе.

⚠️ Для постановки задач из ленты в категории не должно быть обязательных полей.

Режимы ленты сообщений

Режим Что показывает
Лента Все сообщения в задачах, на которые пользователь подписан.
Новые Непрочитанные сообщения; загружаются последние 200 новых сообщений. Из этого режима можно прочитать все новые сообщения в ленте.
Входящие Неотвеченные вопросы, заданные пользователю другими пользователями. При настройке «Все вопросы» отображаются также ответы на вопросы других пользователей.
Исходящие Неотвеченные вопросы, заданные текущим пользователем другим пользователям. При настройке «Все вопросы» отображаются ответы пользователей на эти вопросы.
Избранные Сообщения, добавленные пользователем в избранное.

Группировка и теги

Опция «Группировать» в настройках ленты меняет представление: задача показывается в ленте один раз по последнему сообщению. В grouped-виде отображаются общее количество сообщений в задаче, количество непрочитанных и аватары участников. Список аватаров строится по частоте участия пользователей среди последних 50 сообщений задачи.

В ленте активные просроченные задачи выделяются красным, завершённые — серым. Системные теги всегда включают название категории с иконкой. Дополнительно администратор может настроить теги по статусу, приоритету, заказчику или значению ДП; для статуса и приоритета применяются служебные иконки.

Контекстное меню задачи в ленте

Правый клик по карточке задачи в ленте задач открывает меню:

Пункт Описание
Открыть Карточка задачи в текущей вкладке
Открыть на новой странице Карточка в новой вкладке
В избранное / В избранное и выбрать цвет Добавление в избранное (пункты видны только для не добавленных задач)
Удалить из избранного / Изменить цвет избранного Управление избранным (только для уже добавленных задач)
Добавить в чаты / Убрать из чатов Закрепление задачи в списке чатов
Копировать текст Копирование текста задачи в буфер обмена
Установить срок Окно установки или изменения срока

Антидубль с comments-доменом

UI-операции с отдельным сообщением — ответы, треды, пересылка, реакции, избранное, форматирование, @-упоминания и emoji-only сообщения — относятся к домену комментариев. Их нужно смотреть в ../comments/business.md, чтобы не дублировать правила ленты сообщений в notifications.

Счётчик непрочитанных на иконке десктопного приложения (Electron, Windows)

В десктопном приложении 1Формы для Windows на иконке в панели задач отображается эмблема (overlay icon) со счётчиком непрочитанных сообщений. Счётчик берёт сумму непрочитанных из тех же тикеров, что и веб-версия (индикатор «конверт»), и обновляется в реальном времени по сигналам SignalR. Если приложение неактивно или свёрнуто в «спящее» состояние — обновление возобновляется при восстановлении окна. При нуле непрочитанных эмблема скрывается. Поведение аналогично Telegram для Windows.

Реализация опирается на нативный Windows API (BrowserWindow.setOverlayIcon в Electron main process), изображение счётчика генерируется из SVG.

Ограничения Windows

Для отображения эмблемы на иконке панели задач должны быть выполнены системные условия:

  • В настройках панели задач Windows выбран режим больших значков. При включённой опции «Use small taskbar buttons» / «Использовать маленькие кнопки панели задач» overlay-эмблемы не отображаются — Windows игнорирует вызов API без ошибки.
  • В параметрах персонализации панели задач включён показ эмблем на приложениях.

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

Отличие от macOS

На macOS счётчик на иконке в Dock реализован отдельным механизмом (app.dock.setBadge) и не зависит от настроек панели задач Windows.

Связи с другими доменами

Домен Связь
Задачи Большинство типов уведомлений привязано к событиям жизненного цикла задачи (создание, статус, срок, исполнители)
Категории Настройки уведомлений, автоподписки и автоназначения задаются на уровне категории. Контроль просроченных задач зависит от настроек категории
Комментарии Уведомления доставляются как комментарии в ленту. Счетчик непрочитанных -- по таблице CommentRecipients
Подписи Тип уведомления "Подписи" охватывает весь цикл акцептования
Файлы Типы уведомлений "Вложение файла" и "Другие действия с файлами"
Календарь Тип "Календарные события" (приглашения, изменения встреч)
Пользователи и группы Персональные настройки, настройки по умолчанию, спецправо на получение отчетов. Замещение влияет на рассылку
Почта Дублирование уведомлений на email, рассылка отчетов о просроченных задачах
Смарт-автоматизация Смарт-действие "Отправить комментарий" для программных уведомлений. Рекомендуется для обязательных уведомлений (пользователь не может отключить)
Чат Push-уведомления для личных и групповых чатов со специфичным форматированием