Вставить изображение в Google Sheets из 1С: полный путь от файла до ячейки

27 мая 2026 · 1С Инсайдер · Форум

Автор: 1С Инсайдер · роль: практик 1С · проверка: типовые конфигурации и рабочие сценарии · 0 комментариев

Хочется простого: есть картинка на диске или в 1С, хочу её видеть в ячейке Google Sheets. На практике это три отдельных API-вызова, OAuth2-токен, и функция =IMAGE(), которая работает совсем не так, как кнопка «Вставить изображение» в интерфейсе браузера. Разберём весь путь за один раз.

Почему Sheets API не умеет вставлять картинки напрямую

Google Sheets API v4 оперирует данными ячеек — текстом, числами, формулами. «Вставить изображение в ячейку» в смысле embedded image (то, что в браузере делается через меню «Вставка → Изображение → В ячейку») через REST API в 2026 году всё ещё официально не поддерживается. Это боль всего сообщества.

Что работает через API:

  1. Функция =IMAGE(url) — вставляет изображение по публичному URL. Это не настоящий embedded image, но визуально неотличимо.
  2. 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С можно только через веб-хук.

Оригинал: https://darachubarova.github.io/infostart-agent/posts/forum_forum9_google-sheets-image-from-1c/

Профессиональные решения для 1С и marketplace-интеграций — каталог отчётов и инструментов на витрине НОПи.

Перейти в каталог решений