Уведомления: бизнес-логика¶
Обзор¶
Система уведомлений 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):
- Открыть «Первую Форму» в браузере и нажать на значок «Сведения о сайте» в адресной строке.
- Перейти в «Настройки сайта».
- Найти пункт «Уведомления» и активировать переключатель.
В операционной системе (на примере Windows 10):
- Открыть настройки Windows → раздел «Система» → «Уведомления и действия».
- Убедиться, что общесистемные уведомления включены.
- В списке приложений найти браузер и активировать переключатель уведомлений.
- Если браузер отсутствует в списке — сначала получить любое уведомление от сайта, после чего браузер появится в списке. Также проверить, что не активирован режим «Не беспокоить».
Уведомления рабочего стола работают только по HTTPS. При прочтении сообщения соответствующее уведомление автоматически скрывается.
Логика отправки сообщений и непрочитанности¶
Получение уведомления (push, рабочего стола, email) и установка непрочитанности зависят от четырёх факторов:
- Где отправлено сообщение: задача / групповой чат / личный чат.
- Кому адресовано: вам / другому / всем / никому (без адресата).
- Включена ли в настройках уведомлений колонка «Уведомлять» для типа «Сообщения».
- Включены ли уведомления в конкретной задаче/чате (кнопка в тулбаре).
«Тихие» комментарии (отправленные смарт-автоматизацией без адресатов) не имеют адресатов, не увеличивают счётчик непрочитанных и не отправляют push независимо от настроек.
Задачи и групповые чаты:
| Уведомления задачи/чата | «Уведомлять» для «Сообщений» | Адресат | Уведомление | Непрочитано |
|---|---|---|---|---|
| Включено | Включено | Вам / Другому / Всем / Никому | Да | Да |
| Отключено | Включено | Вам | Да | Да |
| Отключено | Включено | Другому | Нет | Нет |
| Отключено | Включено | Всем | Да | Да |
| Отключено | Включено | Никому | Нет | Да |
| Включено | Отключено | Вам | Да | Да |
| Включено | Отключено | Другому | Нет | Нет |
| Включено | Отключено | Всем / Никому | Да | Да |
| Отключено | Отключено | Вам | Нет | Да |
| Отключено | Отключено | Другому | Нет | Нет |
| Отключено | Отключено | Всем / Никому | Нет | Да |
Личные чаты (адресат всегда определён — вы или собеседник):
| Уведомления чата | «Уведомлять» для «Сообщений» | Сообщение от собеседника | Непрочитано |
|---|---|---|---|
| Включено | Включено | Уведомление + push | Да |
| Отключено | Включено | Уведомление + push | Да |
| Включено | Отключено | Уведомление + push | Да |
| Отключено | Отключено | Только непрочитанность, без push | Да |
Редактирование адресатов комментария¶
При редактировании комментария можно изменить список адресатов. Система сравнивает старый и новый набор и корректирует push-уведомления:
- Добавленные адресаты получают push-уведомление — аналогично отправке нового комментария.
- Исключённые адресаты получают сигнал удаления push — уведомление исчезает из центра уведомлений на устройстве (тот же механизм, что и при удалении комментария; сам комментарий при этом не удаляется).
- Сужение «Всем» → конкретный пользователь: push удаляется у всех, кроме указанного.
Историческая справка: ранее в общих настройках приложения существовал флаг «Комментарии без адресата всегда непрочитанные для подписчиков» (поле
NobodyCommentsUnread), который превращал комментарий «Никому» в эквивалент «Всем» (push + непрочитанное всем подписчикам). Настройка убрана из UI и кода в задаче #1707893 (2024-08, серия коммитов1a20ad23d1…b4fdb4f33a). Поле помечено[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-уведомления для личных и групповых чатов со специфичным форматированием |