Имя: Пароль:
1C
 
Помогите пожалуйста загрузить эксель с яндекс диска
0 breezee
 
10.11.21
17:51
Коллеги, добрый день. Помогите пожалуйста загрузить эксель с ЯД. Получил токен и загружаю. Загрузку в инете нашел, работает, двочиные данные загружает, а вот сами двоичные данные сохраняются в табличный документ, но оптом не читаются. МОжет у Вас будет идея как починить? Нашел похожую тему, там автор не разобрался. Вот код загрузки
Я пытался записать двоичные данные в табличный документ - при чтении из временного файла ошибка, копироватьФайлы() не копирует, что делать не знаю) Подскажите, пожалуйста

....
Файл = СкачатьФайл_яд("disk:/Test3.xls");
....

Функция СкачатьФайл_яд(Знач Путь) Экспорт
    
    ИмяСервера = "cloud-api.yandex.net";
    ОтносительныйURL = "/v1/disk/resources/download?path=" + Путь;
    
    Заголовки = СформироватьЗаголовки();

    HttpЗапрос = Новый HTTPЗапрос(ОтносительныйURL, Заголовки);
    
    HttpСоединение = Новый HTTPСоединение(ИмяСервера, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
    HttpОтвет = HttpСоединение.Получить(HttpЗапрос);

    ТелоОтвета = HttpОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    ОбработатьКодСостояния(HttpОтвет, ОтносительныйURL, ТелоОтвета);
    
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ТелоОтвета);
    Ответ = ФабрикаXDTO.ПрочитатьJSON(Чтение);

    СтруктураURL = РазделитьURL(РаскодироватьСтроку(Ответ.href, СпособКодированияСтроки.КодировкаURL));
    HttpСоединение = Новый HTTPСоединение(СтруктураURL.ИмяСервера, СтруктураURL.Порт,,,,, Новый ЗащищенноеСоединениеOpenSSL);
    HttpЗапрос = Новый HTTPЗапрос(СтруктураURL.Путь);
    HttpОтвет = HttpСоединение.Получить(HttpЗапрос);
        
    // редирект
    Пока HttpОтвет.КодСостояния = 302 Цикл
        СтруктураURL = РазделитьURL(HttpОтвет.Заголовки.Получить("Location"));
        HttpСоединение = Новый HTTPСоединение(СтруктураURL.ИмяСервера, СтруктураURL.Порт,,,,, Новый ЗащищенноеСоединениеOpenSSL);
        HttpЗапрос = Новый HTTPЗапрос(СтруктураURL.Путь, Заголовки);
        HttpОтвет = HttpСоединение.Получить(HttpЗапрос);
    КонецЦикла;
    
    ОбработатьКодСостояния(HttpОтвет, СтруктураURL.Путь);
    
    ДанныеФайла = HttpОтвет.ПолучитьТелоКакДвоичныеДанные();
    //Адрес = ПоместитьВоВременноеХранилище(ДанныеФайла);
    //Возврат Адрес;
    
    Путь1 = HttpЗапрос.АдресРесурса;    
    Путь2 = ПолучитьИмяВременногоФайла("xls");
    КопироватьФайл(Путь1, Путь2);
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Прочитать(Путь2,СпособЧтенияЗначенийТабличногоДокумента.Значение);

    
      //Попытка
    //COMОбъект = Новый COMОбъект("Excel.Application");
    //Исключение
    //    //НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке());
    //КонецПопытки;
    //ИмяВременногоФайла = ПолучитьИмяВременногоФайла("XLS");
    //ДанныеФайла.Записать(ИмяВременногоФайла);    
    //
    //Попытка
    //    COMОбъект.Workbooks.Open(ИмяВременногоФайла);
    //Исключение
    //    COMОбъект.Quit(0);
    //    COMОбъект = 0;
    //    УдалитьФайлы(ИмяВременногоФайла);
    //    ВызватьИсключение(НСтр("ru = 'Ошибка при открытии файла шаблона.'") + Символы.ПС+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
    //КонецПопытки;  
    
    //Возврат Путь2;
    
КонецФункции

Процедура ОбработатьКодСостояния(Знач HttpОтвет, Знач ОтносительныйURL, Знач ТелоОтвета = "")
    Перем ТекстИсключения;
    Если (HttpОтвет.КодСостояния < 200) Или (HttpОтвет.КодСостояния >= 300) Тогда
        ТекстИсключения = "Запрос: " + ОтносительныйURL + Символы.ПС;
        ТекстИсключения = ТекстИсключения + "Код ответа: " + HttpОтвет.КодСостояния + Символы.ПС;
        ТекстИсключения = ТекстИсключения + "Тело ответа: " + ТелоОтвета;
        ВызватьИсключение ТекстИсключения;
    КонецЕсли;
КонецПроцедуры

Функция РазделитьURL(Знач URL)
    
    ИмяСервера = "";
    Путь = "";
    Протокол = "";
    Порт = 443;
    
    URL = СокрЛП(URL);
    
    Если Лев(URL, 7) = "http://" Тогда
        URL = Прав(URL, СтрДлина(URL) - 7);
        Протокол = "http";
    ИначеЕсли Лев(URL, 8) = "https://" Тогда
        URL = Прав(URL, СтрДлина(URL) - 8);
        Протокол = "https";
    КонецЕсли;

    Индекс = СтрНайти(URL, "/");
    Если Индекс Тогда
        ИмяСервера = Лев(URL, Индекс - 1);
        Путь = Сред(URL, Индекс);
    КонецЕсли;
    
    Индекс = СтрНайти(ИмяСервера, ":");
    Если Индекс Тогда
        Порт = Число(Сред(ИмяСервера, Индекс + 1));
        ИмяСервера = Лев(ИмяСервера, Индекс - 1);
    КонецЕсли;
    
    Результат = Новый Структура;
    Результат.Вставить("ИмяСервера", ИмяСервера);
    Результат.Вставить("Путь", Путь);
    Результат.Вставить("Протокол", Протокол);
    Результат.Вставить("Порт", Порт);
    
    Возврат Результат;
    
КонецФункции

Функция СформироватьЗаголовки()
    
    Токен = "AQAAAABaN1lFAAd-dyqXXCzwLkz8jjKn3CiFr7A";
    
    //Перем Заголовки;    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Accept", "application/json");
    Заголовки.Вставить("Content-Type", "application/json");
    //Если ТекущаяДата() > СрокДействияТокена Тогда
    //    Токен();
    //КонецЕсли;
    Заголовки.Вставить("Authorization", "OAuth " + Токен);
    Возврат Заголовки;

КонецФункции


Токен рабочий, файл тоже. Инфа не конфиденциальная(прайс контрагента), аккаунт разовый для загрузки
1 garantNo4x
 
10.11.21
17:58
ну попробуйте положить текстовый файл и скопировать ..
без загрузки в таблицу ..
если файл вытягивается то это одан ситуация, если нет то другая
2 Kassern
 
10.11.21
17:59
Вот тут у вас каша...
ДанныеФайла = HttpОтвет.ПолучитьТелоКакДвоичныеДанные();
    //Адрес = ПоместитьВоВременноеХранилище(ДанныеФайла);
    //Возврат Адрес;
    
    Путь1 = HttpЗапрос.АдресРесурса;    
    Путь2 = ПолучитьИмяВременногоФайла("xls");
    КопироватьФайл(Путь1, Путь2);
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Прочитать(Путь2,СпособЧтенияЗначенийТабличногоДокумента.Значение);

//////////////////////////////////////
Получили вы двоичные данные в ДанныеФайла, а дальше то что?
Что за путь 1 и путь 2? "КопироватьФайл" это не работает с https и зачем вообще тогда все написанное выше?)
Вы можете получить временный файл и в него записать двоичные данные, а потом уже табдоком его открывать.
3 Kassern
 
10.11.21
18:00
(2) и это при условии, что вы не накосячили ранее и в ДанныеФайла хранится действительно ДД.
4 garantNo4x
 
10.11.21
18:01
а вообще тут тема года полтора обсуждалась и тут был рабочий код по стягиванию файлов .. правда без загрузки в таблицу, но это второй момент
5 breezee
 
10.11.21
18:02
(2) Вот не открывается, тут каша, потому что пробовал по разному, сейчас уберу кашу и покажу код (4) Вот чет не нагуглил))
6 breezee
 
10.11.21
18:06
Вот так читает
.....
// редирект
    Пока HttpОтвет.КодСостояния = 302 Цикл
        СтруктураURL = РазделитьURL(HttpОтвет.Заголовки.Получить("Location"));
        HttpСоединение = Новый HTTPСоединение(СтруктураURL.ИмяСервера, СтруктураURL.Порт,,,,, Новый ЗащищенноеСоединениеOpenSSL);
        HttpЗапрос = Новый HTTPЗапрос(СтруктураURL.Путь, Заголовки);
        HttpОтвет = HttpСоединение.Получить(HttpЗапрос);
    КонецЦикла;
    
    ОбработатьКодСостояния(HttpОтвет, СтруктураURL.Путь);
    
    ТабДок = Новый ТабличныйДокумент;
    
    ДанныеФайла = HttpОтвет.ПолучитьТелоКакДвоичныеДанные();
    
    ВремФайл = ПолучитьИмяВременногоФайла("xls");
    ДанныеФайла.Записать(ВремФайл);
    
    ТабДок2= новый ТабличныйДокумент;
    ТабДок2.Записать(ВремФайл, ТипФайлаТабличногоДокумента.XLS);
    
    ТабДок.Прочитать(ВремФайл,СпособЧтенияЗначенийТабличногоДокумента.Текст);


Но табДок пустой получается
7 garantNo4x
 
10.11.21
18:10
8 Ёпрст
 
10.11.21
18:10
(0) просто ДанныеФайла.Записать("d:\123.xls")
9 Ёпрст
 
10.11.21
18:11
литл трейдинг.. салфетки гель для рук..
Короче, работает
10 breezee
 
10.11.21
18:13
(8) А у Вас читает? У меня вот тут
ВремФайл = ПолучитьИмяВременногоФайла("xls");
    ДанныеФайла.Записать(ВремФайл);
    
    ТабДок2= новый ТабличныйДокумент;
    ТабДок2.Записать(ВремФайл, ТипФайлаТабличногоДокумента.XLS);
    
    ТабДок.Прочитать(ВремФайл,СпособЧтенияЗначенийТабличногоДокумента.Текст);
ТабДок пустой, доступа просто к серверу нет посмотреть что там, сейчас порошу чтобы файл скинули
11 Ёпрст
 
10.11.21
18:14
(10) ну, файло на диске открылось экселем
12 Ёпрст
 
10.11.21
18:14
а в моксель я его не выводил..
13 polosov
 
10.11.21
18:14
Токен = "AQAAAABaN1lFAAd-dyqXXCzwLkz8jjKn3CiFr7A";
    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Accept", "application/json");
    Заголовки.Вставить("Content-Type", "application/json");
    Заголовки.Вставить("Authorization", "OAuth " + Токен);    
    
    Результат = ОбщийМодуль2.GetJson("https://cloud-api.yandex.net/v1/disk/resources/download?path=disk:/Test3.xls", Неопределено, Новый Структура("Заголовки", Заголовки));    
    ПутьДляСкачивания = Результат.Получить("href");
    
    Результат = ОбщийМодуль2.Get(ПутьДляСкачивания);
    Результат.Тело.Записать(ПутьДляСохранения + "\111.xls");
14 polosov
 
10.11.21
18:15
15 breezee
 
10.11.21
18:21
(14) (13) Спасибо большое, но у меня не прочиталось
Токен = "AQAAAABaN1lFAAd-dyqXXCzwLkz8jjKn3CiFr7A";

    

    Заголовки = Новый Соответствие;

    Заголовки.Вставить("Accept", "application/json");

    Заголовки.Вставить("Content-Type", "application/json");

    Заголовки.Вставить("Authorization", "OAuth " + Токен);    

    

    Результат = GetJson("https://cloud-api.yandex.net/v1/disk/resources/download?path=disk:/Test3.xls", Неопределено, Новый Структура("Заголовки", Заголовки));    

    ПутьДляСкачивания = Результат.Получить("href");

    

    Результат = Get(ПутьДляСкачивания);
    
    ПутьДляСохранения = ПолучитьИмяВременногоФайла("xls");
    
    Результат.Тело.Записать(ПутьДляСохранения);
    
    ТабДок = Новый ТабличныйДокумент;
    
    ТабДок.Прочитать(ПутьДляСохранения,СпособЧтенияЗначенийТабличногоДокумента.Текст);


Вот так сделал, пишет

по причине:
Ошибка при выполнении файловой операции  'C:\Users\USR1CV8\AppData\Local\Temp\v8_D7E4_1aa.xls'. Доступ к файлу не может быть получен.

Может у меня просто какие-то проблемы со чтением экселя? На сервере экселя нет. Другие эксели которые через копироватьфайл() нормально читаются
16 polosov
 
10.11.21
18:22
(15) У тебя файл на сервере возможно.
17 breezee
 
10.11.21
18:22
(16) Да, он на сервере, код серверный
18 polosov
 
10.11.21
18:23
Хотя нет.  Ты же временный создал.
19 Kassern
 
10.11.21
18:23
(10) вы хоть понимаете, что вы тут пишите? У табдока есть замечательный метод прочитать.
20 breezee
 
10.11.21
18:24
(19) Я читаю и получается пустой табдок
21 breezee
 
10.11.21
18:25
(13) А у Вас эксель сохраняется?
22 polosov
 
10.11.21
18:25
Файл кривой. Его не может прочитать ТабличныйДокумент.
23 polosov
 
10.11.21
18:26
(21) Файл ОпенОфисом открывается. Да ексель. Но формат какой-то другой.
24 breezee
 
10.11.21
18:29
(23) Спасибо большоре не знал
25 breezee
 
10.11.21
18:32
А может из-за картинок такое быть?
26 polosov
 
10.11.21
18:33
(25) Может, а может пересохранить файл в xlsx перед выкладыванием поможет.
27 breezee
 
10.11.21
18:36
Спасибо большое за помощь всеа, пойду спать
28 Fram
 
10.11.21
18:37
(6) вот это нахрена?

ТабДок2= новый ТабличныйДокумент;
    ТабДок2.Записать(ВремФайл, ТипФайлаТабличногоДокумента.XLS);
29 Fram
 
10.11.21
18:45
Записываешь пустой табдок в файл, читаешь его, и удивляешься что он пустой 🤦‍♂️
30 breezee
 
10.11.21
18:52
(29) да чёт не знал уже что делать))
31 Смотрящий
 
10.11.21
19:43
А какой размер файла то читаешь ?
32 Смотрящий
 
10.11.21
19:43
который читаешь
Независимо от того, куда вы едете — это в гору и против ветра!