Разработка модуля тикет-системы 1С-Битрикс
Поддержка через email-ящик работает до тех пор, пока нет нескольких агентов поддержки. Как только их двое — начинаются проблемы: дублирование ответов, потеря писем, невозможность отследить историю переписки по конкретной проблеме, отсутствие SLA. Встроенный Helpdesk в Bitrix24 решает задачу, но требует отдельной лицензии. Для сайта на 1С-Битрикс с собственным личным кабинетом нужна своя тикет-система, интегрированная с профилями пользователей и заказами.
Модель данных
Модуль vendor.tickets:
-
b_vendor_ticket— тикеты: id, number (человекочитаемый, T-2024-0001), user_id, subject, status (open/pending/resolved/closed), priority (low/normal/high/urgent), category_id, assigned_to (agent_id), order_id (опционально), first_response_at, resolved_at, created_at, updated_at -
b_vendor_ticket_message— сообщения в тикете: id, ticket_id, author_id, author_type (user/agent/system), body, is_internal (внутренняя заметка), created_at -
b_vendor_ticket_attachment— файлы: id, message_id, file_id -
b_vendor_ticket_category— категории: id, name, sort, default_assigned_to, sla_hours -
b_vendor_ticket_sla_breach— нарушения SLA: id, ticket_id, breach_type (first_response/resolution), breached_at
Создание тикета пользователем
class TicketService
{
public function create(int $userId, array $data): CreateResult
{
$number = $this->generateNumber(); // T-2024-0001, атомарный счётчик
$category = CategoryTable::getById($data['category_id'])->fetch();
$ticketId = TicketTable::add([
'NUMBER' => $number,
'USER_ID' => $userId,
'SUBJECT' => $data['subject'],
'STATUS' => 'open',
'PRIORITY' => $data['priority'] ?? 'normal',
'CATEGORY_ID' => $data['category_id'],
'ASSIGNED_TO' => $category['DEFAULT_ASSIGNED_TO'],
'ORDER_ID' => $data['order_id'] ?? null,
])->getId();
// Первое сообщение
MessageTable::add([
'TICKET_ID' => $ticketId,
'AUTHOR_ID' => $userId,
'AUTHOR_TYPE' => 'user',
'BODY' => $data['message'],
]);
// Уведомление агенту поддержки
$this->notifyAgent($ticketId);
return CreateResult::success($ticketId);
}
}
Переписка в тикете
Каждое следующее сообщение — новая запись в b_vendor_ticket_message. Агенты могут оставлять внутренние заметки (is_internal = 1), которые пользователь не видит, но видят другие агенты. При ответе агента:
- Статус тикета меняется на
pending(ожидаем ответа пользователя) - Записывается
first_response_at(если это первый ответ) - Пользователь получает email-уведомление
При ответе пользователя:
- Статус меняется на
open - Агент получает уведомление
SLA контроль
SLA задаётся на уровне категории (sla_hours). Агент проверяет каждые 15 минут:
public static function checkSlaBreaches(): void
{
$breachTime = (new DateTime())->modify("-{$category['SLA_HOURS']} hours");
$overdue = TicketTable::getList([
'filter' => [
'STATUS' => 'open',
'<=CREATED_AT' => $breachTime,
'FIRST_RESPONSE_AT' => false, // нет первого ответа
],
])->fetchAll();
foreach ($overdue as $ticket) {
SlaBreachTable::add([
'TICKET_ID' => $ticket['ID'],
'BREACH_TYPE' => 'first_response',
'BREACHED_AT' => new DateTime(),
]);
// Уведомляем руководителя поддержки
$this->notifySlaManager($ticket);
}
}
Назначение агентов и очереди
-
Автоназначение: при создании тикета агент выбирается по категории (поле
default_assigned_to) - Балансировка: если несколько агентов в очереди, выбирается тот, у кого меньше открытых тикетов
- Ручное переназначение: агент может передать тикет коллеге с указанием причины
Оценка качества поддержки
После перевода тикета в resolved пользователю отправляется ссылка для оценки:
GET /support/rate/?ticket=T-2024-0001&token=abc123&score=5
Токен одноразовый, срок жизни 7 дней. Оценки агрегируются в метрику CSAT по агенту и по категории.
Личный кабинет и административный интерфейс
Пользователь: список своих тикетов, статусы, переписка, открыть новый тикет, прикрепить файл.
Агент поддержки: входящие тикеты (своя очередь + неназначенные), фильтр по приоритету/категории/статусу, быстрые ответы (шаблоны), внутренние заметки, история изменений статусов.
Руководитель: дашборд — среднее время ответа, CSAT по агентам, количество нарушений SLA, нагрузка по агентам.
Сроки разработки
| Этап | Срок |
|---|---|
| ORM-таблицы, генератор номеров | 1 день |
| Создание тикетов, переписка | 2 дня |
| SLA-контроль, агент мониторинга | 2 дня |
| Назначение агентов, балансировка | 1 день |
| Оценка CSAT, токены | 1 день |
| Личный кабинет пользователя | 2 дня |
| Интерфейс агента поддержки | 3 дня |
| Дашборд руководителя | 1 день |
| Тестирование | 1 день |
Итого: 14 рабочих дней. Email-to-ticket (создание тикета из входящего письма) — дополнительно 2 дня.







