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

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
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день