Работа с DropBox из 1С

Опубликовал Евгений (le_) в раздел Программирование - Практика программирования

Пример работы с сервисом dropbox без установки приложения dropbox (средствами, которые предоставляют 1С и Windows по-умолчанию).

Для чего это нужно.

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

Что внутри.

В качестве примера такой работы представлена конфигурация, в которой реализовано следующее:

  1. Авторизация приложения на сервисе dropbox. Авторизация производится один раз, дальше можно работать без ввода логинов/паролей.
  2. Получение дерева каталогов и их содержимого для вашей учетной записи.
  3. Загрузка файла в dropbox.
  4. Скачивание файла из dropbox.
  5. Удаление файла с сервера dropbox.

Фактически, эта конфигурация - это приложение, которое разработано в соответствие с документацией dropbox по разработке клиентских приложений.

Использованная документация

DropBox Core API
Using OAuth in "PLAINTEXT" mode
Dropbox for HTTP Developers
Dropbox OAuth guide

P.S.

Для создания своего собственного приложения нужно использовать Developer App Console.

--
Обновлено 18.09.2014: добавлена функция удаления файла с сервера

Обновлено 04.04.2017: небольшие доработки, связанные с изменениями в самом Dropbox

Обновлено 27.04.2017: добавлена конфигурация, в которой используется Dropbox API v. 2, функции и интерфейс аналогичны первой версии. Конфигурация разрабатывалась и тестировалась на версии платформы 8.3.9.2233, в основном всё реализовано средствами платформы, т.о., на других релизах платформы что-то может пойти не так.
API v. 1 будет отключен разработчиками Dropbox 28.06.2017

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

Наименование Файл Версия Размер
Работа с DropBox из 1С (API v. 2)
.cf 26,53Kb
27.04.17
4
.cf 1.0.0.0 26,53Kb 4 Скачать
Конфигурация 1С_client (API v. 1)
.cf 23,00Kb
27.04.17
22
.cf 7 23,00Kb 22 Скачать

См. также

Комментарии
1. Призрак (davdykin) 16 29.08.14 03:10 Сейчас в теме
Мысль интересная. На больших объемах файлов (метров 10-15) не тестировали, проблем не возникает?
2. Евгений (le_) 174 29.08.14 12:01 Сейчас в теме
(1) davdykin, досконально не тестировал, но файл размером 12,1 МБ скачался нормально.
3. Roman Tarabanov (pswd) 29.08.14 12:39 Сейчас в теме
А что касаемо обновления или изменения файла другим пользователем. Есть информация об обновлениях и автоматической скачки актуальных данных?
4. Евгений (le_) 174 29.08.14 13:25 Сейчас в теме
(3) pswd, dropbox API позволяет получить данные по изменениям файлов, их версиям и даже по удаленным файлам.
В конфигурации я не стал это использовать. У меня просто пример работы с базовыми функциями.
5. Иван Устьянцев (nSpirit2) 01.09.14 10:22 Сейчас в теме
А простите зачем это вообще? Я вот просто совсем не могу себе представить ситуацию зачем клиент DropBox в 1С о_0. Я не знаю как вы а я как то очень опасаюсь аутентификации открытым текстом... Утекут еще ваши секретные данные) Ну и если я правильно помню то для использования в бизнесе за DropBox платить надо.
6. Евгений (le_) 174 01.09.14 13:15 Сейчас в теме
(5) nSpirit2, все запросы к dropbox в этом примере идут по протоколу HTTPS. Пароли в открытом виде не передаются. В самой конфигурации пароль от аккаунта не хранится, хранятся AppId и токены, которые желательно скрыть от посторонних глаз.

OAuth 1.0 also has a "PLAINTEXT" mode specifically for SSL.
https://www.dropbox.com/developers/blog/20/using-oauth-in-plaintext-mode

Подробнее об OAuth можно почитать здесь.

Кроме того, создавая своё приложение, со своим собственным AppId есть возможность дать доступ этому приложению только в один единственный каталог вашего аккаунта.

А использовать всё это можно для обмена.

Для чего это понадобилось лично мне: есть некое приложение, в котором разработчиками предусмотрена возможность выгрузки базы в dropbox. Это приложение делает ежедневные выгрузки, а я из регламентного задания 1С-ки читаю содержимое определенного каталога и нужное загружаю в базу.
7. Иван Устьянцев (nSpirit2) 01.09.14 13:34 Сейчас в теме
(6) le_, ну что же спасибо за ответ.

9.4. PLAINTEXT

The PLAINTEXT method does not provide any security protection and SHOULD only be used over a secure channel such as HTTPS. It does not use the Signature Base String.


Как видите все передает он все используя сигнатуру соединения(Читай пароль от приложения передается в открытую и шифруется только самим соединением). Да я параноик :).

На самом деле публикация отличная. А не могли бы вы ответить почему вариант с установкой Копии ДроБокса и простой работай с файлами вы предпочли использовать протокол. Вы как-то проверяете целостность файлов при передаче? Я просто использую именно так если необходим синхрон через плохой интерент. А вообще за публикацию большой + !
8. Евгений (le_) 174 01.09.14 14:16 Сейчас в теме
(7) nSpirit2, в этом примере целостность файлов не проверяется.
В случае со скачиванием, целостность файла можно проверить средствами платформы/ОС/спец. утилитами. Запрос GET к файлу возвращает хэш, размер и другие параметры в заголовке ответа сервера.

Хэш каталога можно получить специальной API-функцией.

В случае загрузки больших файлов на их сервер, есть API-функция chunked_upload, которая загружает большие файлы фрагментами определенного размера, с проверкой целостности и есть возможность продолжить загрузку в случае её прерывания.

Почему не использую их приложение - считаю, что если можно обойтись без него, то оно не нужно ) Не хочется устанавливать лишнее на сервер.
nSpirit2; +1 Ответить
9. Сергей (Sergoninfostarru) 2 03.09.14 12:16 Сейчас в теме
Dropbox достаточно часто меняет версию, причем автоматически, если установлен на компьютер. Поэтому, данное решение буде работать только пока dropbox существенно не изменится. Кроме того, нужно постоянно держать 1С открытой, чтоб не прохлопать очередной файл, а это не всегда хорошо, особенно, когда база в файловом режиме.
10. Евгений (le_) 174 03.09.14 16:32 Сейчас в теме
(9) Sergoninfostarru, вряд ли API будет меняться так же часто, как они выпускают версии своего приложения. Если бы это было так, всем разработчикам, которые пишут свои приложения для dropbox пришлось бы постоянно их переделывать.

Зачем держать 1С открытой?
11. valdubov@mail.ru (Valerich) 04.09.14 19:54 Сейчас в теме
Идея отличная.

Чтобы, например, организовать обмен данными между географически разнесенными базами, используют ftp или почту для передачи сообщений. Как показывает практика, dropbox в смысле передачи файлов достаточно надежен, работает быстро и качественно. Но есть одно НО: клиент Dropbox не работает как сервис.
А значит необходимо где-то держать открытую сессию с запущенным клиентом.
Данная разработка может обойти это ограничение, если код прописать для регламентного задания, которое будет выполняться с заданной периодичностью и обновлять нужные файлы.
biformatus; +1 Ответить 1
12. Евгений (le_) 174 05.09.14 10:56 Сейчас в теме
(11) valdubov@mail.ru, да, у меня одна из задач так и решается - в регламентном задании проверяется наличие нужных файлов в определенном каталоге dropbox и нужное скачивается и обрабатывается (упоминал об этом в (6)).
13. Евгений (le_) 174 05.09.14 17:57 Сейчас в теме
В конфигурации используется WinHttpRequest для отправки запросов к серверу dropbox.
Меня тут спросили, возможно ли обойтись без этого объекта. Ответ: да, возможно.
Можно обойтись одним лишь только объектом 1С HTTPСоединение.
ОтправитьДляОбработки() - это POST
Получить() - это GET

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

//получаем токен
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "OAuth oauth_version=""1.0"", oauth_signature_method=""PLAINTEXT"", oauth_consumer_key=""" + ДанныеАвторизации.AppId + """, oauth_signature=""" + ДанныеАвторизации.AppS + "&""");
Соединение = Новый HTTPСоединение("api.dropbox.com",,,,,Истина);

Ф1 = ПолучитьимяВременногоФайла("txt");
ЗТ = Новый ЗаписьТекста(Ф1);
ЗТ.Закрыть();
ЗТ = Неопределено;

Ф2 = ПолучитьимяВременногоФайла("txt");
ЗТ = Новый ЗаписьТекста(Ф2);
ЗТ.Закрыть();
ЗТ = Неопределено;
	
Попытка
	Ответ = Соединение.ОтправитьДляОбработки(Ф1, "1/oauth/request_token", Ф2, Заголовки);
Исключение
	Сообщить("Описание ошибки: " + ОписаниеОшибки());
	Возврат;
КонецПопытки;

Если Ответ.КодСостояния = 200 Тогда
	//...
...Показать Скрыть

Ответ с токенами будет содержаться в файле по пути Ф2.
Все остальное - по аналогии. Отправка файла на сервер в конфигурации для примера изначально была реализована с помощью объекта HTTPСоединение.
Очевидно, что с WinHttpRequest всё проще, но если нет возможности использовать его, то... можно и без него обойтись.
14. Шевелев Дмитрий (CAIN) 4 06.09.14 16:20 Сейчас в теме
Возникает ошибка после аутентификации
ОбщийМодуль.ОбщийКлиент.Модуль(180)}: Ошибка при вызове метода контекста (Вставить)
Результат.Вставить(?(Найти("0123456789", Лев(ИмяЗначения, 1)) > 0, "_" + СтрЗаменить(ИмяЗначения, " ", "_"), СтрЗаменить(ИмяЗначения, " ", "_")), Значение);
по причине:
Задано неправильное имя атрибута структуры
15. Евгений (le_) 174 06.09.14 17:48 Сейчас в теме
(14) CAIN, в этом месте ответ сервера в формате JSON преобразуется в структуру. Видимо, там получается какой-то недопустимый ключ.
Посмотрите, каково в этом месте значение переменой ИмяЗначения, его нужно будет как-то обработать, чтобы можно было использовать в качестве ключа структуры.
16. Александр Кузин (sashocq) 188 08.09.14 15:10 Сейчас в теме
(15) или использовать Соответствие.
17. Александр Кузин (sashocq) 188 09.09.14 14:58 Сейчас в теме
(13) le_, а что это за вызов такой?
Соединение = Новый HTTPСоединение("api.dropbox.com",,,,,Истина);

6-й параметр Таймаут (Число)
7-й параметр ЗащищенноеСоединение (тип ЗащищенноеСоединениеOpenSSL или ЗащищенноеСоединениеNSS)
Других конструкторов у HTTPСоединение нет. Или я что не так понимаю?
18. Евгений (le_) 174 09.09.14 16:37 Сейчас в теме
(17) sashocq, в 8.2 два конструктора. Из 8.3 один убрали.
Прикрепленные файлы:
19. Александр Емельянов (Robot123) 124 18.09.14 14:43 Сейчас в теме
Отличная публикация. Возник вопрос, как можно удалить файл из dropbox. В документации вроде написано через post "https://api.dropbox.com/1/fileops/delete". Но почему-то не получается.
20. Евгений (le_) 174 18.09.14 15:57 Сейчас в теме
(19) Robot123, обновил файл в публикации - добавил туда пример функции удаления файла с сервера DropBox.
21. Евгений Парфенов (deminded) 4 19.11.14 14:21 Сейчас в теме
Большое спасибо, пригодилось для быстрого решения задачи по выгрузке фотоматериалов партнерам, использующим dropbox.
22. Natali Yu (crazy.admin91119) 18.12.14 17:12 Сейчас в теме
Думаю это лишнее, на дропбокс данные важные хранить
никто не боится утечки инфы?
23. Николай Зевеке (zekrus) 97 04.04.17 13:46 Сейчас в теме
Добрый день!
Тема весьма актуальная, учитывая количество файлов в разных папках (давно пора было прибраться).
Жалко ругается (см вложение)
С уважением
Прикрепленные файлы:
Ошибка.txt
24. Евгений (le_) 174 04.04.17 17:33 Сейчас в теме
(23) Попробуйте седьмую версию.
25. Миша иванов (tr2sh) 24.04.17 16:56 Сейчас в теме
26. Евгений (le_) 174 25.04.17 10:00 Сейчас в теме
(25) Нет, только v. 1.

28.06.2017 API v. 1 будет отключен Dropbox.

Будет время - может, переделаю на v. 2.
27. Евгений (le_) 174 27.04.17 10:23 Сейчас в теме
(25) Теперь реализовано. (см. файлы публикации)
Оставьте свое сообщение