При интеграции 1С с облачными хранилищами, такими как Яндекс Диск, разработчики часто пытаются использовать стандартные файловые функции платформы напрямую по протоколу WebDAV. Например, передают URL-адрес каталога с учетными данными прямо в функцию НайтиФайлы. Однако в результате функция возвращает пустой массив, даже если каталог существует и содержит файлы. Разберем, почему возникает такое поведение платформы и какими способами можно гарантированно получить список файлов из облака.
Выясним причину такого поведения. Метод НайтиФайлы в платформе 1С:Предприятие предназначен исключительно для работы с файловой системой операционной системы. Он корректно обрабатывает:
C:\Folder\).\\server\share\folder\).Функция НайтиФайлы не поддерживает протоколы прикладного уровня HTTP и HTTPS, даже если в строке пути указан адрес WebDAV-сервера вида https://user:pass@webdav.yandex.ru/.... Платформа не выполняет сетевой запрос на сканирование структуры удаленного каталога и не генерирует исключение, а просто возвращает пустой массив. Кроме того, современные облачные сервисы блокируют авторизацию по основному паролю аккаунта и требуют использования специальных паролей приложений или токенов OAuth.
Рассмотрим вариант решения, предложенный в обсуждении: подключить облачное хранилище в операционной системе Windows как сетевой диск. Когда удаленная папка смонтирована в системе и ей присвоена буква диска (например, Y:), платформа 1С может работать с ней стандартными методами файловой системы.
После подключения диска в операционной системе мы можем вызвать поиск файлов обычным способом:
ПутьККаталогу = "Y:\1\";
МассивФайлов = НайтиФайлы(ПутьККаталогу, "*", Истина);
Для Каждого НайденныйФайл Из МассивФайлов Цикл
Если НайденныйФайл.ЭтоФайл() Тогда
Сообщить("Найден файл: " + НайденныйФайл.Имя + " (Размер: " + Строка(НайденныйФайл.Размер()) + " байт)");
КонецЕсли;
КонецЦикла;
Обратите внимание на важные ограничения данного подхода:
ragent работает в отдельной сессии под собственной сервисной учетной записью.Если нам необходимо надежное серверное решение, не зависящее от настроек рабочего места или сессии операционной системы, наиболее правильным подходом является использование официального REST API облачного провайдера. В этом случае мы работаем через платформенные объекты HTTPСоединение, HTTPЗапрос и ЧтениеJSON.
Разберем по шагам, как получить список файлов с помощью REST API:
Посмотрим на пример программной реализации:
ТокенOAuth = "ваш_oauth_токен";
СерверAPI = "cloud-api.yandex.net";
ПутьКаталога = "/1"; // Путь к папке на Диске
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
HTTPСоединение = Новый HTTPСоединение(СерверAPI, 443, , , , 30, ЗащищенноеСоединение);
АдресРесурса = "/v1/disk/resources?path=" + КодироватьСтроку(ПутьКаталога, СпособКодированияСтроки.КодировкаURL);
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
HTTPЗапрос.Заголовки.Вставить("Authorization", "OAuth " + ТокенOAuth);
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Вложенные элементы возвращаются в структуре _embedded.items
Если Данные.Свойство("_embedded") И Данные._embedded.Свойство("items") Тогда
Для Каждого Элемент Из Данные._embedded.items Цикл
Если Элемент.type = "file" Тогда
Сообщить("Файл: " + Элемент.name + ", Размер: " + Строка(Элемент.size));
ИначеЕсли Элемент.type = "dir" Тогда
Сообщить("Папка: " + Элемент.name);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Иначе
ВызватьИсключение "Ошибка получения списка файлов: " + Строка(HTTPОтвет.КодСостояния);
КонецЕсли;
Если требуется работать именно по протоколу WebDAV без подключения сетевых дисков ОС, мы можем отправить специализированный HTTP-запрос напрямую из 1С. По спецификации протокола WebDAV для получения содержимого директории используется метод PROPFIND с заголовком Depth.
Рассмотрим структуру такого вызова:
webdav.yandex.ru по защищенному каналу (порт 443).Authorization с типом Basic, используя логин и пароль приложения.Depth: 1, чтобы получить список файлов текущей папки без рекурсивного обхода всего диска.HTTPСоединение.ВызватьHTTPМетод("PROPFIND", HTTPЗапрос).207 Multi-Status с XML-документом, содержащим перечень узлов каталога, который затем можно разобрать с помощью объекта ЧтениеXML.Таким образом, для простых локальных сценариев допустимо быстро подключить облако как сетевой диск. Для стабильной промышленной эксплуатации и работы на сервере 1С следует использовать платформенное HTTPСоединение в связке с REST API или прямыми WebDAV-запросами.