bdd2

Пример работы с 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
153
.epf 13,02Kb 153 Скачать

См. также

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


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

1. Андрей Данилюк (DanilaDru) 229 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) 229 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) 198 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) 6 10.10.11 12:55 Сейчас в теме
А как сделать POST-запрос с передачей параметров в файле? Что-то никак не получается.
9. NikNik (nsirotkin@mail.ru) 11.10.11 20:13 Сейчас в теме
(8) CTDEVIce,

POST=ОтправитьДляОбработки
В примере есть функция УстановитьПраваДоступа.
10. Евгений Добрынин (CTDEVIce) 6 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) 63 10.06.14 14:17 Сейчас в теме
24. Art Fa (artfa) 15 19.10.14 23:42 Сейчас в теме
ошибка доступа к файлу, не проходит
		Соединение.Получить("accounts/ClientLogin?accountType=GOOGLE&service=writely&source=1C&Email=" + ИмяПользователя + "&Passwd=" +  Пароль, ФайлИд);//writely,wise 
25. Nikolay (nsirotkin@mail.ru) 63 20.10.14 08:49 Сейчас в теме
(24) В google безопасность подкрутили.

Как вариант, можно разрешить доступ "ненадежным устройствам и приложениям".
www.google.com/settings/security/lesssecureapps
26. Инженер Гарин (Гарин) 1 01.04.15 11:13 Сейчас в теме
параметр авторизации получаю нормально, но команда ОтправитьДляОбработки(... выдает ошибку: Ошибка аутентификации при доступе к ресурсу: feeds/default/private/full
27. Nikolay (nsirotkin@mail.ru) 63 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) 7 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) 63 07.05.15 12:45 Сейчас в теме
(28) drugoi_mir,

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

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

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

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

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

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

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