1. NatalkaBal 25 15.04.19 15:11 Сейчас в теме

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

Добрый день! Подскажите пожалуйста как открыть файл из хранилища. Делаю следующим образом, не получается

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

Показать



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

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

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

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

Показать


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

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

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

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


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

Вакансии

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

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

Руководитель отдела внедрения 1С
Новосибирск
зарплата от 60 000 руб. до 160 000 руб.
Полный день

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