gifts2017

Работа с 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
Работа с форматом JSON в 1С

P.S.

Конфигурация тестировалась только под тонким клиентом (8.2).
Для создания своего собственного приложения нужно использовать Developer App Console.

--

Обновлено 29.08.2014: решена проблема с русскими символами

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

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

Наименование Файл Версия Размер Кол. Скачив.
Конфигурация 1С_client
.cf 22,92Kb
13.11.15
14
.cf 6 22,92Kb 14 Скачать

См. также

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

Комментарии

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

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

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

Почему не использую их приложение - считаю, что если можно обойтись без него, то оно не нужно ) Не хочется устанавливать лишнее на сервер.
nSpirit2; +1 Ответить
9. Сергей (Sergoninfostarru) 03.09.14 12:16
Dropbox достаточно часто меняет версию, причем автоматически, если установлен на компьютер. Поэтому, данное решение буде работать только пока dropbox существенно не изменится. Кроме того, нужно постоянно держать 1С открытой, чтоб не прохлопать очередной файл, а это не всегда хорошо, особенно, когда база в файловом режиме.
10. Евгений (le_) 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_) 05.09.14 10:56
(11) valdubov@mail.ru, да, у меня одна из задач так и решается - в регламентном задании проверяется наличие нужных файлов в определенном каталоге dropbox и нужное скачивается и обрабатывается (упоминал об этом в (6)).
13. Евгений (le_) 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) 06.09.14 16:20
Возникает ошибка после аутентификации
ОбщийМодуль.ОбщийКлиент.Модуль(180)}: Ошибка при вызове метода контекста (Вставить)
Результат.Вставить(?(Найти("0123456789", Лев(ИмяЗначения, 1)) > 0, "_" + СтрЗаменить(ИмяЗначения, " ", "_"), СтрЗаменить(ИмяЗначения, " ", "_")), Значение);
по причине:
Задано неправильное имя атрибута структуры
15. Евгений (le_) 06.09.14 17:48
(14) CAIN, в этом месте ответ сервера в формате JSON преобразуется в структуру. Видимо, там получается какой-то недопустимый ключ.
Посмотрите, каково в этом месте значение переменой ИмяЗначения, его нужно будет как-то обработать, чтобы можно было использовать в качестве ключа структуры.
16. Александр Кузин (sashocq) 08.09.14 15:10
(15) или использовать Соответствие.
17. Александр Кузин (sashocq) 09.09.14 14:58
(13) le_, а что это за вызов такой?
Соединение = Новый HTTPСоединение("api.dropbox.com",,,,,Истина);

6-й параметр Таймаут (Число)
7-й параметр ЗащищенноеСоединение (тип ЗащищенноеСоединениеOpenSSL или ЗащищенноеСоединениеNSS)
Других конструкторов у HTTPСоединение нет. Или я что не так понимаю?
18. Евгений (le_) 09.09.14 16:37
(17) sashocq, в 8.2 два конструктора. Из 8.3 один убрали.
Прикрепленные файлы:
19. Александр Емельянов (Robot123) 18.09.14 14:43
Отличная публикация. Возник вопрос, как можно удалить файл из dropbox. В документации вроде написано через post "https://api.dropbox.com/1/fileops/delete". Но почему-то не получается.
20. Евгений (le_) 18.09.14 15:57
(19) Robot123, обновил файл в публикации - добавил туда пример функции удаления файла с сервера DropBox.
21. Евгений Парфенов (deminded) 19.11.14 14:21
Большое спасибо, пригодилось для быстрого решения задачи по выгрузке фотоматериалов партнерам, использующим dropbox.
22. Natali Yu (crazy.admin91119) 18.12.14 17:12
Думаю это лишнее, на дропбокс данные важные хранить
никто не боится утечки инфы?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа