Чтение и запись из таблиц гугл (google sheets) в табличный документ 1С (8.3, управляемые формы)


















Внешняя обработка на управляемой форме для 1С версии 8.3 для доступа к сервисам Google Sheets c использованием протокола авторизации OAuth 2.0. Выполняет получение списка листов таблицы гугл, чтение таблицы гугл в табличный документ 1С и запись из табличного документа 1С в таблицу гугл. Тестирование проводилось на платформе 1С:Предприятие 8.3 (8.3.11.2954).
Внимание! В обработке использовано 3 функции из БСП:
ОбщегоНазначенияКлиентСервер.СообщитьПользователю()
СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку()
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку() 

Обновление

18.05.18. Версия обработки 1.0.2.

Добавлена функция "Удалить строки". Демонстрация возможность удаления строк из таблицы Google указав определенный диапазон индексов строк для удаления.

Функции

  1. Авторизация в google используя протокол OAuth 2.0

    1. Запрос для получения authorization code ("Код доступа").

    2. Запрос для получения access_token и refresh token.

    3. Запрос для получения access_token используя refresh token.

  2. Взаимодействие из 1С с Google Sheets.

    1. Получение списка листов таблицы гугл

    2. Чтение данных из таблицы гугл и заполнение табличного документа 1С.

    3. Запись данных из табличного документа 1С в таблицу гугл.

  3. Дополнительно

    1. Сохранение параметров подключения и списка листов таблицы в данных формы.

    2. Условное представление элементов в зависимости от срока действия токена.

    3. Формирование ссылки для перехода к выбранному листу таблицы при выборе названия листа из списка.

Используемые источники

  1. В качестве основы были использованы обработки для обычных форм разработанные пользователем: echo77.

  2. Некоторая информация была получена из статей на infostart.ru.:

    1. Google Analytics API, Oauth2.0 и 1c8

    2. Получение доступа к скачиванию гугл-таблицы

  3. Информация с сайта гугл:

    1. Google API Console

    2. Using OAuth 2.0 to Access Google APIs

    3. Refreshing an access token (offline access)

Инструкция

Авторизация в google

Получить client ID and client secret

Необходимо используя Google API Console в рамках созданного проекта получить client ID and client secret

Запросить "Код доступа"

Для доступа к данным гугл необходимо при каждом запросе передавать access_token. При этом чтобы получить access_token, необходимо сначало получить authorization code "Код доступа".

В обработке на закладке “Параметры подключения”, при нажатии на “Запросить” — открывается окно браузера и выполняется переход на страницу авторизации гугл. При этом обязательно должны быть указаны “Client id” и “Client secret”, полученные на предыдущем шаге.

Код доступа можно использовать только один раз для получения access_token. Если access_token утерян, необходимо получить новый “Код доступа” который использовать для получения нового access_token (или использовать refresh token для получения нового access token)

Получить access_token

Любой запрос для доступа к данным требует указания access token-а в параметрах запроса. Для первичного получения “access token”, необходимы: “Client id”, “Client secret” и “Код доступа”.

“Aсcess token” имеет непродолжительное время жизни (3600 сек.).После окончания действия, необходимо:

— либо использовать refresh token и обновить access token

— либо опять повторить процесс: получить код доступа, используя новый код доступа — получить новый access token.

При нажатии "Получить" будет выполнен запрос для получения Аccess token и Refresh token, и будет рассчитан “Срок действия токена”

Запрос возвращает .json содержащий требуемую информацию, и токены заполняются в соответствующие поля на форме обработки:

После получения “Access token”, пока он действует можно обращаться к данным в гугл.

 

Обновить access_token используя refresh_token

После того как истек срок действия “access token” или раньше, можно использовать “refresh token”, чтобы получить новый access token, без использования браузера и получения кода доступа.

Существуют определенные ограничения на использование “refresh token” (подробности по ссылке)

Работа с таблицей гугл (Google Sheet)

Подключение к таблице и получение списка листов таблицы

Необходимо указать ссылку на таблицу гугл в строке “Ссылка на таблицу google”.

При указании ссылки, программа получит “ID таблицы”, выполнит подключение к таблице, прочитает список листов таблицы и заполнит список выбора для поля “Лист”.

При выборе листа из списка — формируется новый URL для доступ к таблице. По кнопке “открыть” выполняется переход в браузере к выбранному листу таблицы.

 

Чтение данных из таблицы гугл в табличный документ 1С

По кнопке “Прочитать таблицу” выполняется запрос, результат запроса обрабатывается и заполняется табличный документ

 

Запись данных табличного документа 1С в таблицу гугл

По кнопке “Записать таблицу” выполняется запрос в котором передается информация для записи в таблицу гугл.

18.05.18. Удаление строк из таблицы Google

Для удаления строк необходимо указать диапазон индексов С — ПО. Нумерация с 0-ля. Например для удаления 2-ой строки в таблице необходимо задать диапазон С = 1 ПО = 2.

 

 Под спойлером процедура демонстрирующая удаление строк:

 

60 Comments

  1. Dzenn

    Спасибо за такие возможности! Не скачивал (эту версию), но уверен, что хорошая, годная разработка. Пользователям 1С теперь доступны чтение/запись гугл таблиц, и это прекрасно.

    Reply
  2. Ko1t

    (1) И Вам спасибо за оценку 🙂

    Reply
  3. Артано

    Вмемориз

    Reply
  4. Duketm

    Хорошая работа. Спасибо. Актуальная вещь

    Reply
  5. UncleVader

    Круто, умница

    Reply
  6. Ko1t

    Артано Майаров, Евгений Сахненко, Вадим Скакун, спасибо коллеги 🙂

    Reply
  7. DrAku1a

    Респект! Очень пригодится!

    Reply
  8. Ko1t

    (7) Спасибо, Андрей!

    Reply
  9. starik-2005

    Не читал, но + )))

    Reply
  10. Ko1t

    (9) Спасибо, 🙂

    Reply
  11. logarifm

    Пробежался глазами — годный инструмент но не проверялеще. +

    Reply
  12. KAV2

    Smartsheet бы еще!

    Reply
  13. Ko1t

    (11) Заранее спасибо 🙂

    Reply
  14. Ko1t

    (12) Smartsheet судя по всему классная штука, но для меня на данный момент не актуальная 🙂

    Reply
  15. rintik

    Спасибо большое. Работает. Только не могу разобраться как удалять строки.

    Reply
  16. Ko1t

    (15) Пожалуйста ).

    Ссылка на пример запроса по удалению строк или колонок:

    https://developers.google.com/sheets/api/samples/rowcolumn#delete_rows_or_columns

    Reply
  17. rintik

    (16) Да пытаюсь разобраться, только у гугла для меня один ответ «»message»: «Invalid JSON payload received. Unknown name «requests»: Cannot find field.»,»

    Reply
  18. Ko1t
    Reply
  19. rintik

    (18) Круть. Еще раз спасибо большое.

    Reply
  20. kolya_tlt

    нравятся мне проекты ради проектов 🙂

    Reply
  21. Ko1t

    (20) как показывает практика, полученный в процессе опыт конвертируется в итоге в материальные и не только блага 🙂

    Reply
  22. user658699_heinrich2906

    Подскажите:

    1. Код обработки открытый?

    2. Реализована ли возможность формировать многостраничную гугл таблицу?

    3. Можно ли из обработки прописать пользователей (гугл), которым будет доступна созданная гугл таблица?

    Reply
  23. Ko1t

    (24)

    1. Код обработки открытый?

    > Да

    2. Реализована ли возможность формировать многостраничную гугл таблицу?

    > Нет

    3. Можно ли из обработки прописать пользователей (гугл), которым будет доступна созданная гугл таблица?

    > Нет

    p.s.

    Все что может обработка изложено в описании со скриншотами 🙂

    Reply
  24. leobrn

    Если считывать публичную таблицу обязательно ли нужны токены доступа?

    Reply
  25. Ko1t

    (26)

    Данная обработка при каждого обращении к данным передает в заголовке токен доступа.

    Какая авторизация нужна для чтения публичных и приватных данных, а также ответ на ваш вопрос можно получить по ссылке: https://developers.google.com/sheets/api/guides/authorizing

    Reply
  26. Ko1t

    (26)

    Данная обработка при каждом обращении к данным передает токен доступа.

    Я не проверял как будет происходить доступ к публичным данным, но почитать об этом можно по ссылке: https://developers.google.com/sheets/api/guides/authorizing

    Reply
  27. torch

    Запустил Вашу обработку. Не могу получить листы моей гугл-таблицы. Ошибка:

    {

    «error»: {

    «code»: 403,

    «message»: «Request had insufficient authentication scopes.»,

    «status»: «PERMISSION_DENIED»

    }

    }

    Судя по описанию жалуется на способ идентификации. Непонятно… Может сталкивались с этой ошибкой?

    Reply
  28. Ko1t

    (31)

    Добрый день, судя по ошибке есть какая-то проблема с токеном доступа который вы используете.

    Используемый вами токен доступа не позволяет обращаться к запрашиваемым данным.

    Я лично с такой ошибкой не сталкивался.

    Моя рекомендация будет, заново проделать настройки как это написано в разделе «Инструкция/Авторизация в google», сверяясь с приведенными скринами экрана.

    Reply
  29. torch

    Господа, еще один трабл. Я при каждом изменении остатков обновляю гугл-таблицу, но с определенного момента у клиентов в гугл-таблице перестали обновляться данные. У одного из них я почистил кеш и куки — все заработало. Но это не выход — клиентов много и всем объяснять нет возможности, писать инструкции без толку. Предполагаю что надо как-то снести все версии изменений гугл-таблицы и оставить только последнюю, актуальную версию, но не могу найти где это делается. Может кто-то сталкивался с такой проблемой?

    Reply
  30. Ko1t

    (33)

    Добрый день. Я пробовал искать решения по очистке истории…

    В основном сталкивался с такими ответами:

    https://productforums.google.com/forum/#!topic/docs/h_NWUzDL3Po

    Т.е. удалить историю нельзя программными способами.

    История очищается только если делать копию файла.

    Reply
  31. kassbar

    (31) «Request had insufficient authentication scopes» не задан ни один параметр scopes очевидно.

    Reply
  32. kassbar

    у кого есть рабочий пример как получать данные не диапазонами, а по отбору на значения в колонках ?

    например, получить все строки со значением в колонке А1 = 1.

    можно ли получить например только колонки А и С ?

    Reply
  33. kassbar

    а для чего такая сложная схема с идентификацией ? можно через постоянный API-ключ получать доступ:

    https://sheets.googleapis.com/v4/spreadsheets/idтаблицы/?key=АпиКлюч&includeGridData=true

    Reply
  34. Ko1t

    (37)

    а для чего такая сложная схема с идентификацией ?

    В рамках данной обработки реализован рекомендуемый Гуглом метод аутентификации OAuth 2.0 описанный по ссылке: https://developers.google.com/identity/protocols/OAuth2

    можно через постоянный API-ключ получать доступ

    Я не уверен что правильно понял, что вы имеете ввиду, но мне было бы интересно узнать подробнее.

    Сбросьте пжл. ссылки где можно изучить детали про такой способ подключения? Может быть он более простой, но менее безопасный?

    Reply
  35. kassbar

    (38)

    Я не уверен что правильно понял, что вы имеете ввиду

    я же написал запрос, которым можно получить доступ к опубликованной по ссылке таблице, зная ее id и свой apikey.

    вводите в этом запросе id таблицы, api-ключ гугла и получаете ее в json.

    Лично мне не требовалось вносить в нее изменения, только читать данные, поэтому я дальше не копал.

    Reply
  36. Ko1t

    (36)

    у кого есть рабочий пример как получать данные не диапазонами, а по отбору на значения в колонках ?

    например, получить все строки со значением в колонке А1 = 1.

    Судя повсему используя текущий API это не получиться сделать. Доступны только следующие возможности фильтации при запросе данных:

    https://developers.google.com/sheets/api/reference/rest/v4/DataFilter

    Что-то похожее можно сделать для данных отображаемых при просмотре используя Filters

    Возможно если программно выполнить SetBasicFilterRequest и затем чтение из таблицы, будут прочитанных отфильтрованные данные… надо пробовать.

    можно ли получить например только колонки А и С ?

    https://developers.google.com/sheets/api/guides/concepts#a1_notation

    https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchGetByDataFilter

    Судя по всему, что используя batchGetByDataFilter, можно задать отдельные dataFilters[], и получить только колонки А и С

    Reply
  37. kassbar

    (40)

    Возможно если программно выполнить SetBasicFilterRequest и затем чтение из таблицы, будут прочитанных отфильтрованные данные… надо пробовать.

    пробовал, через batchupdate ставил фильтры — не работает, возвращает всю таблицу.

    Как-то очень печально такое от гугла видеть.

    Пришлось через запросы «select…» к таблице получать нужные данные

    «https://docs.google.com/spreadsheets/d/id_таблицы/gviz/tq?tqx=out:html&tq=select*»

    выгрузить в csv: «tqx=out:csv»

    работает только для опубликованных «по ссылке» таблиц

    Reply
  38. kassbar

    Еще вопрос, получалось ли у кого-то выгрузить не публичный файл типа «таблица Гугл» (доступ открыт пользователю, публичной ссылки нет) через API GoogleDrive ?

    У меня запросы типа

    Новый HTTPЗапрос(«drive/v3/files/» +idТаблицы+»/export/?mimeType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet»)

    всегда возвращает ошибку «Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup».

    Подключил API Google+ и API Google Drive с областью действия «https://www.googleapis.com/auth/drive»

    Reply
  39. simy4

    Укажите пожалуйста в вашей публикации, что для функционирования обработки требуется наличие БСП. Для меня данное требование оказалось сюрпризом. Неприятным.

    Reply
  40. Ko1t

    (43) Добрый день.

    Да, действительно в обработке использовано 3 функции, которые входят в состав БСП:

    ОбщегоНазначенияКлиентСервер.СообщитьПользователю()

    СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку()

    СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку()

    Как мне кажется, основные сценарии использования данной обработки предполагают наличие данных функций в составе конфигурации, из которой данная обработка запускается.

    В противном случае, мне кажеться исправление проблемы занимает относительно мало времени.

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

    Но да, я согласен что следует упоминуть в описание обработки данный нюанс, что я и сделаю в ближайшее время.

    Reply
  41. German_Tagil

    Добавил в избранное…

    меня заинтерисовало — переходим на БП 3.0

    на КА 1.1 у меня была допиленная обработка https://infostart.ru/public/66842/

    Может кто-то находил подобное на УФ?

    Reply
  42. Ko1t

    (45) Добрый день, если я правильно понял что вам надо, то это функционал из БСП

    https://its.1c.ru/db/bsp302doc#content:1867:1

    5.18 Загрузка данных из файла
    Reply
  43. German_Tagil

    Доступ к данному материалу ограничен

    Reply
  44. Mogilnikova

    Добавила в избранное. Однажды ненастным днем оно мне пригодится!

    Reply
  45. German_Tagil

    (48) угу я точно также поступаю

    Reply
  46. Lera_1c

    Очень пригодилось! Все разжевано, благодарю!

    Reply
  47. Ko1t

    (50) Спасибо! 🙂

    Reply
  48. skyboy13

    А на автоматическое обновление таблицы в регламентных задачах ее заточить можно?

    Reply
  49. Ko1t

    (52) возможно для таких задач лучше подойдет такое решение как по ссылке https://infostart.ru/public/805071/ (хотя я сам лично пока его не изучал досконально)

    Reply
  50. Cthulhu

    (53) не т.е. если оттуда аккуратно «дернуть» блок авторизации и заменить в этом решении — то его можно будет использовать для регламентных заданий — я правильно понимаю?..

    Reply
  51. Ko1t

    (54) Для регламентных обработчиков, в теории (я не пробовал), я полагаю также можно использовать и OAuth 2.0 (именно его я использую в моей публикации).

    Сценарий при этом может быть такой:

    1. Интерактивно: Получаем Код доступа (требуется ручной ввод данных)

    2. Автоматически: Получаем и сохраняем access_token и refresh_token на основании Кода доступа

    3. Автоматически: По расписанию: Выполняем необходимую обработку данных в гугл таблицах, при этом контролируя время жизни access_token.

    4. Автоматически: При окончании срока действия: Обновляем access_token используя refresh_token

    5. Автоматически: Если что-то пошло не так: Отправляем оповещение на почту ответственному за процесс, чтобы он вмешался интерактивно, и например заново запросил Код доступа.

    6. Интерактивно: Если требуется: Переходим к Шаг-1.

    Reply
  52. Cthulhu

    (55) о. т.е. стартовое получение рефреш-токена дает возможность в дальнейшем в любое время (без повторного диалогового логина) программно получать свежий токен и с ним обновлять целевую гугл-таблицу, да? пожалуй, так и бум делать…

    а переноса форматирования нет — я правильно понимаю?.. наверное, оно и понятно — там нешуточное ковыряние в api команд подразумевается — поэтому, да?..

    и — спасибо огромное, очень толковое решение!

    Reply
  53. Ko1t

    (56)

    о. т.е. стартовое получение рефреш-токена дает возможность в дальнейшем в любое время (без повторного диалогового логина) программно получать свежий токен и с ним обновлять целевую гугл-таблицу, да?

    Да. Именно так. Полагаю всё должно заработать!

    p.s.

    Спасибо за оценку!

    Reply
  54. gdu199

    Можно ли сделать запись только определенных ячеек, чтобы не затереть работу, которую выполняют пользователи параллельно вручную?

    Reply
  55. Cthulhu
    Reply
  56. Cthulhu

    (59) спасибо всем, решено добавлением в заголовок описания:

    Заголовки.Вставить( «Content-Type», «application/json» );
    Reply
  57. Ko1t

    (58) Запись только определенных ячеек сделать можно. По ссылке можно посмотреть примеры как:

    https://developers.google.com/sheets/api/samples/writing

    Reply
  58. Cthulhu

    (60) прим.: и — кстати, во все заголовки запросов, в которых тело json-истое — впиндюрил явно этот параметр, дабы неповадно было исполнителю путаться из-за своих перекосов в распознавании типов по формату…

    Reply
  59. dityaanime

    Очень годная статья!

    Автор молодец!

    Reply
  60. Ko1t

    (63) Спасибо!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *