Уведомления — Администрирование¶
Обзор¶
Для notifications администрирование распределено между несколькими доменами: categories (правила уведомлений по категориям), users-and-groups (персональные и дефолтные флаги), mail (почтовый канал и шаблоны), mobile (push-настройки), system (глобальные системные параметры).
Собственной "большой" формы администрирования у домена нет: результат формируется комбинацией настроек.
Механизмы администрирования¶
Автоадминка (dbadmin) -- ключевые формы¶
| Alias формы | Название | Таблица БД | Где влияет на notifications |
|---|---|---|---|
group-subcat-notificatons |
Уведомления при событиях в задаче | dbo.GroupSubcatNotificatons |
Правила уведомлений/автодействий по группам в категории |
system-settings |
Общие настройки приложения | dbo.Settings |
Глобальные флаги каналов и поведение отчётов/уведомлений |
email-settings |
Настройки почты | dbo.EmailSettings |
Включение/выключение почтовой доставки |
mail-templates |
Шаблоны почтовых уведомлений | dbo.MailTemplates |
Контент и формат писем-уведомлений |
push-settings |
Настройка PUSH | dbo.PushSettings |
Сертификаты/параметры мобильного push |
service-mail-boxes |
Почта категории | dbo.ServiceMailBoxes |
Почтовые ящики для категорийных уведомлений/обратной связи |
Admin API контроллеры¶
| Контроллер | Маршрут | Методы | Назначение |
|---|---|---|---|
UserNotificationsController |
/api/admin/user/notifications |
GET, POST | Персональные флаги уведомлений пользователя |
UserNewDefaultSettingsController |
/api/admin/users/default/notifications |
GET, POST | Дефолтные уведомления для новых пользователей |
CategoriesController |
/api/admin/categories/{categoryId}/notifications/* |
GET, POST | Массовые/категорийные правила уведомлений |
PushSettingsController |
/api/admin/push/settings* |
GET, POST, PUT, DELETE | Канал mobile push (сертификаты, приоритеты) |
MailTemplatesController |
/api/admin/mail-templates |
POST | Экспорт/импорт шаблонов уведомлений |
Runtime API, критичный для проверки админ-настроек¶
| Контроллер | Маршрут | Что проверяет |
|---|---|---|
SubcategoryNotificationController |
/api/subcategories/{subcatId:int}/notifications |
Фактические подписки и флаги по категории |
UserNotificationsController |
/api/admin/user/notifications/{userId:int} |
Применённые персональные флаги |
Ключевые настройки¶
1. Правила уведомлений по категории¶
Где настраивается: категория -> вкладка "Уведомления" (cats_notifications) / Admin API categories/{categoryId}/notifications/*
Таблицы БД:
- dbo.GroupSubcatNotificatons
- dbo.UserSubcatNotificatons
- dbo.SubcatUserNotifications
Что контролируется: - автоподписка; - автоназначение исполнителем/ответственным; - уведомления о новой задаче, переносе срока, отклонении.
Эффект в runtime: эти правила участвуют в расчёте адресатов в SubcategoriesNotificationsService и дальше влияют на доставку через NotificationService.
2. Персональные флаги и дефолты¶
Где настраивается:
- профиль пользователя -> уведомления (users_notifications);
- дефолты новых пользователей -> /api/admin/users/default/notifications.
Таблицы БД:
- dbo.UserNotifications
- dbo.UserLentaCommentTypes
- профильные поля dbo.Users (legacy-флаги)
Что контролируется: попадание события "в конверт", в ленту, desktop/mobile push и почтовые дубли.
3. Почтовый канал уведомлений и шаблоны¶
Где настраивается:
- автоадминка email-settings;
- автоадминка mail-templates;
- почтовые настройки категории (subcategory-mail-messages-settings).
Таблицы БД:
- dbo.EmailSettings
- dbo.MailTemplates
- dbo.ServiceMailBoxes
Что контролируется: включение почтового канала, формат письма, маршрутизация через сервисные ящики.
Внешние и внутренние ссылки в письмах-уведомлениях:
- В шаблонах почтовых уведомлений можно формировать две ссылки на задачу: для внутреннего (локального) и внешнего доступа.
- Для настройки двух различных URL используются параметры системы: "Путь к приложению" (ApplicationPath) для локальных пользователей и "Путь к приложению IP" (ApplicationIPPath) для внешних адресов.
- Когда в шаблоне включен режим fullmode="true", первая ссылка формируется через GetTaskUrl() (использует ApplicationPath), вторая — через GetExternalTaskUrl() (использует ApplicationIPPath с fallback на ApplicationPath, если внешний путь не задан).
- Если параметр ApplicationIPPath пуст, поведение остаётся прежним: обе ссылки будут указывать на ApplicationPath.
4. Mobile push¶
Где настраивается: /api/admin/push/settings*, страницы mobile_push и mob_push.
Таблицы БД:
- dbo.PushSettings
- dbo.PushDeviceTokens
Что контролируется: сертификаты push, приоритеты Android, техническая возможность доставки на устройство.
5. Просроченные уведомления¶
Где настраивается: категория (cats_notifications) + системные/почтовые настройки.
Зависимые джобы:
- OverdueCommentsNotificationJob
- OverdueNotificationJob
Что контролируется: генерация комментариев и почтовых отчётов по просроченным задачам.
Типичные ошибки настройки¶
| Симптом | Причина | Где проверить | SQL-диагностика |
|---|---|---|---|
| Пользователь не получает уведомления нужного типа | Отключены флаги в персональных настройках | Профиль пользователя -> уведомления | select UserId, CommentTypeId, Envelope, Push from dbo.UserNotifications where UserId = @UserId order by CommentTypeId; |
| По категории не срабатывает автоподписка/автоназначение | Неполные правила в user/group-таблицах | Вкладка "Уведомления" категории | select * from dbo.UserSubcatNotificatons where SubcatId = @SubcatId; select * from dbo.GroupSubcatNotificatons where SubcatId = @SubcatId; |
| Письма-уведомления не приходят | Почтовый канал выключен или неверный шаблон | email-settings, mail-templates |
select IsEmailEnabled, IsEmailJobSendEnabled from dbo.EmailSettings; select top (20) * from dbo.MailTemplates; |
| Push не доходит до устройства | Нет валидного токена или проблема сертификата | mobile_push, /api/admin/push/settings |
select top (50) UserID, DeviceToken, Status, DateAdded from dbo.PushDeviceTokens where UserID = @UserId order by DateAdded desc; |
| Отчёт о просрочке не рассылается | Категория исключена из отчёта/неверные статусы | Вкладка "Уведомления" категории | select SubcatId, ExcludeFromOverdueReport from dbo.Subcategories where SubcatId = @SubcatId; |
Кастомные индикаторы и тикеры¶
Базовая диагностика runtime-цепочки, кешей и API вынесена в runbook-tickers-counters.md. UI-форма tickers описана в ../grids/admin.md, а таблицы и функции — в database.md. В этом разделе фиксируются правила настройки, которые не должны дублировать runbook.
Стандартные и кастомные индикаторы¶
| Тип | Правило настройки |
|---|---|
| Стандартные индикаторы | Порядок зафиксирован в коде фронтенда и через настройки не меняется. Системные индикаторы не удаляют: если нужно скрыть индикатор, используют ограничение по группам. |
| Кастомные индикаторы | Порядок задаётся строками в списке настроек в обратном порядке: верхняя строка в админке — ближайший к профилю пользователя индикатор в панели навигации. |
| Веб vs мобильное приложение | Веб-индикаторы отображаются только в веб-интерфейсе. Для мобильного приложения используется плитка рабочего стола, см. ниже. |
⚠️ Если поле «Ограничить доступ к индикатору группами» пустое, индикатор не отображается никому. Заполненное поле означает видимость только для указанных групп.
Источник данных, клик и числовой счётчик¶
| Настройка | Инвариант |
|---|---|
ClickAction / действие по клику |
Поддерживаются варианты: открыть страницу из поля «Ссылка», открыть список задач, открыть список пользователей, открыть список произвольных элементов. |
| Табличная функция SQL | Принимает @UserID int и возвращает таблицу. Для списка задач обязательна колонка TaskID, для списка пользователей — UserID. |
| Произвольный источник | Если одновременно заполнены «Табличная функция SQL» и «Произвольный источник», используется произвольный источник, SQL-функция игнорируется. |
| Числовой счётчик | Пузырь со значением отображается только для индикаторов, у которых настроена табличная SQL-функция или отдельная функция счётчика. Индикатор-ссылка без функции показывает только иконку и действие по клику. |
| Произвольные элементы | Для действия «Открыть список произвольных элементов» поле «Табличная функция SQL» нужно очистить, иначе индикатор в пользовательском режиме может стать некликабельным. |
⚠️ Если табличная функция не проверяет право просмотра косвенно через заказчика, исполнителя или подписку, добавляйте явную проверку через
UserTaskPermissions.⚠️ Псевдонимы вычисляемых колонок в возвращаемой таблице не должны совпадать с именами существующих колонок БД.
Функции-счётчики¶
Если заполнено поле SQLSPCountName, при refresh используется функция счётчика; пересчёт выполняется через UserMenuItemTickers_refresh. Поддерживаемые соглашения имён:
| Тип | Платформа | Сигнатура / результат |
|---|---|---|
_COUNT_IF |
MSSQL, PostgreSQL | Inline/table function, возвращает одну строку с cnt |
_COUNT_TF |
MSSQL | Процедурная table-valued function с @ret table(cnt int) |
_COUNT_FN |
MSSQL, PostgreSQL | Скалярная функция, возвращает int |
Минимальные шаблоны:
-- MSSQL inline counter
create or alter function dbo.fn_example_ticker_COUNT_IF(@UserID int)
returns table
as
return (
select cnt = count(*)
from dbo.Tasks t
join dbo.UserTaskPermissions utp on utp.TaskID = t.TaskID and utp.UserID = @UserID
where t.IsClosed = 0
);
-- MSSQL scalar counter
create or alter function dbo.fn_example_ticker_COUNT_FN(@UserID int)
returns int
as
begin
return (
select count(*)
from dbo.Tasks t
join dbo.UserTaskPermissions utp on utp.TaskID = t.TaskID and utp.UserID = @UserID
where t.IsClosed = 0
);
end;
-- PostgreSQL table counter
create or replace function dbo.fn_example_ticker_COUNT_IF(p_UserID int)
returns table(cnt int)
stable
as $$
select count(*)::int
from dbo.Tasks t
join dbo.UserTaskPermissions utp on utp.TaskID = t.TaskID and utp.UserID = p_UserID
where t.IsClosed = 0;
$$ language sql;
Частота обновления и оформление¶
| Параметр | Правило |
|---|---|
| Онлайн-пользователь | Частота обновления = «Время неактивности (мин)» / 5. |
| Офлайн-пользователь | Используется «Интервал обновления в оффлайне (мин)». |
| Набор иконок SPA | Иконки берутся из /spa/icons; имя пишется строчными буквами через подчёркивание, например calendar_today. |
| Цвет индикатора | Типовые схемы: белый на синем или белый на красном; CSS иконки имеет приоритет, если задан. |
Мобильный аналог тикера¶
В мобильном приложении веб-индикаторы не отображаются. Аналог настраивается как плитка рабочего стола:
- Создать источник данных задач.
- Проверить наличие шаблона
taskSourceDashboardItem. - В контейнере
Dashboardдобавить элемент «Синдикат». - Задать
Id = TaskSource{N}, где{N}— ID источника данных. - При необходимости скрывать пустую плитку через
hideOnZeroCount = 1.
⚠️ Для произвольных
TaskSource{N}-плиток счётчик может не рассчитываться. ПараметрыhideCounter,hideOnZeroCount,badgeItemColorи поле «Количество задач» влияют только на отображение уже полученного счётчика, но не включают расчёт счётчика для произвольного TaskSource. Для обязательного числового бейджа используйте системный синдикат, где счётчик поддержан платформой.
Mobile push: администрирование канала¶
Push для мобильного приложения относится к notifications-домену. Мобильный слой и endpoint-ы описаны в mobile.md, пользовательская логика push — в business.md.
| Настройка | Правило |
|---|---|
| Сертификаты iOS / APNs | Для приложения загружается файл сертификата и пароль. Если используется несколько самостоятельных мобильных приложений 1F Mobile, для каждого нужен отдельный сертификат. |
VOIP Сертификат, VOIP Пароль |
Поля устарели и не используются; их можно заполнять произвольными значениями, если форма требует значение. |
| Режим дебаг | Задаётся при добавлении/редактировании записи сертификата. |
| Android priorities | Устаревшая настройка. В новом режиме все Android push имеют повышенный приоритет. Android может начать блокировать high-priority push, если пользователь систематически их игнорирует. |
Быстрые ответы и умные подсказки¶
Быстрые ответы¶
Быстрые ответы — сохранённые тексты для повторного использования в сообщениях, причинах изменения срока и причинах запроса подписи. Ими можно управлять из административного интерфейса и из пользовательских персональных настроек.
| Поле / действие | Правило |
|---|---|
| Текст ответа | Содержимое, которое подставляется пользователю при выборе ответа. |
| Порядок | Меньшее значение выводится выше; ответы с одинаковым порядком сортируются по алфавиту. |
| Удаление | Доступно из формы ответа или из контекстного меню строки. |
Умные подсказки CannedResponses¶
Функция доступна начиная с версии 2.265 Цефей; текущий источник фиксирует ограничение «только для чатов». Подсказки показываются над полем ввода: длинные варианты — списком, короткие — чипами. Клик по варианту только копирует текст в поле ввода, автоматической отправки нет.
Настройка выполняется автоматизацией категории:
| Элемент | Значение |
|---|---|
| Смарт-событие | «Во время открытия задачи» |
| Смарт-действие | «Отправить сигнал» |
| Тип сигнала | CannedResponses |
| Текст сигнала | JSON с responses и TaskId |
{
"responses": [
"Здравствуйте! Чем могу помочь?",
"Опишите, пожалуйста, вашу задачу",
"Готово. Ваш запрос выполнен."
],
"TaskId": 123456
}
Подсказки отображаются пользователям, получившим сигнал, если у них в этот момент открыта задача из поля TaskId. При смене контекста беседы старые варианты сбрасываются.
Реакции на комментарии: административная настройка¶
Runtime API реакций описан в ../comments/backend.md. Здесь фиксируются настройки каталога реакций, которые не раскрыты в backend-документе.
| Таблица / поле | Назначение |
|---|---|
EmojiReactions.IsEnabledForComments |
1 включает реакцию в списке доступных для комментариев. |
EmojiReactions.OrderInGroup |
Порядок реакции внутри группы в интерфейсе выбора. |
EmojiReactions.SubGroupId |
ID группы реакции. |
EmojiReactionsGroup |
Справочник групп реакций. |
EmojiReactionsSubGroup |
Связь реакций с группами. |
LocalizedBusinessObjects, LocalizedBusinessObjectValues |
Локализованные название и описание реакции. |
Пример локализации названия:
declare @rowid int;
insert into dbo.LocalizedBusinessObjects ([Guid]) values (newid());
set @rowid = scope_identity();
update dbo.EmojiReactions
set LocalizedNameId = @rowid,
Name = N'Название реакции'
where Id = 1;
insert into dbo.LocalizedBusinessObjectValues (LocalizationId, LanguageId, [Value], [Guid])
values (@rowid, 1, N'Название реакции', newid()),
(@rowid, 2, N'Reaction name', newid());
Пример локализации описания:
declare @rowid int;
insert into dbo.LocalizedBusinessObjects ([Guid]) values (newid());
set @rowid = scope_identity();
update dbo.EmojiReactions
set LocalizedDescriptionId = @rowid,
Description = N'Описание реакции'
where Id = 1;
insert into dbo.LocalizedBusinessObjectValues (LocalizationId, LanguageId, [Value], [Guid])
values (@rowid, 1, N'Описание реакции', newid()),
(@rowid, 2, N'Reaction description', newid());
Дефолты новых пользователей: остаточные настройки¶
Большая часть пользовательских notification-флагов описана в business.md#пользовательские-настройки. Для администрирования дефолтов важно отделять их от уже созданных пользователей: настройки SystemRobot применяются к новым учётным записям, а массовое применение к существующим пользователям затрагивает всех пользователей.
| Блок | Правило |
|---|---|
| Лицензия 1 | Значения: «нет», «обычная», «конкурентная». Если лицензии нет или лимит исчерпан, пользователь/администратор получает сообщение. |
| «Сотрудник компании» | Отключённая настройка делает пользователя внешним: видимость пользователей ограничивается компанией, группы других пользователей не видны, отправка группе как адресату недоступна без права администратора категории. |
| Отправка по Enter | «Отправлять комментарий по Enter вместо Ctrl+Enter» влияет только на поле отправки сообщений, не на системные и дополнительные поля. |
| Автовопрос | «Не помечать коммент как вопрос автоматически» отключает автоматическую постановку признака вопроса по символу ?. |
CustomSettings — прочие ключи уведомлений¶
| Ключ | Тип / Default | Назначение |
|---|---|---|
MaxSMSLength |
int | Максимум символов в SMS, отправляемом из 1Формы. Символы сверх лимита обрезаются. Подбирать под тарифные ограничения SMS-провайдера |