Выгрузка таблиц (Excel, OpenOffice) в Google Drive

Обработка позволяет загрузить файлы Excel и OpenOffice на Google Drive (Google Docs). Не требует дополнительных компонент. Может применяться для публикации документов из 1С (например, обновляемые финансовые отчеты для руководителей).

Обработка работает через Google Apps API, используя напрямую http протокол. Загруженный файл автоматически конвертируется в таблицу (SpreadSheet).

В архиве две обработки — для 1С 7.7 и 8.2. Для работы нужны стандартные компоненты Windows — «WinHttp.WinHttpRequest.5.1», «ADODB.Stream», «Msxml2.DOMDocument» и «MSScriptControl.ScriptControl» (для 1С 7.7).

Работать с обработкой очень просто. Нужно заполнить реквизиты (см. рисунок):

1. Указать имя файла

2. Указать имя аккаунта на @gmail (полностью)

3а. Если в профиле Google включена двухэтапная аутентификация, то нужно сгенерировать имя и пароль приложения здесь и указать их.

3б. Если аутентификация обычная, то просто ввести пароль к аккаунту.

4. Указать имя документа на Google Drive. Если документ с таким именем существует, то его содержимое будет обновлено, иначе будет создан новый.


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


P.S. Для файлов Excel 97 Google Drive не поддерживает конвертацию — при загрузке обработка выдаст ошибку.

UPD 2024-08-03. Переделал обработку под новое API Google Drive.

Основные изменения:

1. Авторизация OAuth2. Внимание! Для возможности использования обработки в автоматическом режиме нужно один раз авторизироваться интерактивно (кнопка «Авторизироваться» на форме обработки). Обработка запоминает токен авторизации (refresh_token) для последующего использования.

2. Изменены процедуры поиска и загрузки документов на Google Drive (JSON).

UPD 2024-08-05. Исправлена ошибка — если имя таблицы содержало одинарные или двойные кавычки, то выдавалась «Parsing Error».


36 Comments

  1. zato1c

    Пользуюсь Dropbox уже давно при синхронизации баз. С работы и дома.Если (мысль) поставить по более этих сервисов как где то видел обработку по выборе удаленок. Т.е яндексДиск,Dropbox и т.д но а так +

    Reply
  2. zan_od

    (1) zato1c,

    Я эти обработки писал с другой целью. Клиенту необходима была онлайн-версия отчета из 1С (периодически обновляемая), которую он смог бы расшарить сотрудникам, не работающим в 1С непосредственно. После перебора возможных вариантов остановились на Google Docs.

    Не совсем понимаю, зачем использовать 1С для синхронизации файлов в облачных хранилищах. Можно подробнее развить мысль насчет 1С<->Dropbox, например?

    Reply
  3. zato1c

    В крцее могу сказать как я делаю. выгружаю конфу в Dropbox после этого прихожу в другое место уже с другого компа открываю свою базу уже с обновленного файла Dropbox.

    Reply
  4. Wanderer.nk

    для этой цели есть VPN.

    Reply
  5. 924

    Добрый день! Пришлите мне пожалуйста обработку на почту vodoroslia@gmail.com , у меня не хватает $ =)

    Reply
  6. hombre

    После двух недель нормальной работы, обработка перестала загружать файл на диск. Останавливалась с ошибкой

    Ошибка запроса авторизации: Not Found

    Ошибка авторизации: пустой wise токен авторизации


    Через некоторое время зарабатала, но опять ненадолго. Пароли, Настройки доступа не менялись. Проверял на разных эккаунтах. С чем это может быть связано? Или что можете посоветовать, чтобы исправить ситуацию.

    Reply
  7. zan_od

    В очередной раз поменялось Google API. У меня тоже перестало выгружаться где-то неделю назад.

    Разберусь — выложу обновление.

    Reply
  8. hombre

    (7) подскажите как часто происходят такие изменения?

    Reply
  9. zan_od

    (8) hombre, сложно сказать. Google постоянно меняют API, просто изменения могут не затрагивать используемый в обработке функционал. Судя по моим доработкам, функционал выгрузки меняется в среднем раз в год.

    Reply
  10. hombre

    Анатолий, спасибо за обновление. При попытке выгрузить файл выходит ошибка

    {

    «error»: {

    «errors»: [

    {

    «domain»: «global»,

    «reason»: «parseError»,

    «message»: «Parse Error»

    }

    ],

    «code»: 400,

    «message»

    Подскажите, в чем может быть проблема?

    Reply
  11. zan_od

    (10) hombre, для того, чтобы я мог воспроизвести ошибку, приведите полный текст ошибки (судя по приведенному Вами отрывку — это не весь текст).

    Имя модуля и номер строки не выводится?

    Как выглядит ошибка: диалог посередине экрана или в окне сообщений внизу экрана?

    Какой файл загружаете: Excel или OpenOffice?

    В какой версии сохранен файл?

    Это обновление существующего файла или загрузка нового?

    На каком этапе возникает ошибка: авторизация или непосредственно загрузка?

    Reply
  12. zan_od

    (10) hombre, как называется имя таблицы в Google Drive? Попробуйте выгрузить с простым именем, например «test»

    Reply
  13. hombre

    (11) Ошибка возникает только при обновлении существующего файла.

    В окне сообщения ошибка:

    Ошибка запроса обновления документа: (400) Bad Request

    Отдельным текстовым окном:

    {

    «error»: {

    «errors»: [

    {

    «domain»: «global»,

    «reason»: «parseError»,

    «message»: «Parse Error»

    }

    ],

    «code»: 400,

    «message»: «Parse Error»

    }

    }

    Имя таблицы на киррилице и на латиннице -результат одинаков.

    Reply
  14. zan_od

    (13) hombre, имя таблицы содержит кавычки? Исправил. Причина в том, что одинарные кавычки — спецсимвол в URL, а двойные кавычки — спецсимвол в JSON.

    Reply
  15. hombre

    (14) Без кавычек имя таблицы test

    Reply
  16. zan_od

    (15) hombre, странно. Давайте проверим такую версию: попробуйте выгрузить другой файл (попробуйте с пустого).

    Reply
  17. xlmel

    Если просто положить файл на один определенный диск в Google Drive, то можно установить GoogleDrive для ПК на компьютер, сохранять файл в папку, на которую настроена синхронизация и не нужно все остальное. Для разных дисков нужно хранить разные refresh_token в разных файлах и где-то сохранять таблицу соответствия, чтобы не проводить при каждом соединении авторизацию. Да и с Google API часто проблемы бывают. В свое время убил кучу времени на Calendar.

    Reply
  18. kras_71

    В функции ОбновитьДокумент вот такие переделки и все работает:

    Функция ОбновитьДокумент(Соединение, ТокенАвторизации, ИмяФайла, ИмяТаблицы, ИдДокумента)
    КоличествоБайт = РазмерФайла(ИмяФайла);
    
    Если ПустаяСтрока(ИдДокумента) = 1 Тогда
    
    Тело =
    «{
    | «»title»»: «»» + ЭкранироватьСимвол(ИмяТаблицы, «»»») + «»»,
    | «»fileExtension»»: «»xls»»
    |}»;
    
    Соединение.Open(«POST», «https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable&convert=true», 0);
    Соединение.SetRequestHeader(«Content-Length», СтрДлина(Тело));
    Соединение.SetRequestHeader(«Content-Type», «application/json; charset=UTF-8»);
    Иначе
    Сообщить(«ОБНОВЛЯЕМ»);
    Соединение.Open(«PUT», «https://www.googleapis.com/upload/drive/v2/files/» + ИдДокумента + «?uploadType=resumable», 0);
    Тело = «»;
    КонецЕсли;
    
    
    
    
    Соединение.SetRequestHeader(«Authorization», «Bearer «+ТокенАвторизации);
    Соединение.SetRequestHeader(«Content-Type», «application/json; charset=UTF-8»);
    Соединение.SetRequestHeader(«X-Upload-Content-Type», «image/jpeg»);
    Соединение.SetRequestHeader(«X-Upload-Content-Length», КоличествоБайт);
    //Соединение.SetRequestHeader(«Authorization», «Bearer «+ТокенАвторизации);
    //Соединение.SetRequestHeader(«X-Upload-Content-Type», «application/vnd.ms-excel»);
    //Соединение.SetRequestHeader(«X-Upload-Content-Length», КоличествоБайт);
    
    Соединение.Send(Тело);
    
    Если Соединение.Status <>  200 Тогда
    Сообщить(«Ошибка запроса обновления документа: (» + Соединение.Status + «) » + Соединение.StatusText, «!!»);
    ВывестиСтроку(Соединение.ResponseText());
    Возврат 0;
    КонецЕсли;
    
    Ссылка = Соединение.GetResponseHeader(«Location»);
    
    Если ЗагрузитьФайлПоСсылке(Соединение, ТокенАвторизации, Ссылка, ИмяФайла, 0) <> 1 Тогда
    Сообщить(«Ошибка загрузки файла на сайт», «!!»);
    Возврат 0;
    КонецЕсли;
    
    Возврат 1;
    КонецФункции

    Показать

    Reply
  19. kras_71

    Нет не работает (((

    Reply
  20. zan_od

    (19) kras_71, что пишет? Какая ошибка?

    Reply
  21. serviceonec

    За обработку спасибо. Все работает. Хотелось еще бы выгрузку в определенную папку.

    Reply
  22. Deryni

    Возникла проблема. Если загружать новый файл — то он загружается, а если попытаться обновить тот, что уже есть (даже тот, который только что загрузил), то выдаёт такую ошибку:

    {

    «error»: {

    «errors»: [

    {

    «domain»: «global»,

    «reason»: «parseError»,

    «message»: «Parse Error»

    }

    ],

    «code»: 400,

    «message»: «Parse Error»

    }

    }

    Reply
  23. Deryni

    Указанную проблему удалось решить так:

    Вот этот блок

    Соединение.SetRequestHeader(«Content-Length», СтрДлина(Тело));

    Соединение.SetRequestHeader(«Content-Type», «application/json; charset=UTF-8»);

    Вставляем как для новых файлов, так и для обновляемых и всё работает.

    В результате процедуры выглядит так:

    Функция ОбновитьДокумент(Соединение, ТокенАвторизации, ИмяФайла, ИмяТаблицы, ИдДокумента) Экспорт
    КоличествоБайт = РазмерФайла(ИмяФайла);
    
    Если ПустаяСтрока(ИдДокумента) Тогда
    
    Тело =
    «{
    | «»title»»: «»» + ЭкранироватьСимвол(ИмяТаблицы, «»»») + «»»,
    | «»fileExtension»»: «»xls»»
    |}»;
    
    Соединение.Open(«POST», «https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable&convert=true», 0);
    Иначе
    Соединение.Open(«PUT», «https://www.googleapis.com/upload/drive/v2/files/» + ИдДокумента + «?uploadType=resumable&convert=true», 0);
    Тело = «»;
    КонецЕсли;
    
    Соединение.SetRequestHeader(«Content-Length», СтрДлина(Тело));
    Соединение.SetRequestHeader(«Content-Type», «application/json; charset=UTF-8»);
    Соединение.SetRequestHeader(«Authorization», «Bearer «+ТокенАвторизации);
    Соединение.SetRequestHeader(«X-Upload-Content-Type», «application/vnd.ms-excel»);
    Соединение.SetRequestHeader(«X-Upload-Content-Length», КоличествоБайт);
    

    Показать

    Кроме того было обнаружено, что MSScriptControl.ScriptControl не работает на 64-битном сервере 1С.

    Поэтому кодирование строки в URI было выполнено раскомментированием соотв. процедуры в модуле, которая делает это без внешних компонент.

    Функция для преобразования имени в URI выглядит так:

    Функция URLEncode(Знач Строка=»»)
    Строка = ЭкранироватьСимвол(Строка, «‘»);
    //ScrCtrl = Новый COMОбъект(«MSScriptControl.ScriptControl»);
    //ScrCtrl.Language = «JScript»;
    //Сообщение = ScrCtrl.eval(«var uri='»+Строка+»‘; encodeURI(uri);»);
    Сообщение = URLEncode0(Строка);
    Сообщение = ЭкранироватьСимвол(Сообщение, «‘»);
    Возврат Сообщение;
    КонецФункции
    

    Показать

    Reply
  24. zan_od

    (23) Deryni, спасибо.

    Reply
  25. script

    (23) Deryni,

    После изменений в процедуре

    URLEncode(Знач Строка=»»)

    на 32 разрядном сервере 1С, файл не обновляется, а создается новый.

    Если вернуть текст процедуры изначальный — все работает на УРА.

    Спасибо огромное за технологию.

    Reply
  26. Aldvinq

    Добрый день!

    Работаю на 64-разрядном сервере.

    Сперва столкнулся с ошибкой «code»: 400 при попытке обновить ранее выгруженный документ, затем воспользовался советом (23) — ошибка исчезла, но каждый раз начала создаваться новая таблица с одним и тем же наименованием. Что все-таки нужно поправить, чтобы обновлялась существующая таблица?

    Reply
  27. cwant

    Не работает 🙁

    Reply
  28. Ark_W

    Здравствуйте!

    Подскажите, как указать имя файла загружаемого на google диск?

    Reply
  29. zan_od

    (28) На форме реквизит «Имя таблицы»

    Reply
  30. user944024

    Добрый день! для 7.7. обработка в архиве есть? обработка конвертирует из xls в гугл док? умеет работать по расписанию?

    Reply
  31. zan_od

    (30) Добрый день. Обработка потеряла актуальность, работоспособность не проверял. Скорей всего не работает, так как с момента последней доработки API Google Drive менялся. Обработку можно использовать как основу для собственных наработок. Я пошел другим путем: написал небольшую Java-программу, которая использует официальный пакет Java на сайте разработчиков https://developers.google.com/drive/v3/web/quickstart/java, а из 1С запускаю JAR из командной строки с параметрами. Если кому-то интересно, могу выложить исходный код или проект.

    Reply
  32. hvh757

    (31) Доброго дня. Тема интересна. Если есть возможность — вышлите исходный код (можно и проект) на hvh@7-5-7.ru . Заранее благодарен.

    Reply
  33. user1076980

    Добрый день. Если еще актуальна данная помощь, то не могли бы Вы скинуть исходный код?)

    Reply
  34. Adecvator

    (31) Доброго дня. интересует исходный код на kirichenkod@gmail.com. Заранее благодарен.

    Reply
  35. user602990_lvv

    Здравствуйте.

    Интересует чтение уже загруженного на google документа в 1с7.7

    Подскажите, пожалуйста, на почту vitaliy1972li@yandex.ru.

    Стартмани нет еще.

    Спасибо.

    Reply
  36. bad_boys

    Здравствуйте.

    А делал кто то создание папок с 1с в гугл диск?

    Reply

Leave a Comment

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