Имя: Пароль:
1C
1С v8
Хранение docx в хранилище значений
0 mrParadox
 
11.07.12
16:16
Организовал хранение файлов в хранилище значений.
С большинством файлов проблем нет - загружаются в хранилище, открываются из хранилища нормально.
При загрузке файлов формата docx,xlsx возникла проблема. При попытки открыть такой файл выходит сообщение: "Не удалось открыть файл. Файл: v8_4FA4_91.tmp ...". Откуда берется расширение TMP никак в тол взять не могу. Помогите пожалуйста :)

1С 8.2.15.310
1 andrewks
 
11.07.12
16:17
как открываешь?
2 mrParadox
 
11.07.12
16:18
Процедура ОткрытиеФайла(СтандартнаяОбработка, ИмяФайла, Хранилище)
   СтандартнаяОбработка = Ложь;
   
   // Получить расширение файла.
   РасширениеВременногоФайла = Прав(ИмяФайла, 4);
   
   Если Лев(РасширениеВременногоФайла, 1) = "." Тогда
       // Получить имя временного файла. Установить расширение временного файла.
       РасширениеВременногоФайла = Прав(ИмяФайла, 3);
       ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеВременногоФайла);
   Иначе
       // Получить имя временного файла с расширением по умолчанию.
       ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
   КонецЕсли;
   
   // Сохранить файл на диске. Запустить приложение.
   СохранитьЗапуститьФайл(ИмяВременногоФайла, Хранилище, Истина);
КонецПроцедуры

Процедура СохранитьЗапуститьФайл(ИмяВнешнегоФайла, Хранилище, Запустить = Ложь)
   
   // Если не указано имя файла прервать выполнение процедуры
   Если ПустаяСтрока(ИмяВнешнегоФайла) Тогда
       Предупреждение("Не указано имя файла!");
       Возврат;
   КонецЕсли;
   
   // Сохранить файл на диске
   ВнешнийФайл = Хранилище.Получить();
   Попытка
       ВнешнийФайл.Записать(ИмяВнешнегоФайла);
   Исключение
       Сообщить("Ошибка при сохранении файла: " + ОписаниеОшибки(), СтатусСообщения.Важное);
       Возврат;
   КонецПопытки;
   
   // Запустить ассоциированное с файлом приложение. Открыть файл.
   Если Запустить Тогда
       
       Файл = Новый Файл(ИмяВнешнегоФайла);
       
       Если Файл.Существует() Тогда
           Попытка
               ЗапуститьПриложение("explorer " + ИмяВнешнегоФайла);
           Исключение
               Сообщить("Ошибка при запуске файла: " + ОписаниеОшибки(), СтатусСообщения.Важное);
               Возврат;
           КонецПопытки;
       Иначе
           Предупреждение("Не удалось найти файл " + ИмяВнешнегоФайла + " на диске!");
       КонецЕсли;
       
   КонецЕсли;
   
КонецПроцедуры
3 Reset
 
11.07.12
16:20
(2) указанные расширения имеют длину 4, поэтому строка
Если Лев(РасширениеВременногоФайла, 1) = "." Тогда
не срабатывает
4 andrewks
 
11.07.12
16:22
(2) расширение файла - это не последние три символа. это символы после последней точки в имени файла (или "", если точки нет)
5 mrParadox
 
11.07.12
16:23
Спасибо, попробую порыть в данном направлении. Признаюсь, данный код содран с объекта "ХранилищеДополнительнойИнформации" УПП. Похоже там такой же баг
6 mrParadox
 
11.07.12
16:46
Если кому интересно, исправленный рабочий вариант:

Процедура ОткрытиеФайла(СтандартнаяОбработка, ИмяФайла, Хранилище)
   СтандартнаяОбработка = Ложь;
   
   // Получить расширение файла.
   РасширениеВременногоФайла=ИмяФайла;
   ПозицияТочки=Найти(ИмяФайла,".");
   Пока ПозицияТочки>1 Цикл
       РасширениеВременногоФайла=Сред(РасширениеВременногоФайла,ПозицияТочки);
       ПозицияТочки=Найти(РасширениеВременногоФайла,".");        
   КонецЦикла;
   
   Если Лев(РасширениеВременногоФайла, 1) = "." Тогда
       // Получить имя временного файла. Установить расширение временного файла.
       РасширениеВременногоФайла = Прав(ИмяФайла, СтрДлина(РасширениеВременногоФайла)-1);
       ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеВременногоФайла);
   Иначе
       // Получить имя временного файла с расширением по умолчанию.
       ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
   КонецЕсли;
   
   
   // Сохранить файл на диске. Запустить приложение.
   СохранитьЗапуститьФайл(ИмяВременногоФайла, Хранилище, Истина);
КонецПроцедуры

// Процедура сохраняет значение реквизита Хранилище (двоичные данные) на диск.
// При необходимости открывает файл с использованием ассоциированного с ним приложения.
//
// Параметры:
//  ИмяВнешнегоФайла - путь, имя файла дле сохранения на диске
//  Запустить - булево, признак запускать ассоциированное с файлом приложение.
//
Процедура СохранитьЗапуститьФайл(ИмяВнешнегоФайла, Хранилище, Запустить = Ложь)
   
   // Если не указано имя файла прервать выполнение процедуры
   Если ПустаяСтрока(ИмяВнешнегоФайла) Тогда
       Предупреждение("Не указано имя файла!");
       Возврат;
   КонецЕсли;
   
   // Сохранить файл на диске
   ВнешнийФайл = Хранилище.Получить();
   Попытка
       ВнешнийФайл.Записать(ИмяВнешнегоФайла);
   Исключение
       Сообщить("Ошибка при сохранении файла: " + ОписаниеОшибки(), СтатусСообщения.Важное);
       Возврат;
   КонецПопытки;
   
   // Запустить ассоциированное с файлом приложение. Открыть файл.
   Если Запустить Тогда
       
       Файл = Новый Файл(ИмяВнешнегоФайла);
       
       Если Файл.Существует() Тогда
           Попытка
               ЗапуститьПриложение("explorer " + ИмяВнешнегоФайла);
           Исключение
               Сообщить("Ошибка при запуске файла: " + ОписаниеОшибки(), СтатусСообщения.Важное);
               Возврат;
           КонецПопытки;
       Иначе
           Предупреждение("Не удалось найти файл " + ИмяВнешнегоФайла + " на диске!");
       КонецЕсли;
       
   КонецЕсли;
   
КонецПроцедуры // СохранитьЗапуститьФайл()
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.