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



Пример работы с сервисом 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.2024: небольшие доработки, связанные с изменениями в самом Dropbox

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

37 Comments

  1. davdykin

    Мысль интересная. На больших объемах файлов (метров 10-15) не тестировали, проблем не возникает?

    Reply
  2. le_

    (1) davdykin, досконально не тестировал, но файл размером 12,1 МБ скачался нормально.

    Reply
  3. pswd

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

    Reply
  4. le_

    (3) pswd, dropbox API позволяет получить данные по изменениям файлов, их версиям и даже по удаленным файлам.

    В конфигурации я не стал это использовать. У меня просто пример работы с базовыми функциями.

    Reply
  5. le_

    (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С-ки читаю содержимое определенного каталога и нужное загружаю в базу.

    Reply
  6. nSpirit2

    (6) ну что же спасибо за ответ.

    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.

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

    На самом деле публикация отличная. А не могли бы вы ответить почему вариант с установкой Копии ДроБокса и простой работай с файлами вы предпочли использовать протокол. Вы как-то проверяете целостность файлов при передаче? Я просто использую именно так если необходим синхрон через плохой интерент. А вообще за публикацию большой + !

    Reply
  7. le_

    (7) nSpirit2, в этом примере целостность файлов не проверяется.

    В случае со скачиванием, целостность файла можно проверить средствами платформы/ОС/спец. утилитами. Запрос GET к файлу возвращает хэш, размер и другие параметры в заголовке ответа сервера.

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

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

    Почему не использую их приложение — считаю, что если можно обойтись без него, то оно не нужно ) Не хочется устанавливать лишнее на сервер.

    Reply
  8. Sergoninfostarru

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

    Reply
  9. le_

    (9) Sergoninfostarru, вряд ли API будет меняться так же часто, как они выпускают версии своего приложения. Если бы это было так, всем разработчикам, которые пишут свои приложения для dropbox пришлось бы постоянно их переделывать.

    Зачем держать 1С открытой?

    Reply
  10. Valerich

    Идея отличная.

    Чтобы, например, организовать обмен данными между географически разнесенными базами, используют ftp или почту для передачи сообщений. Как показывает практика, dropbox в смысле передачи файлов достаточно надежен, работает быстро и качественно. Но есть одно НО: клиент Dropbox не работает как сервис.

    А значит необходимо где-то держать открытую сессию с запущенным клиентом.

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

    Reply
  11. le_

    (11) valdubov@mail.ru, да, у меня одна из задач так и решается — в регламентном задании проверяется наличие нужных файлов в определенном каталоге dropbox и нужное скачивается и обрабатывается (упоминал об этом в (6)).

    Reply
  12. le_

    В конфигурации используется 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 всё проще, но если нет возможности использовать его, то… можно и без него обойтись.

    Reply
  13. CAIN

    Возникает ошибка после аутентификации

    ОбщийМодуль.ОбщийКлиент.Модуль(180)}: Ошибка при вызове метода контекста (Вставить)

    Результат.Вставить(?(Найти(«0123456789», Лев(ИмяЗначения, 1)) > 0, «_» + СтрЗаменить(ИмяЗначения, » «, «_»), СтрЗаменить(ИмяЗначения, » «, «_»)), Значение);

    по причине:

    Задано неправильное имя атрибута структуры

    Reply
  14. le_

    (14) CAIN, в этом месте ответ сервера в формате JSON преобразуется в структуру. Видимо, там получается какой-то недопустимый ключ.

    Посмотрите, каково в этом месте значение переменой ИмяЗначения, его нужно будет как-то обработать, чтобы можно было использовать в качестве ключа структуры.

    Reply
  15. sashocq

    (15) или использовать Соответствие.

    Reply
  16. sashocq

    (13) а что это за вызов такой?

    Соединение = Новый HTTPСоединение(«api.dropbox.com»,,,,,Истина);

    6-й параметр Таймаут (Число)

    7-й параметр ЗащищенноеСоединение (тип ЗащищенноеСоединениеOpenSSL или ЗащищенноеСоединениеNSS)

    Других конструкторов у HTTPСоединение нет. Или я что не так понимаю?

    Reply
  17. le_

    (17) sashocq, в 8.2 два конструктора. Из 8.3 один убрали.

    Reply
  18. Robot123

    Отличная публикация. Возник вопрос, как можно удалить файл из dropbox. В документации вроде написано через post «https://api.dropbox.com/1/fileops/delete». Но почему-то не получается.

    Reply
  19. le_

    (19) Robot123, обновил файл в публикации — добавил туда пример функции удаления файла с сервера DropBox.

    Reply
  20. deminded

    Большое спасибо, пригодилось для быстрого решения задачи по выгрузке фотоматериалов партнерам, использующим dropbox.

    Reply
  21. crazy.admin91119

    Думаю это лишнее, на дропбокс данные важные хранить

    никто не боится утечки инфы?

    Reply
  22. zekrus

    Добрый день!

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

    Жалко ругается (см вложение)

    С уважением

    Reply
  23. le_

    (23) Попробуйте седьмую версию.

    Reply
  24. tr2sh

    А API v.2 реализовано?

    Reply
  25. le_

    (25) Нет, только v. 1.

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

    Будет время — может, переделаю на v. 2.

    Reply
  26. le_

    (25) Теперь реализовано. (см. файлы публикации)

    Reply
  27. pa3ueji

    Работа с DropBox из 1С (API v. 2)

    ФормаАвторизации.HTML = «https://www.dropbox.com/oauth2/authorize?response_type=code&client_id=» + ДанныеАвторизации.AppId + «&locale=ru-RU&state=mnbvcxz0987654321»;
    ДанныеАвторизации.Вставить(«oauth_token», ФормаАвторизации.ОткрытьМодально());
    

    ФормаАвторизации открывается с пустым HTML: при первом входе в процедуру HTMLДокументСформирован, Элементы.html.Документ.URLUnencoded = about:blank.

    И после ничего не изменяется и HTML остается пустым.

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

    Reply
  28. le_

    (28) Страница может не загружаться, если 1С-ка не имеет доступа в интернет.

    Reply
  29. pa3ueji

    (29)

    Страница может не загружаться, если 1С-ка не имеет доступа в интернет

    (29)

    ФормаАвторизации.HTML = «https://www.google.ru/» — загружается корректно.

    Reply
  30. le_

    (30) Может, к дропбоксу у вас доступ запрещен. Попробуйте открыть его в IE…

    https://www.dropbox.com/

    Reply
  31. pa3ueji

    В браузере страница(«https://www.dropbox.com/oauth2/authorize?response_type=code&client_id=» + ДанныеАвторизации.AppId + «&locale=ru-RU&state=mnbvcxz0987654321»)

    открывается успешно.

    Reply
  32. le_

    (32) Ну, я не могу вам помочь, у меня работает…

    Reply
  33. Dzenn

    К сожалению, вариант v2 не работает (v1 не скачивал). Сервер дропбокса пишет «This app is unable to link additional users because it has been frozen pending review.», то есть «Это приложение не может связать дополнительных пользователей, поскольку оно было заморожено в ожидании проверки.»

    Reply
  34. le_

    (34) Создайте свое приложение, используя эту ссылку: https://www.dropbox.com/developers/apps, получите идентификаторы — пропишите их в конфигурации. Модуль формы «Форма» обработки «РабочийСтол», процедура Авторизовать()

    Reply
  35. Dzenn

    (35)

    (34) Создайте свое приложение, используя эту ссылку: https://www.dropbox.com/developers/apps, получите идентификаторы — пропишите их в конфигурации. Модуль формы «Форма» обработки «РабочийСтол», процедура Авторизовать()

    Благодарю!

    Reply
  36. cfifgoth

    Добрый день. Помогите пожалуйста с проблемой. При попытке доступа к Dropbox через «Работа с DropBox из 1С (API v. 2)» возникает надпись «This app is unable to link additional users because it has been frozen pending review». Как решить данную проблему?

    Reply
  37. cfifgoth

    (37)

    This app is unable to link additional users because it has been frozen pending review

    Спасибо, вопрос снят, не внимательно читаю,))

    Reply

Leave a Comment

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