Комментарии — Администрирование¶
Настройка поведения комментариев в задачах: видимость, адресация, быстрые ответы, системные комментарии. Основная часть настроек живёт в категории (смежный домен categories). Для администраторов и специалистов поддержки.
Обзор¶
Администрирование комментариев опирается на два механизма:
- Редактор сущностей — схема
quickReply(шаблоны быстрых ответов) - Настройки категории — поля в
dbo.Subcategories, управляющие поведением комментариев
Собственных форм автоадминистрирования и API администрирования у домена нет.
Механизмы администрирования
Редактор сущностей
| Схема JSON | Таблица | Назначение |
|---|---|---|
quickReply |
dbo.QuickReplyTemplates | Шаблоны быстрых ответов для комментариев |
Настройки через смежный домен (categories)
Ключевые флаги поведения комментариев задаются в настройках категории (subcategories):
| Поле | Таблица | Что контролирует |
|---|---|---|
EnableComments |
dbo.Subcategories | Глобальное включение/выключение комментариев |
HideSystemComments |
dbo.Subcategories | Скрытие системных комментариев из пользовательской ленты |
ForwardCommentsToAllHelpers |
dbo.Subcategories | Автодобавление всех исполнителей в адресаты |
OneFMainVisibilityMode |
dbo.Subcategories | Ограничение видимости комментариев |
IsDeleteUserCommentsForbidden |
dbo.Subcategories | Запрет удаления пользовательских комментариев |
Ключевые настройки¶
Шаблоны быстрых ответов (QuickReplyTemplates)
Где настраивается: редактор сущностей → схема quickReply
Таблица БД: dbo.QuickReplyTemplates
Шаблоны быстрых ответов, доступные пользователям при написании комментария. Администратор создаёт набор стандартных фраз/ответов.
Как применяется: шаблоны доступны в интерфейсе комментирования через кнопку быстрого ответа.
Поведение комментариев в категории
Где настраивается: настройки категории (subcategories) → секция комментариев
Таблица БД: dbo.Subcategories
| Группа полей | Что контролирует |
|---|---|
| Включение комментариев | Доступность функции комментирования в задачах |
| Системные комментарии | Отображение автоматических комментариев (смена статуса, исполнителя и т.д.) |
| Адресация | Автоматическое добавление исполнителей в адресаты |
| Ограничения | Запрет удаления, режимы видимости |
Как применяется: учитывается при создании, отображении и удалении комментариев.
Видимость комментария
Таблица БД: dbo.CommentRecipients
Видимость комментария определяется не фактом записи в Comments, а наличием записи в CommentRecipients. Системные комментарии при HideSystemComments = true пишутся в БД, но не попадают в пользовательскую ленту.
Подписки на типы комментариев
Таблица БД: dbo.UserLentaCommentTypes
Пользователь фильтрует типы комментариев в своей ленте через настройки подписки.
CustomSettings — глобальные ключи комментариев¶
Глобальные настройки поведения комментариев:
| Ключ | Тип | Назначение |
|---|---|---|
FirstCommentIdWithNoRecipients |
int | ID комментария, начиная с которого адресаты больше не хранятся в теле комментария (с v2.240). Создан для совместимости с фоновой очисткой адресатов (ClearCommentRecipientsArchiveJob). Рекомендуется компаниям, работающим в веб-интерфейсе |
PostMarkAsAnsweredWithUserType |
bool / false |
Если true — комментарий «Как отвеченный» отмечается как пользовательский, а не системный. По умолчанию (false) — системный (как раньше) |
appsettings.json — кодировка комментариев
| Ключ | Тип | Назначение |
|---|---|---|
UseClassicEncodeInComments |
bool | Использовать классическую кодировку в комментариях. Включается при выявлении проблем с отображением спецсимволов в устаревших окружениях |
Типичные ошибки настройки¶
Частые проблемы и способы их диагностики:
| Симптом | Причина | Где проверить | SQL-диагностика |
|---|---|---|---|
| Комментарий отправлен, но его никто не видит | Нет записей в CommentRecipients |
dbo.CommentRecipients |
select * from dbo.CommentRecipients where CommentId = {commentId} |
| Системные комментарии исчезли из ленты | Включён HideSystemComments |
Настройки категории | select HideSystemComments from dbo.Subcategories where Id = {subcatId} |
| Исполнители не получают комментарии | Выключен ForwardCommentsToAllHelpers или неверная адресация |
Настройки категории | select ForwardCommentsToAllHelpers from dbo.Subcategories where Id = {subcatId} |
| Пользователь не может удалить свой комментарий | Включён IsDeleteUserCommentsForbidden |
Настройки категории | select IsDeleteUserCommentsForbidden from dbo.Subcategories where Id = {subcatId} |
| Тип комментария не виден в ленте | Пользователь отписался от типа | dbo.UserLentaCommentTypes |
select * from dbo.UserLentaCommentTypes where UserId = {userId} |
Детальная диагностика «Не вижу отправленный комментарий»
Причины (в порядке частоты):
- Комментарий системный +
HideSystemCommentsвключено - Пользователь не подписчик задачи → нет записи в
CommentRecipients - Тип комментария отключён в настройках подписки пользователя
- Smart Event заблокировал уведомление (
BeforeSendNotification) EnableCommentsвыключено /OneFMainVisibilityModeскрывает
SQL-диагностика:
-- 1. Проверить наличие комментария
select c.CommentID, c.TaskID, c.UserID, c.TypeID, c.IsDeleted, c.Content, c.Date
from Comments c
where c.CommentID = @commentId;
-- 2. Проверить адресатов
select r.UserID, u.FullName, r.IsUnread, r.IsRealRecipient, r.IsCopyRecipient, r.HasToAnswer
from CommentRecipients r
join Users u on u.UserID = r.UserID
where r.CommentID = @commentId
order by r.UserID;
-- 3. Проверить подписку на задачу
select s.UserID, s.IsDeleted
from MailSubscribersUsers s
where s.TaskID = @taskId and s.UserID = @userId;
-- 4. Проверить настройки категории
select sc.SubcatID, sc.HideSystemComments, sc.ForwardCommentsToAllHelpers, sc.EnableComments
from Subcategories sc
where sc.SubcatID = (select t.SubcatID from Tasks t where t.TaskID = @taskId);
Чеклист:
- Комментарий существует в
Comments? Не удалён (IsDeleted = 0)? - Есть запись в
CommentRecipientsдля данного пользователя? - Если нет — проверить
TypeID(системный?) +HideSystemComments - Если нет — проверить подписку пользователя на задачу
- Если нет — проверить Smart Events в категории (
BeforeSendNotification) - Если есть, но
IsUnread = false— проверить AutoRead настройки - Если всё корректно в БД — проверить доставку в реальном времени
«Комментарий виден заказчику, но не исполнителю»
Частая причина: ForwardCommentsToAllHelpers выключено — комментарий адресован конкретному исполнителю, а не всем.
«Системные комментарии не отображаются»
Причина: HideSystemComments = true в настройках категории. Системные комментарии записываются, но адресаты не создаются — никто их не видит в ленте.
Создание и форматирование комментариев через REST API¶
Создание через REST
# PascalCase обязателен
POST("/api/comments/add", {
"TaskId": 12345, # НЕ taskId (lowercase → поле игнорируется)
"CommentText": "текст"
}) # → {"data": commentId}
Вложение файлов в комментарий
# 1. Preupload
curl -s -X POST -H "1F-Pat: $PAT" \
-F "file=@path/to/file.md" \
"https://{host}/api/files/upload/ToPreUploadedFiles"
# → {"data": [{"preUploadFileId": 708072}]}
# 2. Комментарий с файлом: ключи предзагруженных файлов передаются в теле запроса
curl -s -X POST -H "1F-Pat: $PAT" \
-H "Content-Type: application/json" \
-d '{"TaskId": 123, "CommentText": "Текст", "PreUploadedFileKeys": ["708072"]}' \
"https://{host}/api/comments/add"
Форматирование
Подробности: text-formatting.md.
- Пишите обычный markdown (CommonMark/GFM). Особый синтаксис 1Формы не нужен — поддерживается стандарт.
- 1Форма-специфика:
__текст__это курсив, не жирный — для жирного используй**текст**((текст))— подчёркнутый (опционально)#TaskId— автоссылка на задачу,@user{UserId}— упоминание пользователя- Переносы строк — настоящий перевод строки (LF). Не
\nкак двусимвольный escape. - Списки
-/1.в веб-интерфейсе (лента, чат) отображаются как маркированный/нумерованный список; на iOS/Android — как обычный текст. - Заголовки, блоки кода, таблицы в веб-интерфейсе работают (с мая 2026), на iOS/Android — как обычный текст. Если комментарий важен для мобильных — используйте строчную разметку (
**жирный**,`код`) вместо блочной.
HTML-теги запрещены. Защита от XSS вырезает угловые скобки <TKey, TValue> — экранируйте их как <TKey, TValue> или используйте обратные кавычки.
Ссылки и типичные ошибки REST API¶
Ссылки на сущности — URL-паттерны
В комментариях URL автоматически кликабельны (веб-интерфейс, iOS, Android).
Shorthand (парсится системой)¶
Короткие формы ссылок, которые система распознаёт автоматически:
| Синтаксис | Результат | Пример |
|---|---|---|
#TaskId |
Ссылка на задачу | #12345 |
@user{UserId} |
Упоминание пользователя | @user42 |
Полные URL¶
Задачи и гриды:
| Сущность | URL |
|---|---|
| Задача | https://<host>/spa/tasks/{taskId} |
| Грид категории | https://<host>/spa/tasks/subcat/{subcatId}/grid |
| Канбан категории | https://<host>/spa/tasks/subcat/{subcatId}/kanban |
| Портал категории | https://<host>/spa/tasks/subcat/{subcatId}/portal |
Администрирование:
| Сущность | URL |
|---|---|
| Настройки категории | https://<host>/spa/administration/subcategory/{subcatId} |
| ДП категории (список) | https://<host>/spa/administration/ext-params-settings/subcat/{subcatId} |
| Конкретный ДП | https://<host>/spa/administration/ext-params-settings/{subcatId}/{extParamId} |
| SmartScripts | https://<host>/spa/administration/smart-scripts/{scriptId} |
| Пользователь (профиль) | https://<host>/spa/users/{userId}/info |
Правила:
- Задачи — ВСЕГДА короткая форма
#TaskId, не полный URL. Система автоматически формирует кликабельную ссылку. - Для остальных сущностей — полный URL. Подставляй реальные ID из контекста.
<host>— адрес вашего стенда 1Формы (на клиентских площадках домен свой, пути те же).
Типичные ошибки REST API
| Проблема | Причина | Решение |
|---|---|---|
POST /api/comments (без /add) |
Это GET-маршрут — возвращает 200 + 229KB task DTO | /api/comments/add |
POST /api/comments/post → 404 |
Нет такого маршрута | /api/comments/add |
taskId (camelCase) |
PascalCase обязателен | TaskId — иначе поле игнорируется |
| Комментарий в закрытую задачу | Система отклоняет операцию с ошибкой | Проверять IsClosed перед отправкой |
Реакции (emoji)¶
⚠️ Нет admin API для управления настройкой ReactionsEnabled. Включение/выключение реакций — только через SQL (таблица настроек). REST-маршруты (/api/comments/{id}/reactions/add, remove, GET) — только пользовательские операции.
Типы комментариев (TypeID)¶
Внутренние идентификаторы типов — используются в диагностике, смарт-событиях и фильтрах ленты.
Пользовательские типы
| TypeID | Описание | Создаётся |
|---|---|---|
| 3 | Пользовательский комментарий | Вручную пользователем |
| 6 | Комментарий из подзадачи | Автоматически при публикации в подзадаче |
| 10 | Вложение файла (без текста) | Пользователем через drag&drop файла |
| 20 | Внесение трудозатрат | Пользователем через форму трудозатрат |
Системные типы
| TypeID | Описание | Событие |
|---|---|---|
| 1 | Переход по маршруту | Смена шага/статуса задачи |
| 2 | Подпись (резолюция) | Согласование/подписание |
| 5 | Служебный | Различные системные действия |
| 7 | Изменение ДП или файлов | Изменение допараметра или файла |
| 8 | Создание задачи | Создание новой задачи |
| 9 | Изменение текста задачи | Редактирование описания |
| 11 | Смена категории | Перемещение задачи |
| 12 | Смена срока | Изменение дедлайна |
| 13 | Добавлен исполнитель | Назначение исполнителя |
| 15 | Добавлен подписчик | Добавление подписчика |
| 16 | Задача просрочена | Автоматически при просрочке |
| 18 | Смена заказчика | Изменение заказчика задачи |
| 19 | Удалён файл | Удаление файла |
Типы адресатов (CommentRecipients)¶
Поля, определяющие роль адресата комментария:
| Поле | Значение |
|---|---|
IsRealRecipient = true |
Явный адресат — выбран пользователем при отправке |
IsRealRecipient = false |
Неявный адресат / подписчик задачи без прямой адресации |
IsCopyRecipient = true |
В копии — получает сообщение, но без «непрочитанного» |
HasToAnswer = true per-recipient |
Получатель должен ответить (вопрос) |
Подписка при создании коммента (needSubscribe) → доступ к задаче → право на вложение¶
POST /api/comments/add принимает два флага подписки, которые интерфейс по умолчанию передаёт как true:
| Поле запроса | Что делает |
|---|---|
needSubscribe |
подписывает автора коммента на задачу |
needSubscriberOthers |
подписывает адресатов (RecipientIds) на задачу |
Подписка → доступ к задаче. Это важно за пределами видимости ленты: без доступа к задаче пользователь не может приложить файл к своему комментарию — система отклоняет вложение с ошибкой «Нет прав на вложение файлов или установлен запрет на создание вложений». Это сообщение вводит в заблуждение — реального запрета нет (право на вложение у задачи разрешено); не хватает именно подписки и доступа.
Важно при программном создании комментариев. Если комментарий создаётся в обход интерфейса (через API) без флагов needSubscribe/needSubscriberOthers, адресат, не являющийся участником задачи, становится получателем, но не подписывается — а значит, не получает доступ к задаче. На свежесозданных задачах это приводит к тому, что его вложение к ответу отклоняется (на задачах, где он уже участник, вложение работает — отсюда «на одних задачах работает, на других нет»). Чтобы этого избежать, при программном создании комментария передавайте оба флага подписки.
Автопрочтение: технические условия
Комментарий автоматически помечается как прочитанный если выполнено одно из условий:
- В профиле пользователя включена настройка автопрочтения (
User.AutoReadComments) - Пользователь исключён из адресатов смарт-событием (
BeforeSendNotification) - Для событий календаря — при выключенном уведомлении по событию (
CalendarEnableNotify) - По персональным настройкам уведомлений пользователя (
NotificationSettings)
Связанные документы¶
Смежные разделы:
- Форматирование текста — полные правила форматирования
- Комментарии — бизнес-логика — адресация, прочитано/непрочитано, треды
- Категории — администрирование — настройка категорий (поля комментариев в Subcategories)