gifts2017

Пример работы с Google Documents List Data API

Опубликовал Nikolay (nsirotkin@mail.ru) в раздел Обмен - Обмен с другими системами

Простой пример работы с Google Docs из 1С V8.
Рассмотрены только некоторые простые операции: получение списка документов/коллекций, загрузка документа на сервер, установка прав доступа, удаление документа.

Это простой пример работы с Google Docs из 1С V8.

Рассмотрены только некоторые простые операции: получение списка документов/коллекций, загрузка документа на сервер, установка прав доступа, удаление документа.

Модификация документов средствами API мне не требовалась, и поэтому делать не пробовал.


Первым делом получаем идентификатор/параметр авторизации (authentication token)

ФайлИд = ПолучитьИмяВременногоФайла();                 
Соединение = Новый HTTPСоединение("www.google.com", , , , , Истина);
Соединение.Получить("accounts/ClientLogin?accountType=GOOGLE&service=writely&source=1C&Email=" + ИмяПользователя + "&Passwd=" +  Пароль, ФайлИд);

//writely,wise 
ФайлОтвета = Новый ТекстовыйДокумент;
ФайлОтвета.Прочитать(ФайлИд, "utf-8");
ПараметрАвторизации = ФайлОтвета.ПолучитьСтроку(3);

А дальше пытаемся управлять сервисом с помощью методов HTTPСоединения: ОтправитьДляОбработки(Put), Получить(Get), Удалить(Delete).


Например, чтобы опубликовать документ Excel

Файл = Новый Файл(ИсточникИмяФайла);
РазмерФайла = Файл.Размер();
ИмяФайла = Файл.Имя;
Файл = Неопределено;
 
СайтУРЛ = "docs.google.com";
УРЛ = "feeds/default/private/full";
РезультатИмяФайла = ПолучитьИмяВременногоФайла();
//ПараметрАвторизации = ПолучитьПараметрАвторизации(); 
 
Соединение = Новый HTTPСоединение(СайтУРЛ, , , , , Истина);//"spreadsheets0.google.com"
 
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "GoogleLogin auth=" + Сред(ПараметрАвторизации, 6));
Заголовки.Вставить("GData-Version", "3.0");
Заголовки.Вставить("Content-Length", Формат(РазмерФайла, "ЧГ="));
Заголовки.Вставить("Content-Type", "application/vnd.ms-excel");
Заголовки.Вставить("Slug", ИмяФайла);
                               
//Теперь можно отправлять GET или POST запросы гугловскому API.
//Отправка POST Запроса
Соединение.ОтправитьДляОбработки(ИсточникИмяФайла, УРЛ, РезультатИмяФайла, Заголовки);

В результате выполнения команды получаем XML-документ (структура файла документирована).

Из файла ответа можно вытащить идентификатор ресурса (resourceId), выглядит как строка вида «0ApemGBzasF4MdC1WaEE1UGxDYjlnWUxDdTRlbDZzdEU».

Если нужно добавить документ в существующую коллекцию (папку), то URL должен содержать идентификатор папки

УРЛ = "feeds/default/private/full" + "/folder%3A0B5emGBzasF4MZmViYTJjNmMtNGI0ZS00YmMzLWIzYmYtYzIzMDhlYmUwMzlR/contents";
//Здесь «0B5emGBzasF4MZmViYTJjNmMtNGI0ZS00YmMzLWIzYmYtYzIzMDhlYmUwMzlR» это идентификатор папки.

А теперь удалим документ

СайтУРЛ = "docs.google.com";
УРЛ = "feeds/default/private/full/" + ИдентификаторДокумента + "";//?delete=true
 //ПараметрАвторизации = ПолучитьПараметрАвторизации(); 
Соединение = Новый HTTPСоединение(СайтУРЛ, , , , , Истина);//"spreadsheets0.google.com"
 
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "GoogleLogin auth=" + Сред(ПараметрАвторизации, 6));
Заголовки.Вставить("If-Match", "*");//If-Match: 
Заголовки.Вставить("GData-Version", "3.0");
                               
//Теперь можно отправлять GET или POST, DELETE запросы гугловскому API.
Соединение.Удалить(УРЛ, Заголовки);//feeds/spreadsheets/private/full

Получим список документов (и коллекций)

СайтУРЛ = "docs.google.com";
УРЛ = "feeds/default/private/full";
//УРЛ = "feeds/default/private/full/-/folder";
//GET /feeds/default/private/full/-/folder
//GET /feeds/default/private/full?showfolders=true
 
РезультатИмяФайла = ПолучитьИмяВременногоФайла();
//ПараметрАвторизации = ПолучитьПараметрАвторизации(); 
 
Соединение = Новый HTTPСоединение(СайтУРЛ, , , , , Истина); //"spreadsheets0.google.com"
 
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "GoogleLogin auth=" + Сред(ПараметрАвторизации, 6));
Заголовки.Вставить("GData-Version", "3.0");
                               
//Теперь можно отправлять GET или POST запросы гугловскому API.
//Например получение списка spreadsheets через GET:
Соединение.Получить(УРЛ, РезультатИмяФайла, Заголовки); //feeds/spreadsheets/private/full

Подробности смотреть в http://code.google.com/intl/ru-RU/apis/documents/docs/3.0/developers_guide_protocol.html

 
Обработка для 1C 8.2 во вложении к публикации - это просто заготовка, на которой изучалась/проверялась работа с API.


PS: Google Docs & Spreadsheets (сервисы writely, wise) изначально разные продукты (созданные в разное время), похоже Google немножко менял API и некоторые примеры из интернета не работают.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
GoogleDocsAPI Test
.epf 13,02Kb
10.07.11
152
.epf 13,02Kb 152 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

0. Nikolay (nsirotkin@mail.ru) 11.07.11 10:11
Простой пример работы с Google Docs из 1С V8.
Рассмотрены только некоторые простые операции: получение списка документов/коллекций, загрузка документа на сервер, установка прав доступа, удаление документа.


Перейти к публикации

1. Андрей Данилюк (DanilaDru) 11.07.11 10:11
Занимался в начале года, выгружал данные в таблицу. http://danila.org.ua/?p=1166
Кстати, расскажите, какое было практическое применение данного функционала, если не секрет.
2. NikNik (nsirotkin@mail.ru) 11.07.11 16:23
Возможное назначение (примерно как и у вас) опубликовать документ и отправить по электронной почте ссылку для ознакомления, при необходимости удалить публикацию.
Например: акт сверки для контрагента, расчетный листок для сотрудника, продажи/остатки/взаиморасчеты для менеджера.
Выглядит достаточно просто/удобно и не нужно городить web доступ.

Искал по форуму и в интернете, но ваш пример не видел. ПолучитьCOMОбъект("", "Microsoft.XMLHTTP") хоть какие то преимущества дает?
3. Андрей Данилюк (DanilaDru) 12.07.11 09:57
(2)не помню чтобы в ходе реализации я получил преимущества :) по-моему у меня наблюдались некоторые проблемы под веб клиент и было решено сделать так.
4. naus (Danil.Potapov) 13.07.11 21:08
интересно, как узнал, что в методах Записать, ОтправитьДляОбработки, Удалить параметр Заголовки может быть не строкой а соответствием?
5. NikNik (nsirotkin@mail.ru) 14.07.11 05:04
Хм. Действительно синтаксис помощник говорит тип параметра «Строка».
Я подсмотрел в форуме 26.10.2010 Капралов Александр (1С) приводил пример авторизации в Гугл АПИ http://partners.v8.1c.ru/forum/thread.jsp?id=852626#852626
6. Александр Алюев (alyuev) 20.07.11 11:49
Интересно, а как на семерке (v7.7) отправить файл?
7. NikNik (nsirotkin@mail.ru) 21.07.11 10:26
(6) Наверное можно попробовать так http://forum.mista.ru/topic.php?id=105730

objHTTP = createObject("Microsoft.XMLHTTP");
//Пример отправки строки:
Попытка
objHTTP.open("POST",Адрес,0);
objHTTP.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
objHTTP.send(Источник);
8. Евгений Добрынин (CTDEVIce) 10.10.11 12:55
А как сделать POST-запрос с передачей параметров в файле? Что-то никак не получается.
9. NikNik (nsirotkin@mail.ru) 11.10.11 20:13
(8) CTDEVIce,

POST=ОтправитьДляОбработки
В примере есть функция УстановитьПраваДоступа.
10. Евгений Добрынин (CTDEVIce) 12.10.11 18:11
Ага, вроде как понял. Попробую.
11. Владимир Лышенко (vovche) 18.10.11 16:33
12. Игорь Нешик (ineshyk) 09.07.13 12:49
было бы здорово увидеть пример работы 1c и tasks api
13. NikNik (nsirotkin@mail.ru) 09.07.13 16:09
(12) ineshyk

Работа с REST web сервисом edostavka.ru, пример POST запроса с параметрами
http://infostart.ru/public/84674/

Google Tasks API
https://developers.google.com/google-apps/tasks/

:)

Самому тоже интересно, но в ближайшем будущем туда не полезу.
1С проводили опрос в коференции по интеграции с другими системами, и поддержку REST web сервисов у них попросили.
14. Игорь Нешик (ineshyk) 09.07.13 16:42
(12)
необходимость работы с Rest сервисами и json-объектами я поднимал на партнерке,
пока изучают вопрос.

за ссылки спасибо, документацию пока читаю, но там не совсем понятно с авторизацией и как использовать области (scope), например, такую https://www.googleapis.com/auth/tasks при авторизации пока не могу понять.


пока есть такой код получения списка задач:

[CODE ]СайтУРЛ = "www.googleapis.com/tasks/v1";
УРЛ = "/users/@me/lists?maxResults=10&key="+YOUR_API_KEY;

РезультатИмяФайла = ПолучитьИмяВременногоФайла();

Соединение = Новый HTTPСоединение(СайтУРЛ, , , , , Истина);

Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + Сред(ПараметрАвторизации, 6));
Заголовки.Вставить("X-JavaScript-User-Agent", "Google APIs Explorer");

//Теперь можно отправлять GET или POST запросы гугловскому API.
//Например получение списка spreadsheets через GET:
Соединение.Получить(УРЛ, РезультатИмяФайла, Заголовки);[/1C-CODE]


Параметр авторизации получаю пока по примеру со статьи:

ИмяПользователя = "***************";
	Пароль          = "***************";
	YOUR_API_KEY    = "***********************";
	ФайлИд = ПолучитьИмяВременногоФайла();                 
	Соединение = Новый HTTPСоединение("www.google.com", , , , , Истина);
	Соединение.Получить("accounts/ClientLogin?accountType=GOOGLE&service=writely&source=1C&Email=" + ИмяПользователя + "&Passwd=" +  Пароль, ФайлИд);
	
	//writely,wise 
	ФайлОтвета = Новый ТекстовыйДокумент;
	ФайлОтвета.Прочитать(ФайлИд, "utf-8");
	ПараметрАвторизации = ФайлОтвета.ПолучитьСтроку(3);
...Показать Скрыть


Понятно, что выдает ошибку авторизации при получении списка задач, т.к. что указывать строке подключения при авторизациии вот тут (service=writely&source=1C) понятия не имею, т.к. не могу найти в документации описания такого подключения.
15. Игорь Нешик (ineshyk) 09.07.13 16:47
(12) было не плохо увидеть пример использования авторизации OAuth 2.0 из 1С
16. ooosnika ooosnika (ooosnika) 09.07.13 17:04
Интересная вещь,попдойдет ли она мне,у нас есть несколько объектов,с несвязанными базами между собой,и надо чтобы каждому объекту раз в час передавалась некоторая информация от других объектов.Пробывал делать через почту,но все всремя проблемы со спамом.Может этим воспользоваться,или я уже мудрю
17. NikNik (nsirotkin@mail.ru) 09.07.13 20:36
(14) ineshyk

Я сам еще не пробовал OAuth 2.0

Посмотрите здесь https://developers.google.com/accounts/docs/OAuth2Login
и подробнее https://developers.google.com/accounts/docs/OAuth2Login#authenticationuriparameters

для Google Drive
For example, if you wanted per-file access to a user’s Google Drive, your scope might be openid profile email https://www.googleapis.com/auth/drive.file.


для Tasks API scope должен включать https://www.googleapis.com/auth/tasks

PS: Поделитесь потом результатами изысканий.
18. Антон Лапот (kievanton) 30.09.13 15:11
пытаюcь опубликовать файл типа BAK - не получается и в архиве пробовал публиковать - тоже не получилось.
выдает ошибку: Files must be uploaded using the resumable upload mechanism.
полазил в инете, нашел пару способов - не помогло.
почитал документацию, тоже что-то похожее нашел - не помогло.
вот пример кода
ИсточникИмяФайла = "G:\i.topal\test_igor.bak";
	
	
	Файл = Новый Файл(ИсточникИмяФайла);
	РазмерФайла = Файл.Размер();
	ИмяФайла = Файл.Имя;
	Файл = Неопределено;
	 
	СайтУРЛ = "docs.google.com";
	//СайтУРЛ = "http://schemas.google.com/g/2005#resumable-create-media";
	УРЛ = "feeds/default/private/full?convert=false";
	//УРЛ = "feeds/upload/create-session/default/private/full?convert=false";
	РезультатИмяФайла = ПолучитьИмяВременногоФайла();
	 
	Соединение = Новый HTTPСоединение(СайтУРЛ, , , , , Истина);//"spreadsheets0.google.com"
	 
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Authorization", "GoogleLogin auth=" + Сред(ПараметрАвторизации, 6));
	Заголовки.Вставить("GData-Version", "3.0");
	Заголовки.Вставить("Content-Length", Формат(РазмерФайла, "ЧГ="));
	Заголовки.Вставить("Content-Type", "application/octet-stream");
	Заголовки.Вставить("Slug", ИмяФайла);
	                               
	//Теперь можно отправлять GET или POST запросы гугловскому API.
	//Отправка POST Запроса
	Соединение.ОтправитьДляОбработки(ИсточникИмяФайла, УРЛ, РезультатИмяФайла, Заголовки);
...Показать Скрыть
19. NikNik (nsirotkin@mail.ru) 03.10.13 17:41
(18) kievanton,

Наверное, перспективнее сразу пробовать Google Drive API.
https://developers.google.com/drive/manage-uploads

Important: Version 3 of the Google Documents List API has been officially deprecated as of September 14, 2012. It will continue to work as per our deprecation policy, but we encourage you to move to the Google Drive API.


Я планировал поковырять Google Drive API, но не в ближайшее время. У вас есть уникальная возможность разобраться самостоятельно и поделиться достигнутыми результатами с сообществом.
20. Антон Лапот (kievanton) 15.10.13 14:19
(19) NikNik, реализовал с помощью приложения гугл драйв, которое синхронит папку на компьютере с облаком, установил его под системной учетной записью, создал службу, которая им управляет.
в итоге: бекап вначале делается в отдельную папку, там архивируется, а потом копируется в папку, которая подключена к облаку, а система автоматом синхронит файлы с облаком.
21. NikNik (nsirotkin@mail.ru) 15.10.13 17:19
(20) Нормально получилось.
И не зачем без необходимости прикручивать к 1С лишние вещи :)
22. Евгений я (DedMoroz1983) 10.06.14 11:48
В данной статье описано, как загрузить, удалять файл на google docs и получить список докуметут. Cтало интересно, а как же скачать сам файл/документ с google docs/drive?
23. Nikolay (nsirotkin@mail.ru) 10.06.14 14:17
24. Art Fa (artfa) 19.10.14 23:42
ошибка доступа к файлу, не проходит
		Соединение.Получить("accounts/ClientLogin?accountType=GOOGLE&service=writely&source=1C&Email=" + ИмяПользователя + "&Passwd=" +  Пароль, ФайлИд);//writely,wise 
25. Nikolay (nsirotkin@mail.ru) 20.10.14 08:49
(24) В google безопасность подкрутили.

Как вариант, можно разрешить доступ "ненадежным устройствам и приложениям".
www.google.com/settings/security/lesssecureapps
26. Инженер Гарин (Гарин) 01.04.15 11:13
параметр авторизации получаю нормально, но команда ОтправитьДляОбработки(... выдает ошибку: Ошибка аутентификации при доступе к ресурсу: feeds/default/private/full
27. Nikolay (nsirotkin@mail.ru) 01.04.15 19:17
(26) Гарин,

Разрешить доступ "ненадежным устройствам и приложениям" не помогает? (25)

Надо мигрировать с Documents List API на Drive API

Warning: The deprecation period for Version 3 of the Google Documents List API is nearly at an end. On April 20, 2015, we will discontinue service for this API. This means that service calls to the API are no longer supported, and features implemented using this API will not function after April 20, 2015. You must migrate to the Drive API as soon as possible to avoid disruptions to your application.
28. mike Figurin (drugoi_mir) 06.05.15 15:10
А каким образом изменить содержимое документа в . Т.е. к примеру я загрузил документ test.xls. Теперь хочу его содержимое перезаписать полностью из другого файла. Подскажите как можно это сделать?

Я получил id файла, который хочу перезаписать(нашел по наименованию). А дальше в гугле вообще непонятное описание следует, может кто поможет расшифровать, как это в 1С оформить, буду очень благодарен. Ниже описание с google api:
Обновление метаданных

Вот пример обновления как метаданные документа и его содержание, в то же время. Название документа обновляется, чтобы , например, документа и его содержимое заменяется содержимым Test.doc. Так запрос содержит новое содержание документа, редактировать СМИ ссылка используется.

Обратите внимание, что в том числе ETag для метаданных обеспечивает неявную If-Match для медиа-контента, а также, потому что любой обновление для медиа-контента вызывает ETag метаданных, чтобы изменить.

PUT https://docs.google.com/feeds/default/media/document:1234abcd
Authorization: <your authorization header here>
Content-Length: 73612
Content-Type: multipart/related; boundary="END_OF_PART"
Slug: test.doc
--END_OF_PART
Content-Type: application/atom+xml

<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="BxAaTxRZAyp7ImBq">
<category scheme="http://schemas.google.com/g/2005#kind"
term="http://schemas.google.com/docs/2007#document"/>
<title>example document</title>
</entry>

--END_OF_PART
Content-Type: application/msword

... doc contents here ...

--END_OF_PART
29. Nikolay (nsirotkin@mail.ru) 07.05.15 12:45
(28) drugoi_mir,

В статье есть пример удаления документа.
Сообщение (27) читали? (кусочек про поддержку API)
30. mike Figurin (drugoi_mir) 07.05.15 13:33
(29) nsirotkin@mail.ru, смысл в том, что если удалить документ и допустим настроить права на доступ извне по ссылке, то ссылка доступа изменится. А нужно просто изменить содержимое документа, без изменения ссылки доступа.

Да читал. Там тоже описание такое себе. Как-то гугл в плане описания api не особо радует.

В Drive API еще проблема, что авторизация проходит только по oauth 2.0 При этом типе авторизации свое приложение надо регистрировать в гугле и пользователь должен нажать кнопку, что подтверждает доступ к данным. Таким образом полностью автоматической работы(чтобы пользователь не нажимал подтверждение) приложения не получится.

А задача при которой гугл можно использовать простая. Например выгружать остатки по номенклатуре в гугл докс. И менять их каждый день.
31. Ольга (Ольга_tmp) 28.04.16 09:37
ClientLogin еще поддерживается гуглом?
32. Nikolay (nsirotkin@mail.ru) 28.04.16 16:51
(31) Ольга_tmp,

Статья уже не актуальна. Планировал сделать новую публикацию с oauth2.
Приложил тестовую обработку с oauth2 (по мотивам http://pro1c.net/pub/283).
Что в ней работает, а что нет, уже не помню (разбирайтесь сами)…
Токен живет 1час, может быть лучше смотреть в сторону яндекса.
Прикрепленные файлы:
GoogleDocsAPITest_auth2.epf
33. Mary Maksimova (primara) 04.10.16 09:37
(32) nsirotkin@mail.ru, то, что токен живет 1 час - не проблема, нужно просто проверять живой ли еще токен, и если его время уже истекло, дергать процедуру обновления токена, она совершенно незаметна для пользователя.
nsirotkin@mail.ru; +1 Ответить 1
34. Игорь Зуйков (quares) 10.10.16 16:37
(32) nsirotkin@mail.ru, Прикольно, конечно, однако как получить конкретный документ (таблицу) и данные из неё?
Заранее спасибо.
35. Nikolay (nsirotkin@mail.ru) 12.10.16 12:43
(34) quares,

Статья уже не актуальна. Приложена обработка (32)
или http://infostart.ru/public/520534/
36. Nikolay (nsirotkin@mail.ru) 12.10.16 12:50
(33) primara,

Да, про обновление токена я знаю/понимаю.
Но после закрытия обработки некому обновлять токен.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа