Как стать автором
Обновить

Как добавить задачу в план на день через API Bitrix24

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров722

Забегая вперёд, сразу скажу, через API - никак. Но есть возможность его обойти.

С чего всё началось

Прижало мне, значит, в рамках одного корпоративного проекта сделать возможность в Bitrix24 массово добавлять задачи в план на день.

Кто не знает, план на день — это такой виджет (или как его правильнее назвать), отображающий список задач, которые ты планируешь сегодня выполнить. Добавить в него можно только существующие и только свои задачи (и, как потом оказалось, не только свои). Функционал особенно удобен, если задач много, а времени в сутках на них не хватает. Приоритизируешь задачи и собираешь свой рабочий день. Короче штука классная, но явно недоработанная.

В идеале, мне нужен был метод, в котором можно передать ID пользователя и список задач для добавления. Но в документации API Bitrix24 ничего такого не нашлось. ChatGPT тоже ничего не нашёл кроме метода task.planner.getlist, возвращающего список задач из текущего плана. ИИшка ожидаемо придумала методы а-ля task.planner.add и task.planner.delete, и на серьёзных щах стала предлагать решения, которые "точно работают".

После нескольких безуспешных попыток и обращения в техподдержку Bitrix24, выяснилось, что таких методов и нет вовсе. Смотреть план смотри, но редактировать нельзя.

Но раз через интерфейс CRM задачи добавляются, значит механизм такой предусмотрен, просто нужно глубже копнуть. Через devtools расковырял скрипты, которыми добавляется задача в план. Выяснилось, что там всё завязано на сессии пользователя и извне добавить кому-то в план задачу нельзя. Не совсем то, что мне хотелось, но хорошо хоть так. 

POST-запрос в /bitrix/tools/intranet_planner.php создаёт задачу в плане юзера.
Нужно передать action, site_id и sessid.

Куки и сессию другого пользователя подставить в свой обработчик я не могу, а значит на стороннем ресурсе это выполнить нельзя, политика безопасности, все дела. Соответственно, выполнять действия нужно на домене CRMки. Но версия Bitrix24 у нас в компании облачная, поэтому редактировать её код возможности нет.

И единственный вариант, показавшийся мне подходящим — это сделать браузерное расширение, которое отлавливает в адресной строке определённый параметр и добавляет переданные в нём задачи в план.

Код выполняется на домене портала, ему доступны в BX‑методы, события и, главное, доступен sessid, а значит всё легально и почти удобно 🙂

Inject.js

(function () {
    const urlParams = new URLSearchParams(window.location.search);
    const raw = urlParams.get('set_to_plan');
  
    if (!raw) return;
  
    const taskIds = raw
      .split(',')
      .map(id => parseInt(id.trim(), 10))
      .filter(id => !isNaN(id));
  
    if (taskIds.length === 0) {
      console.warn('[Bitrix Planner Inject] Неверный список задач');
      return;
    }
  
    const run = async () => {
      const sessid = BX.bitrix_sessid();
      const currentUserId = parseInt(BX.message('USER_ID'), 10);
      const taskInfoList = [];
  
      for (const id of taskIds) {
        try {
          const result = await BX.ajax.runAction('tasks.task.get', {
            data: { taskId: id }
          });
          const task = result.data.task;
          if (parseInt(task.responsibleId, 10) === currentUserId) {
            taskInfoList.push({
              id: task.id,
              title: task.title,
              responsible: task.responsibleId
            });
          } else {
            console.log(`[Bitrix Planner Inject] Пропущена задача ${task.id} — ответственный другой пользователь`);
          }
        } catch (err) {
          console.warn(`[Bitrix Planner Inject] Не удалось получить задачу ${id}`, err);
        }
      }
  
      if (taskInfoList.length === 0) {
        console.log('[Bitrix Planner Inject] Нет задач для добавления (ни одна не принадлежит текущему пользователю)');
        removeSetToPlanFromUrl();
        return;
      }
  
      const postData = new URLSearchParams();
      taskInfoList.forEach((task, i) => postData.append(`add[${i}]`, task.id));
  
      fetch(`/bitrix/tools/intranet_planner.php?action=task&site_id=s1&sessid=${sessid}`, {
        method: 'POST',
        credentials: 'same-origin',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        },
        body: postData.toString()
      })
        .then(async resp => {
          const contentType = resp.headers.get("Content-Type") || "";
          if (resp.ok && contentType.includes("application/json")) {
            console.log('[Bitrix Planner Inject] Добавлены задачи:', taskInfoList);
            showToast(taskInfoList);
            removeSetToPlanFromUrl();
          } else {
            const text = await resp.text();
            console.warn('[Bitrix Planner Inject] Не-JSON ответ:', text);
          }
        })
        .catch(err => {
          console.error('[Bitrix Planner Inject] Ошибка запроса:', err);
        });
    };
  
    function showToast(taskList) {
      const content = taskList.map(t => `• ${t.title} (ID: ${t.id})`).join('<br>');
      if (BX && BX.UI && BX.UI.Notification && BX.UI.Notification.Center) {
        BX.UI.Notification.Center.notify({
          content: `Добавлены задачи в план:<br>${content}`,
          autoHideDelay: 5000,
          position: "top-right"
        });
      } else {
        console.log('[Bitrix Planner Inject]', content);
      }
    }
  
    function removeSetToPlanFromUrl() {
      const url = new URL(window.location.href);
      url.searchParams.delete('set_to_plan');
      window.history.replaceState({}, document.title, url.toString());
    }
  
    if (typeof BX !== 'undefined' && typeof BX.ready === 'function') {
      BX.ready(run);
    } else {
      console.warn('[Bitrix Planner Inject] BX не определён');
    }
  })();
  

Всё, что нужно, это перейти по ссылке вида: https://[ваш_портал].bitrix24.ru/company/personal/user/[ID_юзера]/tasks/?set_to_plan=[список_ID_задач]. Само собой нужно быть авторизованным в crm.

Обнаружив в строке параметр set_to_plan, скрипт обходит полученные задачи, сравнивает их исполнителя с ID пользователя в адресной строке. И если идентификаторы совпадают, добавляет задачу в план.

Если убрать проверку пользователя, то в план можно добавить любую существующую задачу. Никакого внутреннего механизма проверки в bitrix нет.

Рабочее расширение для Google Chrome и Яндекс браузера залил сюда, возможно кому-нибудь пригодится такая реализация. В других браузерах не проверял за ненадобностью.

Если интересно, зачем мне потребовалось массово добавлять задачи в план, то подписывайтесь на мой тг-канал и следите за обновлениями, расскажу там чуть позже :-)

Теги:
Хабы:
+1
Комментарии0

Публикации

Ближайшие события