Общая информация

Задачи в Битрикс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')) {
    // Модуль подключен, можно работать
}