Как загрузить файл в задачу
Scope:
disk,taskКто может выполнять методы: чтобы пройти сценарий целиком, нужны права на добавление файла в папку Диска, редактирование задачи и чтение файла
- disk.folder.uploadFile — пользователь с правом «Добавление» для папки Диска
- tasks.task.files.attach — постановщик задачи или пользователь с правом редактирования задачи и чтения файла
- disk.attachedObject.get — пользователь с правом «Чтение» для файла
Выберите инструмент для разработки с AI-агентом:
- используйте Битрикс24 Вайбкод, чтобы создать приложение для Битрикс24 по описанию задачи без знания языков программирования. Агент напишет код и разместит приложение на сервере без ручной настройки хостинга
- используйте MCP-сервер, чтобы разрабатывать интеграцию через REST API в своем проекте. Агент будет обращаться к официальной REST-документации
В Битрикс24 есть два типа файловых полей:
- Файл. Поле не связано с Диском, в него файлы загружаются напрямую, через строку формата Base64
- Файл (диск). Поле связано с Диском, в поле хранится ID объекта Диска. Формат Base64 в поле не обрабатывается, поэтому сначала файл необходимо загрузить на Диск Битрикс24
Чтобы прикрепить файл в задачу, последовательно выполните два метода:
- disk.folder.uploadFile — метод загружает файл на Диск
- tasks.task.files.attach — метод прикрепляет файл Диска к задаче
1. Загружаем файл на диск Битрикс24
Для загрузки файла на Диск используем метод disk.folder.uploadFile с параметрами:
id— укажем значение1739— идентификатор папки Диска, в которую загружаем файлdata— укажем имя файлаNAME, с этим именем файл сохранится на Диске Битрикс24fileContent— передаем файл в формате ['имя_файла.расширение', 'файл в виде строки, закодированной в Base64']
Загрузка файла на Диск — необходимый шаг, так как поле UF_TASK_WEBDAV_FILES в задачах принимает только ID файлов Диска.
Как использовать примеры в документации
import { B24Hook } from '@bitrix24/b24jssdk'
const $b24 = B24Hook.fromWebhookUrl(process.env.B24_HOOK)
// B24_HOOK = 'https://your-domain.bitrix24.com/rest/USER_ID/TOKEN/'
const response = await $b24.actions.v2.call.make({
method: 'disk.folder.uploadFile',
params: {
id: 1739,
data: {
NAME: 'ava555.jpg'
},
fileContent: [
'avatar.jpg',
'/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAQDAwQDAwQEAwQ///+dAYq6YFKoAv/AFnAa6ArKv8AAtFJVppxCEAulxQ2DWgfMR//2Q=='
]
},
requestId: 'disk-uploadfile'
})
if (!response.isSuccess) {
throw new Error(response.getErrorMessages().join('; '))
}
const result = response.getData().result
from b24pysdk import BitrixWebhook, Client
token = BitrixWebhook(
domain="your-domain.bitrix24.com",
webhook_token="user_id/webhook_key",
)
client = Client(token)
result = client.disk.folder.uploadfile(
bitrix_id=1739,
data={
"NAME": "ava555.jpg",
},
file_content=[
"avatar.jpg",
"/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAQDAwQDAwQEAwQ///+dAYq6YFKoAv/AFnAa6ArKv8AAtFJVppxCEAulxQ2DWgfMR//2Q==",
],
).response.result
require_once 'vendor/autoload.php';
use Bitrix24\SDK\Services\ServiceBuilderFactory;
use Symfony\Component\EventDispatcher\EventDispatcher;
$serviceBuilder = (new ServiceBuilderFactory(new EventDispatcher(), $log))
->initFromWebhook('https://your-domain.bitrix24.com/rest/USER_ID/TOKEN/');
$result = $serviceBuilder->getDiskScope()->folder()->uploadFile(
1739,
['NAME' => 'ava555.jpg'],
[
'avatar.jpg',
'/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAQDAwQDAwQEAwQ///+dAYq6YFKoAv/AFnAa6ArKv8AAtFJVppxCEAulxQ2DWgfMR//2Q=='
]
);
echo '<PRE>';
print_r($result->getFile());
echo '</PRE>';
В результате загрузки файла на Диск получили два разных значения ID файла:
FILE_ID:28073— внутреннее значение ID файлаID:6687— ID объекта Диска, это значение используем в методах для работы с полями типа «файл (диск)»
Если в запросе для изменения поля «файл (диск)» передать значение FILE_ID, файл либо не прикрепится к задаче, поскольку нет объекта Диска с таким ID, либо прикрепится не тот файл
{
"result": {
"ID": 6687,
"NAME": "ava555.jpg",
"TYPE": "file",
"PARENT_ID": "1739",
"FILE_ID": 28073,
"SIZE": "405559"
}
}
2. Прикрепляем файл к задаче
Для прикрепления файла к задаче используем метод tasks.task.files.attach с параметрами:
taskId— ID задачи. Для получения значения ID используйте метод tasks.task.listfileId— укажем ID файла из результата предыдущего метода6687
const response = await $b24.actions.v2.call.make({
method: 'tasks.task.files.attach',
params: {
taskId: 3709,
fileId: 6687
},
requestId: 'task-files-attach'
})
if (!response.isSuccess) {
throw new Error(response.getErrorMessages().join('; '))
}
const result = response.getData().result
result = client.tasks.task.files.attach(
task_id=3709,
file_id=6687,
).response.result
$result = $serviceBuilder->core->call(
'tasks.task.files.attach',
[
'taskId' => 3709,
'fileId' => 6687
]
)->getResponseData()->getResult();
echo '<PRE>';
print_r($result);
echo '</PRE>';
Мы загрузили файл в задачу и в ответ получили ID связи между файлом Диска и задачей 423. Чтобы проверить прикрепление файла к задаче по ID связи, используем метод disk.attachedObject.get.
{
"result": {
"attachmentId": 423
}
}
Проверим результат
Передайте attachmentId из ответа метода tasks.task.files.attach в параметр id метода disk.attachedObject.get.
const checkResponse = await $b24.actions.v2.call.make({
method: 'disk.attachedObject.get',
params: {
id: result.attachmentId
},
requestId: 'disk-attached-object-get'
})
if (!checkResponse.isSuccess) {
throw new Error(checkResponse.getErrorMessages().join('; '))
}
console.log(checkResponse.getData().result)
file = token.call_method(
"disk.attachedObject.get",
{
"id": result["attachmentId"],
},
)["result"]
print(file)
$file = $serviceBuilder->core->call(
'disk.attachedObject.get',
[
'id' => $result['attachmentId']
]
)->getResponseData()->getResult();
print_r($file);
Метод вернет данные прикрепленного файла. Сценарий выполнен успешно, если:
IDсовпадает сattachmentIdиз предыдущего шагаOBJECT_IDсодержит идентификатор файла на ДискеENTITY_TYPEравенtasks_taskENTITY_IDравен идентификатору задачиNAMEсодержит имя прикрепленного файла
{
"result": {
"ID": "423",
"OBJECT_ID": "6687",
"MODULE_ID": "tasks",
"ENTITY_TYPE": "tasks_task",
"ENTITY_ID": "3709",
"NAME": "ava555.jpg",
"SIZE": "405559"
}
}
Ошибки и диагностика
Если метод вернул ошибку, проверьте данные запроса.
|
Ошибка |
Причина и решение |
|
|
Папка с указанным |
|
|
В |
|
|
Файл не удалось сохранить. Проверьте свободное место на Диске и корректность Base64 |
|
|
Пользователь вебхука не имеет прав на добавление файла в папку или чтение файла |
|
|
В |
|
|
Не передан обязательный параметр |
|
|
В |
|
Пустой результат проверки через disk.attachedObject.get |
Передан не |
Повторяйте сценарий с того шага, который вернул ошибку. Если файл уже загружен на Диск, не загружайте его повторно: исправьте taskId или fileId и повторите только вызов tasks.task.files.attach.