Общая информация
Задачи в Битрикс24 — это единое пространство, которое помогает организовать работу команды: поручать небольшие задания и управлять крупными проектами. Здесь сотрудники обсуждают детали в чате и фиксируют результаты.
В рамках текущей документации мы будем рассматривать последнюю на момент написания статьи версию модуля: 26.0.0, но многие концепции и классы будут доступны уже с 25 версии.
Архитектура модуля
Если посмотреть на модуль “Задачи” (tasks), то можно заметить эволюцию подходов - от статических методов и ORM к построенной по паттерну CQRS (Command Query Responsibility Segregation) с использованием команды как основного механизма изменений состояния.
Визуально работу с модулем можно представить следующим образом: Слой представления работает с запросом и формирут команду, которую запускает. Команда в свою очередь отправляется в обработчик и обработчик работает с остальными слоями модуля.
┌─────────────────────────────────────────────────────┐
│ Слой Представления (Presentation) / REST API │
│ • Infrastructure/Rest/Controller/* │
│ • Infrastructure/Controller/* │
│ • Ваш код <!---- │
│ ↓ Вызывает команды │
├─────────────────────────────────────────────────────┤
│ Слой Команд (Commands) ← ГЛАВНЫЙ ПУБЛИЧНЫЙ API │
│ • Public/Command/* │
│ ↓ Отпарвляются в обработчики (Handlers) │
├─────────────────────────────────────────────────────┤
│ Слой бизнес-логики (Internal Services) │
│ • Internal/Service/* │
│ • Internal/Repository/* │
│ • Internal/Entity/* │
└─────────────────────────────────────────────────────┘
Пример создания задачи:
use Bitrix\Main\Loader;
use Bitrix\Tasks\V2\Public\Command\Task\AddTaskCommand;
use Bitrix\Tasks\V2\Internal\Entity\Task;
use Bitrix\Tasks\V2\Internal\Service\Task\Action\Add\Config\AddConfig;
use Bitrix\Tasks\V2\Internal\Entity\User;
use Throwable;
try {
Loader::requireModule('tasks');
$task = new Task(
title: 'Ручная задача',
description: '<p>Создана через код</p>',
responsible: new User(id: 1),
creator: new User(id: 1),
);
$config = new AddConfig(userId: 1);
$result = (new AddTaskCommand($task, $config))->run();
if ($result->isSuccess()) {
/**
* @var Bitrix\Tasks\V2\Internal\Entity\Task
*/
$taskEntityObject = $result->getObject();
echo "Создана задача #{$taskEntityObject->id}";
} else {
var_dump($result->getErrorMessages());
}
} catch (Throwable $e) {
// @todo Use error log instead of var_dump
var_dump($e);
}
Сравнение версий
Использование паттерна CQRS (Command Query Responsibility Segregation) может не всем понравиться - привычные “простые” действия разделяются в набор команд, которые необходимо конфигурировать вручную, но нельзя не обращать внимание на преимуещство нового подхода:
- Стабильный публичный интерфейс - все изменения внутри, никакого непредвиденного поведения.
- Более строгая валидация входных данных - предсказуемость на входе и на выходе.
- Единая точка входа (команда и провайдер) - не нужно знать много методов и искать потайные ходы для обхода авторизации.
- Централизованная обработка ошибок - не нужно гадать где вернуть результат, а где бросить исключение.
Структурирование
Для упрощения, все методы были классифицированы по следующим разделам:
- Поиск - работа с поиском задач и получением информации;
- Основные команды - создание, редактирование, копирование, удаление задач;
- Чек-листы - работа с чек-листами;
- Участники задач - работа с участниками задачи: наблюдателями, соисполнителями;
- Работа с файлами;
- Отображение и поведение - фиксация, изменения приоритетами, просмотры и т.п;
- Связи и зависимости;
- Гант;
- Чат;
- Другие - все что не вошло в другие разделы.
Перед использованием API
Перед использованием данного модуля необходимо явно подключать его к выполнению страницы, поскольку в зависимости от конкретной страницы, редакции Битрикс24 и установленных модулей, он может быть не установлен или не подключен.
use Bitrix\Main\Loader;
if (Loader::IncludeModule('tasks')) {
// Модуль подключен, можно работать
}