Розроблення модуля системи квитків для 1С-Bitrix
Підтримка через email-скриню працює, доки є лише один агент. Як тільки їх стає двоє — виникають проблеми: дублювання відповідей, втрата листів, неможливість відстежити історію переписки по конкретній проблемі, відсутність SLA. Вбудований Helpdesk у Bitrix24 вирішує задачу, але вимагає окремої ліцензії. Для сайту на 1С-Bitrix зі своїм особистим кабінетом потрібна своя система квитків, інтегрована з профілями користувачів та замовленнями.
Модель даних
Модуль 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 дні.







