Как правильно удалить файл с Яндекс.Диска через API в 1С, если сервер возвращает код 200 вместо 204?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с облачными сервисами, такими как Яндекс.Диск, часто возникают ситуации, когда запросы, казалось бы, составлены верно согласно документации, но результат отличается от ожидаемого. Рассмотрим типичную проблему: мы пытаемся удалить файл через API, но вместо удаления получаем статус ответа 200 OK, а файл остается на месте.

Разберем подробно, почему так происходит, исправим ошибку в коде и рассмотрим правильные методы работы с HTTP-запросами на удаление в платформе 1С:Предприятие.

Анализ исходной проблемы

В исходном коде, который мы рассматриваем, была допущена логическая ошибка при выборе метода HTTP-запроса. Давайте взглянем на фрагмент кода, который вызывал вопросы:


HTTPЗапрос = Новый HTTPЗапрос("/v1/disk/resources?path=" + path + "&permanently=true", Заголовки);
Соединение = Новый HTTPСоединение("cloud-api.yandex.net",,,,,, ЗащищенноеСоединение);

// ОШИБКА ЗДЕСЬ:
Результат = Соединение.Получить(HTTPЗапрос); 

Мы видим использование метода Получить() у объекта HTTPСоединение. В терминологии протокола HTTP этот метод соответствует глаголу GET.

Согласно документации Яндекс.Диска (и принципам REST API в целом):

  1. Метод GET по адресу ресурса используется для получения метаданных (информации) о файле или папке.
  2. Метод DELETE используется непосредственно для удаления ресурса.

Именно поэтому сервер возвращал код 200 OK. Яндекс.Диск честно обрабатывал наш запрос: «Вы просите получить информацию о ресурсе? Вот она, все успешно». Удаления при этом не происходило.

Решение 1: Использование универсального вызова метода

Чтобы выполнить удаление, нам необходимо явно указать HTTP-метод DELETE. В платформе 1С для этого существует универсальная функция ВызватьHTTPМетод(). Исправим наш код:


// Вместо Соединение.Получить(HTTPЗапрос) пишем:
Результат = Соединение.ВызватьHTTPМетод("DELETE", HTTPЗапрос);

Теперь мы отправляем правильную команду серверу. Если файл успешно удален (или перемещен в корзину, если параметр permanently не задан или равен false), сервер вернет код 204 No Content. Это означает, что запрос выполнен успешно, и тело ответа отсутствует.

Решение 2: Использование специализированного метода платформы

Начиная с версии платформы 8.3, у объекта HTTPСоединение есть специализированный метод для удаления, который делает код более читаемым и понятным. Рекомендуем использовать именно его:


Результат = Соединение.Удалить(HTTPЗапрос);

Этот код функционально идентичен вызову метода с параметром "DELETE", но выглядит более "нативно" для языка 1С.

Важный нюанс: Кодирование URL (пути к файлу)

В обсуждении также была затронута тема корректного формирования пути к файлу (параметр path). В исходном примере использовалась ручная замена слэшей:


path = "disk:" + СтрЗаменить(path, "/", "%2F");

Такой подход является ненадежным и потенциально опасным. URL-адрес не должен содержать пробелов, кириллицы и множества спецсимволов в открытом виде. Если в имени вашего файла встретится пробел (как в примере finance lando) или русские буквы, простой замены слэшей будет недостаточно, и вы можете получить ошибку 400 (Bad Request) или 404 (Not Found).

Правильный способ — использовать встроенную функцию глобального контекста КодироватьСтроку(). Перепишем формирование запроса грамотно:


// Исходный путь, например: /finance lando/Остатки_23-05-2025.xlsx
ПутьКРесурсу = "/finance lando/Остатки_23-05-2025.xlsx";

// Кодируем путь согласно стандартам URL
ЗакодированныйПуть = КодироватьСтроку(ПутьКРесурсу, СпособКодированияСтроки.URLВКодировкеURL);

// Формируем итоговую строку запроса
// Обратите внимание: параметры запроса тоже лучше отделять ? и & аккуратно
СтрокаЗапроса = "/v1/disk/resources?path=" + ЗакодированныйПуть + "&permanently=true";

HTTPЗапрос = Новый HTTPЗапрос(СтрокаЗапроса, Заголовки);

Обработка ответов сервера

При работе с удалением файлов важно правильно обрабатывать коды ответов. Давайте напишем примерный алгоритм проверки результата:


Результат = Соединение.Удалить(HTTPЗапрос);

Если Результат.КодСостояния = 204 Тогда
    // Идеальный сценарий: файл удален, контента нет
    Сообщить("Файл успешно удален безвозвратно.");
    
ИначеЕсли Результат.КодСостояния = 202 Тогда
    // Асинхронное удаление (актуально для больших папок)
    // Сервер принял запрос, но удаление происходит в фоне
    Сообщить("Запрос на удаление принят, операция выполняется.");
    
ИначеЕсли Результат.КодСостояния = 404 Тогда
    Сообщить("Ошибка: Файл не найден, возможно, он уже был удален.");
    
Иначе
    // Обработка прочих ошибок
    Сообщить("Ошибка удаления. Код: " + Результат.КодСостояния);
    Сообщить("Тело ответа: " + Результат.ПолучитьТелоКакСтроку());
КонецЕсли;

Дополнительные параметры API

При удалении файлов полезно знать о дополнительных возможностях API Яндекс.Диска, которые можно использовать в 1С:

  1. Контроль версий (md5): Вы можете передать параметр md5 в URL запроса. В этом случае файл удалится только если его текущая хеш-сумма совпадает с переданной. Это защищает от случайного удаления файла, который был изменен другим пользователем перед вашим запросом.
  2. Корзина: Параметр permanently=false (или его отсутствие) перемещает файл в корзину. Для очистки корзины используется отдельный метод API DELETE /v1/disk/trash.

Таким образом, для успешного удаления файла необходимо использовать метод DELETE (через Соединение.Удалить()), корректно кодировать кириллические пути с помощью КодироватьСтроку() и правильно обрабатывать коды ответа 204 и 202.

← На главную