Интеграция систем 1С с облачными хранилищами, такими как Microsoft SharePoint, становится стандартной задачей для современного разработчика. Однако при реализации взаимодействия через Microsoft Graph API часто возникают трудности, связанные со спецификой протокола HTTP и требованиями безопасности Microsoft. Одной из самых распространенных проблем является получение ошибки 404 Not Found при попытке загрузить файл, даже если авторизация прошла успешно. В этой статье мы детально разберем, как правильно настроить процесс отправки файлов, какие методы использовать и как обойти типичные ограничения платформы.
Разберем ситуацию: вы успешно получили Access Token от ресурса login.microsoftonline.com, сформировали адрес ресурса, указывающий на конкретную папку в SharePoint, но при вызове метода ОтправитьДляОбработки() сервер возвращает код состояния 404. Выясним причину такого поведения. В 1С метод ОтправитьДляОбработки() по умолчанию использует HTTP-метод POST. Однако спецификация Microsoft Graph API для прямой загрузки содержимого файла (Simple Upload) требует использования метода PUT.
Ошибка 404 в данном контексте часто означает не то, что сервер не найден, а то, что по указанному адресу (endpoint) не существует обработчика для метода POST. Путь к контенту файла в SharePoint через Graph API выглядит как /items/root:/имя_файла:/content, и именно для этого пути метод PUT является первичным для создания или обновления ресурса.
Проанализируем процесс подготовки файла. Просто указать путь к файлу в запросе часто недостаточно для корректной интерпретации сервером Microsoft. Рассмотрим правильный алгоритм подготовки тела запроса. Нам необходимо передать содержимое файла в виде двоичных данных. В 1С это реализуется через объект ДвоичныеДанные.
Посмотрим на пример кода, подготавливающего запрос:
// Создаем временный файл или берем существующий
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("Hello sharepoint");
ИмяФайла = ПолучитьИмяВременногоФайла("txt");
Текст.Записать(ИмяФайла);
// Читаем файл в двоичные данные
ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
Важно помнить, что если мы работаем в среде, где важна производительность (например, загрузка множества файлов на сервере), лучше использовать потоки, но для простых задач объект ДвоичныеДанные вполне подходит.
Теперь перейдем к самому ответственному моменту — отправке запроса. Поскольку нам нужен метод PUT, а стандартные методы HTTPСоединение типа ОтправитьДляОбработки или Добавить могут не подойти, воспользуемся универсальным методом ВызватьHTTPМетод(). Это позволит нам явно указать тип операции.
Рассмотрим пошагово реализацию кода:
АдресСервера = "graph.microsoft.com";
// Формируем ресурс, обязательно кодируя имя файла
ИмяФайлаНаСервере = "test_1c_file.txt";
АдресРесурса = "/v1.0/drives/" + DriveID + "/items/root:/" + ИмяФайлаНаСервере + ":/content";
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
Заголовки.Вставить("Content-Type", "text/plain"); // Указывайте соответствующий MIME-тип
ЗапросХТТП = Новый HTTPЗапрос(АдресРесурса, Заголовки);
// Устанавливаем тело запроса из двоичных данных
ЗапросХТТП.УстановитьТелоИзДвоичныхДанных(ДанныеФайла);
Соединение = Новый HTTPСоединение(АдресСервера, , , , , , Новый ЗащищенноеСоединениеOpenSSL());
// Используем ВызватьHTTPМетод для выполнения PUT
Результат = Соединение.ВызватьHTTPМетод("PUT", ЗапросХТТП);
Если Результат.КодСостояния >= 200 И Результат.КодСостояния < 300 Тогда
Сообщить("Файл успешно загружен!");
Иначе
Сообщить("Ошибка при загрузке: " + Результат.КодСостояния);
Сообщить(Результат.ПолучитьТелоКакСтроку());
КонецЕсли;
Проанализируем еще одну частую причину ошибки 404 — наличие кириллицы или пробелов в имени файла. SharePoint крайне чувствителен к корректности URL. Если ваше имя файла содержит русские буквы, путь в АдресРесурса станет невалидным. Чтобы этого избежать, обязательно используем функцию КодироватьСтроку.
Пример правильного формирования части пути:
ИмяФайлаСПробелом = "Мой отчет.txt";
ИмяФайлаЗакодированное = КодироватьСтроку(ИмяФайлаСПробелом, СпособКодированияСтроки.URLКодирование);
АдресРесурса = "/v1.0/drives/" + DriveID + "/items/root:/" + ИмяФайлаЗакодированное + ":/content";
Выясним важное ограничение: метод PUT с прямой передачей контента (Simple Upload), который мы рассмотрели выше, работает только для файлов размером до 4 МБ. Если ваша задача подразумевает передачу тяжелых PDF-документов или архивов, стратегия должна измениться. Для таких случаев Microsoft Graph API требует создания сессии загрузки (Upload Session).
Разберем алгоритм работы с большими файлами:
POST запрос на /items/root:/имя:/createUploadSession.uploadUrl — временную ссылку для загрузки.PUT на полученный uploadUrl, указывая в заголовке Content-Range, какие именно байты мы передаем.При работе в 1С версии 8.3.14 и выше мы можем значительно оптимизировать загрузку, не считывая весь файл целиком в оперативную память сервера. Это критично, если одновременно несколько пользователей загружают файлы. Вместо использования ДвоичныеДанные, мы проанализируем использование потоков.
Рассмотрим пример установки тела запроса из потока:
ФайлНаДиске = Новый Файл(ИмяФайла);
РазмерФайла = ФайлНаДиске.Размер();
ПотокЧтения = Новый ФайлПотока(ИмяФайла, РежимОткрытияФайла.Открыть);
ЗапросХТТП.УстановитьТелоИзПотока(ПотокЧтения);
// Обязательно указываем длину контента, чтобы сервер знал, когда закончить прием
ЗапросХТТП.Заголовки.Вставить("Content-Length", Формат(РазмерФайла, "ЧГ=0"));
Важный момент: использование потоков позволяет передавать данные напрямую с диска в сетевой сокет, что минимизирует риск возникновения ошибки Out of Memory на стороне сервера 1С.
Подводя итог, для стабильной работы интеграции 1С и SharePoint необходимо придерживаться следующих правил:
/content.createUploadSession, так как прямая загрузка просто прервется сервером по таймауту или лимиту.Используя данные методы и подходы, мы обеспечим надежную передачу документов из учетной системы 1С непосредственно в корпоративное хранилище SharePoint, минимизируя ошибки взаимодействия.