Открытие файла из хранилища

1. NatalkaBal 28 15.04.19 15:11 Сейчас в теме
Добрый день! Подскажите пожалуйста как открыть файл из хранилища. Делаю следующим образом, не получается

Добавление файла:
&НаКлиенте
Процедура ЗагрузитьФайлыСДискаОповещение(ЭтотОбъект)
    
    Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);    
    НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
    
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    
    //Если пользователь отказался от выбора файла, то закрываем форму
    Если Не Результат Тогда
        Возврат;
    КонецЕсли;

    Модифицированность = Истина;
    
    ЗаписатьВложениеНаСервере(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры);
        
КонецПроцедуры

&НаСервере
Процедура ЗаписатьВложениеНаСервере(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
    
    ВыбранныйФайл = Новый Файл(ВыбранноеИмяФайла);
    
    НовыйФайл = Справочники.ХранилищеФайлов.СоздатьЭлемент();
    НовыйФайл.Наименование  = ВыбранныйФайл.ИмяБезРасширения; 
    НовыйФайл.ИмяФайла      = ВыбранныйФайл.Имя; //Тип Строка (неограниченная)
    НовыйФайл.ВладелецФайла = Объект.Ссылка;       // Тип ДокументСсылка, СправочникСсылка
	
    СтруктураДанныхФайла = Новый Структура;
    СтруктураДанныхФайла.Вставить("ИмяФайла",       ВыбранныйФайл.Имя);
    СтруктураДанныхФайла.Вставить("ДанныеФайла", ПолучитьИзВременногоХранилища(Адрес));
    
     НовыйФайл.Файлы = Новый ХранилищеЗначения(СтруктураДанныхФайла); //Тип ХранилищеЗначения
	
    НовыйФайл.Записать();
    
КонецПроцедуры
Показать


Открытие файла
&НаКлиенте
Процедура СписокФайловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	НачатьПолучениеКаталогаДокументов(Новый ОписаниеОповещения("КаталогДокументовЗавершение", ЭтотОбъект));
	
КонецПроцедуры

&НаКлиенте
Процедура КаталогДокументовЗавершение(ИмяКаталогаДокументов, ДополнительныеПараметры) Экспорт 
    
    Адрес    = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
    ИмяФайла = "";
    
    ПолучитьДанныеФайлаНаСервереБезКонтекста(Адрес, ИмяФайла);
    
    ПолноеИмяФайла = ИмяКаталогаДокументов + ИмяФайла;
    
    МассивПолучаемыхФайлов = Новый Массив;
    МассивПолучаемыхФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, Адрес));
    
    НачатьПолучениеФайлов(Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект), МассивПолучаемыхФайлов,, Ложь);
    
КонецПроцедуры 

&НаКлиенте
Процедура ОткрытьФайлЗавершение(ПолученныеФайлы, ДополнительныеПараметры) Экспорт 
    
    Если ПолученныеФайлы = Неопределено
        И Не (ТипЗнч(ПолученныеФайлы) = Тип("Массив")
            И ПолученныеФайлы.Количество()) Тогда
        Возврат;
    КонецЕсли;
    
    НачатьЗапускПриложения(Новый ОписаниеОповещения("НачатьЗапускПриложенияЗавершение", ЭтотОбъект), ПолученныеФайлы[0].Имя);
    
КонецПроцедуры 

&НаКлиенте
Процедура НачатьЗапускПриложенияЗавершение(КодВозврата, ДополнительныеПараметры) Экспорт 
КонецПроцедуры 

&НаСервере
Процедура ПолучитьДанныеФайлаНаСервереБезКонтекста(Адрес, ИмяФайла) 

    СтруктураФайла = Справочники.ХранилищеФайлов.НайтиПоНаименованию(ИмяФайла);
    
    ПоместитьВоВременноеХранилище(СтруктураФайла.Файлы, Адрес);
    
КонецПроцедуры 

Показать
По теме из базы знаний
Найденные решения
10. NatalkaBal 28 16.04.19 13:15 Сейчас в теме
Добила это открытие. Вот что получилось:

Загрузка файла
&НаКлиенте
Процедура ЗагрузитьДоговор(Команда)
	
    Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);    
    НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    
    //Если пользователь отказался от выбора файла, то закрываем форму
    Если Не Результат Тогда
        Возврат;
	КонецЕсли;
	
	Модифицированность = Истина;
    
    ЗаписатьВложениеНаСервере(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры);
        
КонецПроцедуры

&НаСервере
Процедура ЗаписатьВложениеНаСервере(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
	
    ВыбранныйФайл = Новый Файл(ВыбранноеИмяФайла);
    
    НовыйФайл = Справочники.ХранилищеФайлов.СоздатьЭлемент();
    НовыйФайл.Наименование  = ВыбранныйФайл.Имя;
    НовыйФайл.ИмяФайла      = ВыбранныйФайл.Имя;
    НовыйФайл.ВладелецФайла = Объект.Ссылка;
	
    //Записываем данные файла из временного хранилища в реквизит формы справочника.
	Если ЭтоАдресВременногоХранилища(Адрес) Тогда
        НовыйФайл.Файлы = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Адрес));
	КонецЕсли;
    
    НовыйФайл.Записать();
    
КонецПроцедуры
Показать


Открытие (оно же сохранение)
&НаКлиенте
Процедура СписокФайловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	СсылкаНаФайл = ПолучитьНавигационнуюСсылку(Элементы.СписокФайлов.ТекущиеДанные.Файл, "Файлы");
	ПолучитьФайл(СсылкаНаФайл, Элементы.СписокФайлов.ТекущиеДанные.Файл);
	
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Boneman 298 15.04.19 15:29 Сейчас в теме
а что конкретно не получается ? В каком месте ошибка, или что у вас происходит ?

и в этой строке, если отладчиком встать
НачатьЗапускПриложения(Новый ОписаниеОповещения("НачатьЗапускПриложенияЗавершение", ЭтотОбъект), ПолученныеФайлы[0].Имя);

то что находится в ПолученныеФайлы[0].Имя ? Это нормальное имя файла, с расширением, или абракадаберное временное имя без расширения ?
4. NatalkaBal 28 15.04.19 15:45 Сейчас в теме
(2)он сюда даже не заходит
останавливается по ошибки
НачатьПолучениеФайлов(Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект), МассивПолучаемыхФайлов,, Ложь);


тут
    МассивПолучаемыхФайлов = Новый Массив;
    МассивПолучаемыхФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, Адрес));
вроде все получает

3. andy_zhav 197 15.04.19 15:33 Сейчас в теме
Попробуйте через ДвоичныеДанные

&НаСервере
Процедура ЗаписатьВложениеНаСервере(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
    
    ВыбранныйФайл = Новый Файл(ВыбранноеИмяФайла);
    
    НовыйФайл = Справочники.ХранилищеФайлов.СоздатьЭлемент();
    НовыйФайл.Наименование  = ВыбранныйФайл.ИмяБезРасширения; 
    НовыйФайл.ИмяФайла      = ВыбранныйФайл.Имя; //Тип Строка (неограниченная)
    НовыйФайл.ВладелецФайла = Объект.Ссылка;       // Тип ДокументСсылка, СправочникСсылка
    
    СтруктураДанныхФайла = Новый Структура;
    СтруктураДанныхФайла.Вставить("ИмяФайла",       ВыбранныйФайл.Имя);
    СтруктураДанныхФайла.Вставить("ДанныеФайла", Новый ДвоичныеДанные(ВыбранныйФайл.Имя));
    
     НовыйФайл.Файлы = Новый ХранилищеЗначения(СтруктураДанныхФайла); //Тип ХранилищеЗначения
    
    НовыйФайл.Записать();
    
КонецПроцедуры
Показать
NatalkaBal; +1 Ответить
5. NatalkaBal 28 15.04.19 16:01 Сейчас в теме
(3)
Новый ДвоичныеДанные(ВыбранныйФайл.Имя)

При загрузки файла пишит Файл не обнаружен
6. andy_zhav 197 15.04.19 16:22 Сейчас в теме
(5) Да, все правильно пишет. Извиняюсь, недостаточно внимательно код прочитал. У вас сохранение на клиенте идет и потом имя файла на клиенте передается на сервер. Там оно уже не актуально.... Нужно сохранять двоичные данные на клиенте, помещать в хранилище на клиенте и адрес передавать на сервер.
&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    
    //Если пользователь отказался от выбора файла, то закрываем форму
    Если Не Результат Тогда
        Возврат;
    КонецЕсли;

    Модифицированность = Истина;

    ДвоичныеДанные = Новый ДвоичныеДанные(ВыбранноеИмяФайла);
    Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные)
    ЗаписатьВложениеНаСервере(Результат, Адрес, ДополнительныеПараметры);
        
КонецПроцедуры

&НаСервере
Процедура ЗаписатьВложениеНаСервере(Результат, Адрес, ДополнительныеПараметры)
    
   ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
    ВыбранноеИмяФайла = ПолучитьИмяВременногоФайла();
    ДвоичныеДанные.Записать(ВыбранноеИмяФайла);
    ВыбранныйФайл = Новый Файл(ВыбранноеИмяФайла);
    
    НовыйФайл = Справочники.ХранилищеФайлов.СоздатьЭлемент();
    НовыйФайл.Наименование  = ВыбранныйФайл.ИмяБезРасширения; 
    НовыйФайл.ИмяФайла      = ВыбранныйФайл.Имя; //Тип Строка (неограниченная)
    НовыйФайл.ВладелецФайла = Объект.Ссылка;       // Тип ДокументСсылка, СправочникСсылка
    
    СтруктураДанныхФайла = Новый Структура;
    СтруктураДанныхФайла.Вставить("ИмяФайла",       ВыбранныйФайл.Имя);
    СтруктураДанныхФайла.Вставить("ДанныеФайла", ДвоичныеДанные);
    
     НовыйФайл.Файлы = Новый ХранилищеЗначения(СтруктураДанныхФайла); //Тип ХранилищеЗначения
    
    НовыйФайл.Записать();
    
КонецПроцедуры

Показать



Както так...
NatalkaBal; +1 Ответить
7. NatalkaBal 28 15.04.19 16:59 Сейчас в теме
(6)А как его дальше открыть?
8. andy_zhav 197 15.04.19 17:16 Сейчас в теме
(7)
вот здесь бы я не передавал на сервер адрес а сделал бы функцию серверную.
Ну и имя файла тоже...
&НаКлиенте
Процедура КаталогДокументовЗавершение(ИмяКаталогаДокументов, ДополнительныеПараметры) Экспорт 
    
//    Адрес    = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
    ИмяФайла = ПолучитьИмяВременногоФайла();
    
    Адрес = ПолучитьДанныеФайлаНаСервереБезКонтекста(ИмяКаталогаДокументов); 
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
    ДвоичныеДанные.Записать(ИмяФайла);

// Это тогда не надо
//    ПолноеИмяФайла = ИмяКаталогаДокументов + ИмяФайла; 
    
    МассивПолучаемыхФайлов = Новый Массив;
    МассивПолучаемыхФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, Адрес));
    
    НачатьПолучениеФайлов(Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект), МассивПолучаемыхФайлов,, Ложь);
    
КонецПроцедуры 

&НаСервере
Функция ПолучитьДанныеФайлаНаСервереБезКонтекста(ИмяФайла) 

    СтруктураФайла = Справочники.ХранилищеФайлов.НайтиПоНаименованию(ИмяФайла);
    
   возврат ПоместитьВоВременноеХранилище(СтруктураФайла.Файлы);
    
КонецФункции

Показать


Вот. На 100% правильность не претендую, т.к. код не отлаживал и в принципе его в 1с не проверял щас. но общая идея такая
NatalkaBal; +1 Ответить
9. andy_zhav 197 15.04.19 17:23 Сейчас в теме
Может тогда и начать получение файлов тоже не надо. может уже на этом этапе можно открывать внешнее приложение
10. NatalkaBal 28 16.04.19 13:15 Сейчас в теме
Добила это открытие. Вот что получилось:

Загрузка файла
&НаКлиенте
Процедура ЗагрузитьДоговор(Команда)
	
    Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);    
    НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    
    //Если пользователь отказался от выбора файла, то закрываем форму
    Если Не Результат Тогда
        Возврат;
	КонецЕсли;
	
	Модифицированность = Истина;
    
    ЗаписатьВложениеНаСервере(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры);
        
КонецПроцедуры

&НаСервере
Процедура ЗаписатьВложениеНаСервере(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
	
    ВыбранныйФайл = Новый Файл(ВыбранноеИмяФайла);
    
    НовыйФайл = Справочники.ХранилищеФайлов.СоздатьЭлемент();
    НовыйФайл.Наименование  = ВыбранныйФайл.Имя;
    НовыйФайл.ИмяФайла      = ВыбранныйФайл.Имя;
    НовыйФайл.ВладелецФайла = Объект.Ссылка;
	
    //Записываем данные файла из временного хранилища в реквизит формы справочника.
	Если ЭтоАдресВременногоХранилища(Адрес) Тогда
        НовыйФайл.Файлы = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Адрес));
	КонецЕсли;
    
    НовыйФайл.Записать();
    
КонецПроцедуры
Показать


Открытие (оно же сохранение)
&НаКлиенте
Процедура СписокФайловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	СсылкаНаФайл = ПолучитьНавигационнуюСсылку(Элементы.СписокФайлов.ТекущиеДанные.Файл, "Файлы");
	ПолучитьФайл(СсылкаНаФайл, Элементы.СписокФайлов.ТекущиеДанные.Файл);
	
КонецПроцедуры
Показать
11. MikhailDr 18.10.19 15:14 Сейчас в теме
(10) Сделал точно так же. Вышла ошибка

HTTP: Not acceptable
Ошибка при работе с ресурсом /e1cib/files?cmd=GetInfoBaseFileURL
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот