Для взаимодействием с api гугл диска необходимо создать проект в Google, дать доступ и получить ключи. Данные действия в своей публикации я описывать не буду, более подробно написано в этой публикации //infostart.ru/public/651450/ или https://developers.google.com/drive/api/v3/about-sdk (официальная документация по апи гугл диска).
// Функция - Обновление токена
//
// Параметры:
// ClientId - Строка
// ClientSecret - Строка
// RefreshToken - Строка
//
// Возвращаемое значение:
// Структура. Ключи структуры: access_token,expires_in,access_lifetime,ОписаниеОшибки
//
Функция ОбновлениеТокена(ClientId, ClientSecret, RefreshToken)
СтруктураВозврата = Новый Структура("access_token,expires_in,access_lifetime,ОписаниеОшибки",
Неопределено, Неопределено, Неопределено, Неопределено);
ПараметрыЗапроса = "";
ПараметрыЗапроса = ПараметрыЗапроса + "client_id=" + ClientId;
ПараметрыЗапроса = ПараметрыЗапроса + "&client_secret=" + ClientSecret;
ПараметрыЗапроса = ПараметрыЗапроса + "&refresh_token=" + RefreshToken;
ПараметрыЗапроса = ПараметрыЗапроса + "&grant_type=refresh_token";
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Соединение = Новый HTTPСоединение("www.googleapis.com", , , , , ,ЗащищенноеСоединение);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Заголовки.Вставить("Content-Charset", "utf-8");
ОписаниеОшибки = "";
HTTPЗапрос = Новый HTTPЗапрос("/oauth2/v4/token", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрыЗапроса, КодировкаТекста.UTF8);
Результат = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
Если Результат.КодСостояния <> 200 И Результат.КодСостояния <> 204 тогда
СтрокаОтвет = Результат.ПолучитьТелоКакСтроку();
ВызватьИсключение СтрокаОтвет;
КонецЕсли;
ТекущаяДата = ТекущаяДата();
СтрокаОтвет = Результат.ПолучитьТелоКакСтроку();
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаОтвет);
ДанныеОтвет = ПрочитатьJSON(Чтение, Ложь);
Чтение.Закрыть();
Если Не ДанныеОтвет = Неопределено Тогда
Если ДанныеОтвет.Свойство("error") Тогда
ОписаниеОшибки = СтрШаблон(
"error=%1: %2",
ДанныеОтвет.error,
ДанныеОтвет.error_description
);
Иначе
СтруктураВозврата.access_token = ДанныеОтвет.access_token;
СтруктураВозврата.expires_in = ДанныеОтвет.expires_in;
СтруктураВозврата.access_lifetime = ТекущаяДата + Число(ДанныеОтвет.expires_in);
КонецЕсли;
Иначе
СтруктураВозврата.ОписаниеОшибки = НСтр("ru='Не получены данные от сервера!'");
КонецЕсли;
Возврат СтруктураВозврата;
КонецФункции
// Функция - Авторизация
//
// Параметры:
// AuthorizationCode - Строка
// ClientId - Строка
// ClientSecret - Строка
//
// Возвращаемое значение:
// Структура. Ключи структуры: access_token,expires_in,access_lifetime,refresh_token,ОписаниеОшибки
//
функция Авторизация(AuthorizationCode, ClientId, ClientSecret)
СтруктураВозврата = Новый Структура("access_token,expires_in,access_lifetime,refresh_token,ОписаниеОшибки",
Неопределено,Неопределено,Неопределено,Неопределено,Неопределено);
ПараметрыЗапроса = "";
ПараметрыЗапроса = ПараметрыЗапроса + "code=" + AuthorizationCode;
ПараметрыЗапроса = ПараметрыЗапроса + "&client_id=" + ClientId;
ПараметрыЗапроса = ПараметрыЗапроса + "&client_secret=" + ClientSecret;
ПараметрыЗапроса = ПараметрыЗапроса + "&redirect_uri=urn:ietf:wg:oauth:2.0:oob";
ПараметрыЗапроса = ПараметрыЗапроса + "&grant_type=authorization_code";
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Соединение = Новый HTTPСоединение("www.googleapis.com", , , , , ,ЗащищенноеСоединение);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
Заголовки.Вставить("Content-Charset", "utf-8");
ОписаниеОшибки = "";
HTTPЗапрос = Новый HTTPЗапрос("/oauth2/v4/token", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрыЗапроса, КодировкаТекста.UTF8);
Результат = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
Если Результат.КодСостояния <> 200 И Результат.КодСостояния <> 204 тогда
СтрокаОтвет = Результат.ПолучитьТелоКакСтроку();
ВызватьИсключение СтрокаОтвет;
КонецЕсли;
ТекущаяДата = ТекущаяДата();
СтрокаОтвет = Результат.ПолучитьТелоКакСтроку();
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаОтвет);
ДанныеОтвет = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();
Если Не ДанныеОтвет = Неопределено Тогда
Если НЕ ДанныеОтвет.Получить("error") = Неопределено Тогда
ОписаниеОшибки = СтрШаблон(
"error=%1: %2",
ДанныеОтвет.Получить("error"),
ДанныеОтвет.Получить("error_description")
);
Иначе
СтруктураВозврата.access_token = ДанныеОтвет.Получить("access_token");
СтруктураВозврата.expires_in = ДанныеОтвет.Получить("expires_in");
СтруктураВозврата.access_lifetime = ТекущаяДата + Число(СтруктураВозврата.expires_in);
СтруктураВозврата.refresh_token = ДанныеОтвет.Получить("refresh_token");
КонецЕсли;
Иначе
СтруктураВозврата.ОписаниеОшибки = НСтр("ru='Не получены данные от сервера!'");
КонецЕсли;
Возврат СтруктураВозврата;
КонецФункции
// Процедура - Обновить существующий файл на гугл диске
//
// Параметры:
// ПутьКФайлу - путь к файлу (данные файла, который необходимо обновить
// fileId - id файла на гугл диске, который необходимо обновить
// access_token - токен
// mimeType - "XLSX", "application/vnd.ms-excel
// "XLS", "application/vnd.ms-excel"
// "XLS95", "application/vnd.ms-excel"
// "XLS97", "application/vnd.ms-excel"
// "DOCX", "application/msword"
// "HTML", "text/html"
// "HTML3", "text/html"
// "HTML4", "text/html"
// "HTML5", "text/html"
// "ODS", "application/vnd.oasis.opendocument.spreadsheet"
// "PDF", "application/pdf"
//Другие типы можно посмотреть в документации к апи
//
Процедура ОбновитьСуществующийФайлНаГуглДиске(ПутьКФайлу, access_token, mimeType, fileId) Экспорт
Файл = Новый Файл(ПутьКФайлу);
boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
//Метаданные файла {{
Свойства = Новый Соответствие();
Свойства.Вставить("name", Файл.Имя);
Свойства.Вставить("mimeType", mimeType); // тип файла
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Свойства);
СтрокаМетаданныеФайла = ЗаписьJSON.Закрыть();
Поток = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(Поток);
ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/json; charset=UTF-8");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку(СтрокаМетаданныеФайла);
ЗаписьДанных.Закрыть();
ДвоичныеДанныеМетаданные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
//Метаданные файла }}
//Данные файла {{
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу); // двоичные данные файла
Поток = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(Поток);
ЗаписьДанных.ЗаписатьСтроку("Content-Type: " + mimeType);
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.Записать(ДвоичныеДанные);
ЗаписьДанных.Закрыть();
ДвоичныеДанныеФайла = Поток.ЗакрытьИПолучитьДвоичныеДанные();
//Данные файла }}
//Формирование тела запроса {{
ПотокТело = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(ПотокТело);
ЗаписьДанных.ЗаписатьСтроку("--" + boundary);
ЗаписьДанных.Записать(ДвоичныеДанныеМетаданные);
ЗаписьДанных.ЗаписатьСтроку("--" + boundary);
ЗаписьДанных.Записать(ДвоичныеДанныеФайла);
ЗаписьДанных.ЗаписатьСтроку("--" + boundary + "--");
ЗаписьДанных.ЗаписатьСтроку("--" + boundary + "--");
ЗаписьДанных.Закрыть();
ДвоичныеДанныеТело = ПотокТело.ЗакрытьИПолучитьДвоичныеДанные();
//формирование тела запроса }}
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + access_token);
Заголовки.Вставить("Content-Type", "Multipart/Related; boundary=" + boundary);
Заголовки.Вставить("Content-Length", Формат(ДвоичныеДанныеТело.Размер(), "ЧГ="));
HTTPЗапрос = Новый HTTPЗапрос("/upload/drive/v3/files/" + fileId + "?uploadType=multipart", Заголовки);
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеТело);
SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Соединение = Новый HTTPСоединение("www.googleapis.com",,,,,,SSL);
Результат = Соединение.Изменить(HTTPЗапрос);//patch запрос
Если Результат.КодСостояния <> 200 И Результат.КодСостояния <> 204 тогда
СтрокаОтвет = Результат.ПолучитьТелоКакСтроку();
ВызватьИсключение СтрокаОтвет;
КонецЕсли;
КонецПроцедуры
// Процедура - Обновить существующий файл на гугл диске
//
// Параметры:
// ПутьКФайлу - путь к файлу (данные файла, который необходимо обновить
// fileId - id файла на гугл диске, который необходимо обновить
// access_token - токен
// mimeType - "XLSX", "application/vnd.ms-excel
// "XLS", "application/vnd.ms-excel"
// "XLS95", "application/vnd.ms-excel"
// "XLS97", "application/vnd.ms-excel"
// "DOCX", "application/msword"
// "HTML", "text/html"
// "HTML3", "text/html"
// "HTML4", "text/html"
// "HTML5", "text/html"
// "ODS", "application/vnd.oasis.opendocument.spreadsheet"
// "PDF", "application/pdf"
//Другие типы можно посмотреть в документации к апи
//
Процедура ЗагрузитьФайлНаГуглДиск(ПутьКФайлу, access_token, mimeType) Экспорт
Файл = Новый Файл(ПутьКФайлу);
boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
//Метаданные файла {{
Свойства = Новый Соответствие();
Свойства.Вставить("name", Файл.Имя);
Свойства.Вставить("mimeType", mimeType); // тип файла
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Свойства);
СтрокаМетаданныеФайла = ЗаписьJSON.Закрыть();
Поток = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(Поток);
ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/json; charset=UTF-8");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку(СтрокаМетаданныеФайла);
ЗаписьДанных.Закрыть();
ДвоичныеДанныеМетаданные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
//Метаданные файла }}
//Данные файла {{
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу); // двоичные данные файла
Поток = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(Поток);
ЗаписьДанных.ЗаписатьСтроку("Content-Type: " + mimeType);
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.Записать(ДвоичныеДанные);
ЗаписьДанных.Закрыть();
ДвоичныеДанныеФайла = Поток.ЗакрытьИПолучитьДвоичныеДанные();
//Данные файла }}
//формирование тела запроса {{
ПотокТело = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(ПотокТело);
ЗаписьДанных.ЗаписатьСтроку("--" + boundary);
ЗаписьДанных.Записать(ДвоичныеДанныеМетаданные);
ЗаписьДанных.ЗаписатьСтроку("--" + boundary);
ЗаписьДанных.Записать(ДвоичныеДанныеФайла);
ЗаписьДанных.ЗаписатьСтроку("--" + boundary + "--");
ЗаписьДанных.ЗаписатьСтроку("--" + boundary + "--");
ЗаписьДанных.Закрыть();
ДвоичныеДанныеТело = ПотокТело.ЗакрытьИПолучитьДвоичныеДанные();
//формирование тела запроса }}
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + access_token);
Заголовки.Вставить("Content-Type", "Multipart/Related; boundary=" + boundary);
Заголовки.Вставить("Content-Length", Формат(ДвоичныеДанныеТело.Размер(), "ЧГ="));
HTTPЗапрос = Новый HTTPЗапрос("/upload/drive/v3/files?uploadType=multipart", Заголовки);
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеТело);
SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Соединение = Новый HTTPСоединение("www.googleapis.com",,,,,,SSL);
Результат = Соединение.ОтправитьДляОбработки(HTTPЗапрос);// post запрос
Если Результат.КодСостояния <> 200 И Результат.КодСостояния <> 204 тогда
СтрокаОтвет = Результат.ПолучитьТелоКакСтроку();
ВызватьИсключение СтрокаОтвет;
КонецЕсли;
КонецПроцедуры
В процедурах загрузки и обновления файлов передан не полный набор параметров (в данном коде передаются только те параметры, которые были необходимы мне при загрузке/обновлении файлов на гугл диске). При необходимости можно указать папку, в которую необходимо поместить файл, произвольное наименование файла, описание и т.д.
Официальная документация по созданию файла - https://developers.google.com/drive/api/v3/reference/files/create.
Официальная документация по обновлению существующего файла - https://developers.google.com/drive/api/v3/reference/files/update.
Данный программный код тестировался на версии платформы 8.3.17.1549.