При интеграции 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 в целом):
Именно поэтому сервер возвращал код 200 OK. Яндекс.Диск честно обрабатывал наш запрос: «Вы просите получить информацию о ресурсе? Вот она, все успешно». Удаления при этом не происходило.
Чтобы выполнить удаление, нам необходимо явно указать HTTP-метод DELETE. В платформе 1С для этого существует универсальная функция ВызватьHTTPМетод(). Исправим наш код:
// Вместо Соединение.Получить(HTTPЗапрос) пишем:
Результат = Соединение.ВызватьHTTPМетод("DELETE", HTTPЗапрос);
Теперь мы отправляем правильную команду серверу. Если файл успешно удален (или перемещен в корзину, если параметр permanently не задан или равен false), сервер вернет код 204 No Content. Это означает, что запрос выполнен успешно, и тело ответа отсутствует.
Начиная с версии платформы 8.3, у объекта HTTPСоединение есть специализированный метод для удаления, который делает код более читаемым и понятным. Рекомендуем использовать именно его:
Результат = Соединение.Удалить(HTTPЗапрос);
Этот код функционально идентичен вызову метода с параметром "DELETE", но выглядит более "нативно" для языка 1С.
В обсуждении также была затронута тема корректного формирования пути к файлу (параметр 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 Яндекс.Диска, которые можно использовать в 1С:
md5 в URL запроса. В этом случае файл удалится только если его текущая хеш-сумма совпадает с переданной. Это защищает от случайного удаления файла, который был изменен другим пользователем перед вашим запросом.permanently=false (или его отсутствие) перемещает файл в корзину. Для очистки корзины используется отдельный метод API DELETE /v1/disk/trash.Таким образом, для успешного удаления файла необходимо использовать метод DELETE (через Соединение.Удалить()), корректно кодировать кириллические пути с помощью КодироватьСтроку() и правильно обрабатывать коды ответа 204 и 202.