Как настроить чтение и запись Google Таблиц из 1С?

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

При организации интеграции 1С с облачными сервисами разработчики часто сталкиваются с задачей регулярного обмена данными с таблицами Google Spreadsheets. На старых ресурсах можно встретить примеры с авторизацией через логин и пароль (протокол ClientLogin), однако такие решения больше не функционируют. Разберем актуальные архитектурные подходы и рабочие способы прямого взаимодействия 1С с Google Sheets API v4.

Выясним причину неработоспособности старых методов

Проанализируем, почему типовые обработки прошлых лет перестали работать. Сервис Google полностью отключил устаревшие версии API (v1, v2, v3) и механизмы авторизации по открытой связке логин/пароль. Согласно современным требованиям безопасности:

  1. Для всех операций чтения и записи таблиц обязательно использование Google Sheets API v4.
  2. Авторизация запросов осуществляется исключительно по протоколу OAuth 2.0 либо через сервисные учетные записи (Service Account).

Попытки передать учетные данные через параметры GET-запроса вызывают ошибку авторизации со стороны сервера. Рассмотрим подробнее, какими способами можно построить надежный обмен.

Способ 1. Использование REST API с постоянным Refresh Token штатными средствами 1С

Этот способ является наиболее универсальным, так как не требует установки сторонних библиотек и работает исключительно на стандартных механизмах платформы 1С:Предприятие 8.3.

Разберем по шагам логику реализации:

  1. В консоли разработчика Google Cloud создается проект, активируются API Google Drive и Google Sheets, создаются учетные данные типа OAuth Client ID.
  2. Один раз в веб-браузере выполняется первичная авторизация пользователя для получения постоянного токена обновления (refresh_token).
  3. При выполнении регламентного или интерактивного обмена в 1С отправляется POST-запрос на сервер авторизации Google для обмена refresh_token на временный access_token (срок жизни которого составляет 1 час).
  4. С полученным 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;
    Для Каждого СтрокаТаблицы Из МассивСтрок Цикл
        // Обработка колонок текущей строки
    КонецЦикла;
КонецЕсли;

Способ 2. Использование сервисного аккаунта (Service Account)

Рассмотрим вариант авторизации, который идеально подходит для работы 1С в режиме автоматических фоновых заданий без участия интерактивного пользователя. При таком подходе создается сервисный аккаунт, генерируется закрытый ключ RSA, а таблица в Google расшаривается непосредственно на email сервисного аккаунта.

Особенность этого метода в 1С заключается в необходимости формирования и подписания JWT-токена алгоритмом RS256. Для подписи используется объект платформы МенеджерКриптографии с криптопровайдером, поддерживающим алгоритмы RSA, либо вспомогательные утилиты командной строки.

Способ 3. Использование промежуточного веб-скрипта (Google Apps Script)

Если требуется обойти сложные процедуры шифрования и авторизации OAuth 2.0 непосредственно в коде 1С, эффективным решением выступает публикация скрипта Google Apps Script:

  1. В целевой таблице открывается редактор скриптов и создается обработчик событий doGet(e) или doPost(e).
  2. Скрипт развертывается как веб-приложение (Web App) с правами выполнения от имени владельца таблицы и доступом «для всех пользователей».
  3. В 1С выполняется простой запрос через HTTPСоединение к URL опубликованного скрипта.
  4. Для обеспечения безопасности в запрос добавляется секретный ключ (токен), который скрипт проверяет перед отдачей или записью данных.

Способ 4. Прямое скачивание и разбор файлов XLSX или CSV

Проанализируем задачу, когда из Google Таблицы требуется только периодически считывать большие объемы информации. В этом случае удобно использовать эндпоинт экспорта:

  1. Формируется HTTP-запрос по адресу экспорта документа с указанием формата (/export?format=xlsx) и токеном авторизации в заголовках.
  2. Полученный бинарный файл сохраняется на диск или во временный файл.
  3. Чтение XLSX-файла выполняется платформой 1С напрямую без использования COM-объектов MS Excel:

ТабличныйДок = Новый ТабличныйДокумент;
ТабличныйДок.Прочитать(ПутьКФайлуXLSX, ТипФайлаТабличногоДокумента.XLSX);

// Обход ячеек загруженного документа
Для НомерСтроки = 1 По ТабличныйДок.ВысотаТаблицы Цикл
    ЗначениеЯчейки = ТабличныйДок.Область(НомерСтроки, 1).Текст;
КонецЦикла;

Управление правами доступа к таблицам из 1С

Для централизованной раздачи прав сотрудникам напрямую из учетной системы используется ресурс Permissions из Google Drive API. Отправляя HTTP-запросы из 1С, можно автоматизировать назначение ролей:

  1. Предоставление доступа: выполняется метод POST на адрес /drive/v3/files/{ID_таблицы}/permissions с передачей JSON-структуры, содержащей email сотрудника и его роль (reader или writer).
  2. Отзыв доступа: выполняется метод DELETE по идентификатору разрешения.
  3. Получение списка прав: выполняется метод GET для актуализации списка пользователей в 1С.

Рекомендации по оптимизации обмена

При реализации постоянного обмена следует учитывать ограничения сервиса:

  1. Лимиты на количество запросов (квоты): избегайте отправки отдельного HTTP-запроса на каждую строку или ячейку. Для чтения и записи нескольких диапазонов используйте пакетные методы API batchGet и batchUpdate.
  2. Кэширование токена: сохраняйте access_token и время его окончания в параметрах сеанса или регистре сведений, чтобы не запрашивать новый токен при каждом обращении.
  3. Сертификаты на Linux-серверах: при работе сервера 1С под управлением ОС Linux убедитесь, что корневые сертификаты безопасности установлены в доверенное системное хранилище.
← На главную