← Назад к заметкам

Заметки

Как сопоставить ufTaskWebdavFiles и реальные файлы Диска

Как сопоставить ufTaskWebdavFiles и реальные файлы Диска: Object ID, file ID, attached object.

Как сопоставить ufTaskWebdavFiles и реальные файлы Диска. Основной фокус: Object ID, file ID, attached object.

Задача

Разобрать задачу, комментарии, файлы или права в модуле задач без лишних обходных решений.

Задача — как сопоставить ufTaskWebdavFiles и реальные файлы Диска. Object ID, file ID, attached object.

Главное — не искать один универсальный метод, а сначала определить сущность, права и слой API, через который выполняется действие.

Как это устроено

В задачах важно отличать саму задачу, комментарии, чек-листы, файлы Диска и CRM-привязки. REST и старое PHP API часто возвращают разные формы одного и того же сценария.

Файлы задач хранятся через поле Диска. Значение вида n123 обычно указывает на объект Диска, а не на обычный ID файла из CFile.

Если сценарий проверяется под администратором, отдельно повторите его под обычным пользователем. Для прав, CRM, задач, Диска и приложений это часто даёт другой результат.

Рабочий подход

Сначала получите задачу от имени пользователя с реальным доступом, явно укажите нужные поля в select, а затем отдельно проверяйте комментарии, файлы и чек-листы. Не делайте вывод по администратору: у него картина прав обычно лучше, чем у обычного сотрудника.

Сделайте минимальный тест на одной сущности, сохраните входные данные и ответ метода, а затем расширяйте решение на массовый сценарий.

На коробке удобнее добавлять временное логирование рядом с местом выполнения кода, а в облаке — сохранять входящие и исходящие REST-запросы в свой журнал интеграции.

Частые ошибки

Частая ошибка — смотреть только ID задачи и забывать про права, scope приложения, поля UF_TASK_WEBDAV_FILES и доступ к файлам на Диске.

  • Проверять сценарий только под администратором и не видеть проблему прав обычного пользователя.
  • Смешивать ID разных сущностей: задачу, файл Диска, CRM-дело, товарную строку или пользователя.
  • Не логировать фактический запрос и ответ, из-за чего ошибка выглядит случайной.

Минимальный пример

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

$task_id = 123;
$user_id = 1;
$disk_object_id = 456;

$task = new CTaskItem($task_id, $user_id);
$task->update([
    'UF_TASK_WEBDAV_FILES' => ['n' . $disk_object_id],
]);