Как отправить файл из 1С в Microsoft SharePoint через Microsoft Graph API и избежать ошибки 404?

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

Интеграция систем 1С с облачными хранилищами, такими как Microsoft SharePoint, становится стандартной задачей для современного разработчика. Однако при реализации взаимодействия через Microsoft Graph API часто возникают трудности, связанные со спецификой протокола HTTP и требованиями безопасности Microsoft. Одной из самых распространенных проблем является получение ошибки 404 Not Found при попытке загрузить файл, даже если авторизация прошла успешно. В этой статье мы детально разберем, как правильно настроить процесс отправки файлов, какие методы использовать и как обойти типичные ограничения платформы.

Анализ причины ошибки 404 и выбор метода HTTP

Разберем ситуацию: вы успешно получили 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-запроса в 1С

Теперь перейдем к самому ответственному моменту — отправке запроса. Поскольку нам нужен метод 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";

Работа с файлами большого размера (более 4 МБ)

Выясним важное ограничение: метод PUT с прямой передачей контента (Simple Upload), который мы рассмотрели выше, работает только для файлов размером до 4 МБ. Если ваша задача подразумевает передачу тяжелых PDF-документов или архивов, стратегия должна измениться. Для таких случаев Microsoft Graph API требует создания сессии загрузки (Upload Session).

Разберем алгоритм работы с большими файлами:

  1. Отправляем POST запрос на /items/root:/имя:/createUploadSession.
  2. В ответ получаем uploadUrl — временную ссылку для загрузки.
  3. Разбиваем файл на части (chunks) кратные 320 КБ (рекомендация Microsoft).
  4. Отправляем каждую часть методом PUT на полученный uploadUrl, указывая в заголовке Content-Range, какие именно байты мы передаем.

Оптимизация потребления памяти через потоки

При работе в 1С версии 8.3.14 и выше мы можем значительно оптимизировать загрузку, не считывая весь файл целиком в оперативную память сервера. Это критично, если одновременно несколько пользователей загружают файлы. Вместо использования ДвоичныеДанные, мы проанализируем использование потоков.

Рассмотрим пример установки тела запроса из потока:


ФайлНаДиске = Новый Файл(ИмяФайла);
РазмерФайла = ФайлНаДиске.Размер();

ПотокЧтения = Новый ФайлПотока(ИмяФайла, РежимОткрытияФайла.Открыть);
ЗапросХТТП.УстановитьТелоИзПотока(ПотокЧтения);
// Обязательно указываем длину контента, чтобы сервер знал, когда закончить прием
ЗапросХТТП.Заголовки.Вставить("Content-Length", Формат(РазмерФайла, "ЧГ=0"));

Важный момент: использование потоков позволяет передавать данные напрямую с диска в сетевой сокет, что минимизирует риск возникновения ошибки Out of Memory на стороне сервера 1С.

Итоги и рекомендации

Подводя итог, для стабильной работы интеграции 1С и SharePoint необходимо придерживаться следующих правил:

Используя данные методы и подходы, мы обеспечим надежную передачу документов из учетной системы 1С непосредственно в корпоративное хранилище SharePoint, минимизируя ошибки взаимодействия.

← На главную