При организации интеграции 1С с облачными сервисами разработчики часто сталкиваются с задачей регулярного обмена данными с таблицами Google Spreadsheets. На старых ресурсах можно встретить примеры с авторизацией через логин и пароль (протокол ClientLogin), однако такие решения больше не функционируют. Разберем актуальные архитектурные подходы и рабочие способы прямого взаимодействия 1С с Google Sheets API v4.
Проанализируем, почему типовые обработки прошлых лет перестали работать. Сервис Google полностью отключил устаревшие версии API (v1, v2, v3) и механизмы авторизации по открытой связке логин/пароль. Согласно современным требованиям безопасности:
Попытки передать учетные данные через параметры GET-запроса вызывают ошибку авторизации со стороны сервера. Рассмотрим подробнее, какими способами можно построить надежный обмен.
Этот способ является наиболее универсальным, так как не требует установки сторонних библиотек и работает исключительно на стандартных механизмах платформы 1С:Предприятие 8.3.
Разберем по шагам логику реализации:
refresh_token).refresh_token на временный access_token (срок жизни которого составляет 1 час).access_token в заголовке запроса выполняются вызовы методов API v4 для чтения и записи ячеек.Посмотрим на пример получения временного токена доступа из 1С:
СерверАвторизации = "oauth2.googleapis.com";
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
HTTPСоединение = Новый HTTPСоединение(СерверАвторизации, 443, , , , 30, ЗащищенноеСоединение);
ПараметрыЗапроса = "client_id=" + ИдентификаторКлиента +
"&client_secret=" + СекретКлиента +
"&refresh_token=" + ТокенОбновления +
"&grant_type=refresh_token";
HTTPЗапрос = Новый HTTPЗапрос("/token");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрыЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
ДанныеОтвета = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
ТокенДоступа = ДанныеОтвета.access_token;
Иначе
ВызватьИсключение "Ошибка авторизации: " + HTTPОтвет.ПолучитьТелоКакСтроку();
КонецЕсли;
После получения токена доступа выполним чтение диапазона ячеек из таблицы:
СерверAPI = "sheets.googleapis.com";
HTTPСоединение = Новый HTTPСоединение(СерверAPI, 443, , , , 30, ЗащищенноеСоединение);
ПутьКРесурсу = "/v4/spreadsheets/" + ИдентификаторТаблицы + "/values/" + ИмяЛиста + "!A1:Z100";
HTTPЗапрос = Новый HTTPЗапрос(ПутьКРесурсу);
HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
СтруктураДанных = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
МассивСтрок = СтруктураДанных.values;
Для Каждого СтрокаТаблицы Из МассивСтрок Цикл
// Обработка колонок текущей строки
КонецЦикла;
КонецЕсли;
Рассмотрим вариант авторизации, который идеально подходит для работы 1С в режиме автоматических фоновых заданий без участия интерактивного пользователя. При таком подходе создается сервисный аккаунт, генерируется закрытый ключ RSA, а таблица в Google расшаривается непосредственно на email сервисного аккаунта.
Особенность этого метода в 1С заключается в необходимости формирования и подписания JWT-токена алгоритмом RS256. Для подписи используется объект платформы МенеджерКриптографии с криптопровайдером, поддерживающим алгоритмы RSA, либо вспомогательные утилиты командной строки.
Если требуется обойти сложные процедуры шифрования и авторизации OAuth 2.0 непосредственно в коде 1С, эффективным решением выступает публикация скрипта Google Apps Script:
doGet(e) или doPost(e).HTTPСоединение к URL опубликованного скрипта.Проанализируем задачу, когда из Google Таблицы требуется только периодически считывать большие объемы информации. В этом случае удобно использовать эндпоинт экспорта:
/export?format=xlsx) и токеном авторизации в заголовках.
ТабличныйДок = Новый ТабличныйДокумент;
ТабличныйДок.Прочитать(ПутьКФайлуXLSX, ТипФайлаТабличногоДокумента.XLSX);
// Обход ячеек загруженного документа
Для НомерСтроки = 1 По ТабличныйДок.ВысотаТаблицы Цикл
ЗначениеЯчейки = ТабличныйДок.Область(НомерСтроки, 1).Текст;
КонецЦикла;
Для централизованной раздачи прав сотрудникам напрямую из учетной системы используется ресурс Permissions из Google Drive API. Отправляя HTTP-запросы из 1С, можно автоматизировать назначение ролей:
POST на адрес /drive/v3/files/{ID_таблицы}/permissions с передачей JSON-структуры, содержащей email сотрудника и его роль (reader или writer).DELETE по идентификатору разрешения.GET для актуализации списка пользователей в 1С.При реализации постоянного обмена следует учитывать ограничения сервиса:
batchGet и batchUpdate.access_token и время его окончания в параметрах сеанса или регистре сведений, чтобы не запрашивать новый токен при каждом обращении.