Хочется простого: есть картинка на диске или в 1С, хочу её видеть в ячейке Google Sheets. На практике это три отдельных API-вызова, OAuth2-токен, и функция =IMAGE(), которая работает совсем не так, как кнопка «Вставить изображение» в интерфейсе браузера. Разберём весь путь за один раз.
Почему Sheets API не умеет вставлять картинки напрямую
Google Sheets API v4 оперирует данными ячеек — текстом, числами, формулами. «Вставить изображение в ячейку» в смысле embedded image (то, что в браузере делается через меню «Вставка → Изображение → В ячейку») через REST API в 2026 году всё ещё официально не поддерживается. Это боль всего сообщества.
Что работает через API:
- Функция
=IMAGE(url)— вставляет изображение по публичному URL. Это не настоящий embedded image, но визуально неотличимо. - Floating image через
batchUpdate— вставляет картинку как плавающий объект поверх ячеек (не в ячейку).
Самый практичный подход для 1С — загрузить изображение на Google Drive и вставить через =IMAGE().
Шаг 1: Получаем OAuth2-токен
Тебе нужен service account (сервисный аккаунт) в Google Cloud Console — это проще, чем OAuth2 для пользователей, потому что не требует браузерного редиректа.
Создаёшь сервисный аккаунт, скачиваешь JSON с ключом, и делишься с этим аккаунтом своим Spreadsheet («Дать доступ» → email сервисного аккаунта).
Получение токена из 1С (через JWT):
Функция ПолучитьТокенGoogleServiceAccount(ПутьКJSON)
ДанныеКлюча = ЗначениеИзСтрокиJSON(ПрочитатьФайл(ПутьКJSON));
// Формируем JWT
Заголовок = БазовоеКодированиеURL(ЗаписатьJSON(Новый Структура("alg,typ", "RS256", "JWT")));
ВремяСейчас = ТекущаяУниверсальнаяДатаВМиллисекундах() / 1000;
Payload = Новый Структура();
Payload.Вставить("iss", ДанныеКлюча["client_email"]);
Payload.Вставить("scope", "https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/spreadsheets");
Payload.Вставить("aud", "https://oauth2.googleapis.com/token");
Payload.Вставить("exp", ВремяСейчас + 3600);
Payload.Вставить("iat", ВремяСейчас);
// ... подпись через RSA-SHA256 с PrivateKey из JSON ...
// Используй компоненту подписи или готовую библиотеку с infostart
КонецФункции;
Подписать JWT в 1С напрямую непросто — нужна внешняя компонента или готовая библиотека. На infostart есть несколько бесплатных реализаций; ищи по «JWT 1С Google» — найдёшь рабочий код.
Шаг 2: Загружаем файл на Google Drive
Функция ЗагрузитьФайлNaDrive(Токен, ПутьКФайлу, ИмяФайла)
Соединение = Новый HTTPСоединение("www.googleapis.com", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
// Multipart-запрос: метаданные + бинарные данные
Граница = "boundary_1c_upload";
ЧастьМета = "--" + Граница + Символы.ПС
+ "Content-Type: application/json; charset=UTF-8" + Символы.ПС + Символы.ПС
+ "{""name"": """ + ИмяФайла + """}" + Символы.ПС;
ЧастьДанных = "--" + Граница + Символы.ПС
+ "Content-Type: image/jpeg" + Символы.ПС + Символы.ПС;
Конец = Символы.ПС + "--" + Граница + "--";
Заголовки = Новый Соответствие();
Заголовки["Authorization"] = "Bearer " + Токен;
Заголовки["Content-Type"] = "multipart/related; boundary=" + Граница;
// Собираем тело запроса (бинарные данные + текст)
// ...
Запрос = Новый HTTPЗапрос("/upload/drive/v3/files?uploadType=multipart", Заголовки);
Ответ = Соединение.ОтправитьДляПолучения(Запрос);
ДанныеОтвета = ЗначениеИзСтрокиJSON(Ответ.ПолучитьТелоКакСтроку());
Возврат ДанныеОтвета["id"]; // FileId на Drive
КонецФункции;
Шаг 3: Открываем доступ к файлу
Файл на Drive по умолчанию приватный. Нужно сделать его доступным по ссылке:
Процедура УстановитьПубличныйДоступ(Токен, FileId)
Соединение = Новый HTTPСоединение("www.googleapis.com", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
ТелоJSON = "{""role"": ""reader"", ""type"": ""anyone""}";
Заголовки = Новый Соответствие();
Заголовки["Authorization"] = "Bearer " + Токен;
Заголовки["Content-Type"] = "application/json";
Запрос = Новый HTTPЗапрос("/drive/v3/files/" + FileId + "/permissions", Заголовки);
Запрос.УстановитьТелоИзСтроки(ТелоJSON);
Соединение.ОтправитьДляПолучения(Запрос); // POST
КонецПроцедуры;
Шаг 4: Вставляем в ячейку через Sheets API
Процедура ВставитьИзображениеВЯчейку(Токен, SpreadsheetId, Лист, Ячейка, FileId)
URL = "https://lh3.googleusercontent.com/d/" + FileId;
Формула = "=IMAGE(""" + URL + """)";
ТелоJSON = "{""valueInputOption"":""USER_ENTERED"",""data"":[{""range"":"""
+ Лист + "!" + Ячейка + """,""values"":[[""" + Формула + """]]}]}";
Соединение = Новый HTTPСоединение("sheets.googleapis.com", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие();
Заголовки["Authorization"] = "Bearer " + Токен;
Заголовки["Content-Type"] = "application/json";
Запрос = Новый HTTPЗапрос("/v4/spreadsheets/" + SpreadsheetId + "/values:batchUpdate", Заголовки);
Запрос.УстановитьТелоИзСтроки(ТелоJSON);
Соединение.ОтправитьДляПолучения(Запрос);
КонецПроцедуры;
URL формата lh3.googleusercontent.com/d/{FileId} — это прямая ссылка на файл в Drive, которую принимает =IMAGE().
Ограничение: =IMAGE() загружает картинку при открытии таблицы, поэтому изображения при печати и экспорте в PDF могут не отобразиться, если нет интернета. Если нужна именно embedded картинка (для печати) — придётся использовать Google Apps Script, который это делает нативно, но вызвать его из 1С можно только через веб-хук.