Как настроить запрет закрытия задачи в Битрикс24, если есть невыполненные подзадачи?

Как я могу настроить Git "fedoseevvadim/bitrix24" для предотвращения закрытия задач, имеющих незавершенные подзадачи, в моей коробочной версии Битрикса? Я пошел по инструкции, но не могу добиться нужных результатов. Можете ли вы подсказать, какие шаги нужно предпринять или что нужно настроить в файлах, чтобы функция работала правильно?
  • 18 марта 2024 г. 2:49
Ответы на вопрос 2
Для того чтобы настроить запрет закрытия задачи в Битрикс24, если есть невыполненные подзадачи, необходимо внести следующие изменения:

1. Откройте файл /local/php_interface/init.php и добавьте следующий код:

```php
AddEventHandler("tasks", "OnBeforeTaskClose", "OnBeforeTaskCloseHandler");

function OnBeforeTaskCloseHandler($ID)
{
    $task = \Bitrix\Tasks\TaskTable::getById($ID)->fetch();
    $subtasks = \Bitrix\Tasks\Internals\TaskTable::getList(array(
        'filter' => array(
            'PARENT_ID' => $ID
        )
    ))->fetch();

    if (!empty($subtasks)) {
        foreach ($subtasks as $subtask) {
            if ($subtask['STATUS'] != 5) { // 5 - код статуса "Выполнено"
                global $APPLICATION;
                $APPLICATION->ThrowException("Задача не может быть закрыта, пока есть невыполненные подзадачи.");
                return false;
            }
        }
    }
}
```

2. Сохраните файл и перезапустите сервер.

После внесения указанных изменений, задача не сможет быть закрыта, пока у нее есть невыполненные подзадачи.
Этот пример вам не подойдет.  В нем иллюстрируется добавление пункта меню в сделки. 
Файл init.php создается вручную в папке `/local/php_interface/`. Но прежде чем делать это, почитайте про него в курсе
Бездумное использование этого файла может приводить к падению сайта в любом месте.
В вашем случае алгоритм действий такой:
1. Создать init.php
2. Чтобы его не засорять, в нем подключить файл, обрабатывающий события .
3. Вам нужны события задач
Пример подключения обработчика события(это не готовый пример для вас, его нужно изменить под себя):
\Bitrix\Main\EventManager::getInstance()->RegisterEventHandler(
    'tasks',
    'OnBeforeTaskUpdate',
    $this->MODULE_ID,
    '\MyCompany\Handlers\CTask',
    'OnBeforeTaskUpdate',
    "1"
);

Подробнее про 'RegisterEventHandler' тут
4. В этом обработчике вам нужно определять, является ли задача родительской. Если да, то запрашивать ее дочерние задачи и смотреть, если ли среди них открытые. Если да, то отменять событие закрытия задачи.
Список задач можно получить так
Похожие вопросы