Имя: Пароль:
1C
1С v8
Ошибка прикрепления файлов к базе данных
0 Lolipop
 
14.11.15
17:29
На форме справочника  есть две кнопки. "Загрузить с диска" и "загрузить на диск".

Есть реквизиты справочника "Файл", "ИмяФайла", "Ссылка на файл во временном хранилище".

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

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

Загрузка происходит без ошибки, данные о нахождении файла сорхраняются в реквизит, но при сохранении этого файла происходит ошибка

по причине:
Неправильный путь к файлу 'e1c://filev/C/Users/Роман/Documents/InfoBase3/e1cib/tempstorage/59809ecc-0c72-4d9f-ba19-f7b0bac254f3'

В Чем может быть ошибка?
1 Горогуля
 
14.11.15
17:31
в Объект.СсылкаНаФайлВоВременномХранилище
2 Lolipop
 
14.11.15
17:33
(1) Почему?
А как еще сохранять и обращаться?
3 Горогуля
 
14.11.15
17:58
у меня такая фигня на форме хранилась, а не в объекте
4 Lolipop
 
14.11.15
17:59
(3) Так форма не сохраняет данных, разве не так?
5 Горогуля
 
14.11.15
18:00
(4) реквизиты формы в БД не хранятся
6 Lolipop
 
14.11.15
18:01
(5) Переделал так

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

ПолучитьФайл(СсылкаНаФайлВИБ, Объект.ИмяФайла);
по причине:
Неправильный путь к файлу 'e1c://filev/C/Users/Роман/Documents/InfoBase3/e1cib/data/Справочник.Файлы.Файл?ref=9bd9446d5740156611e58adf2c83e6cf'
7 Lolipop
 
14.11.15
18:01
Все тоже самое
8 Горогуля
 
14.11.15
18:01
а видел же я в какой-то типовой картинки. вроде это номенклатура была. а что, если картинка номенклатуры попала в базу из файла? это же будет целый прорыв! масса готового к употреблению исходного кода
9 Горогуля
 
14.11.15
18:03
>Есть реквизиты справочника "Файл"
а за это можно и линейкой по пальцам схлопотать. если это ХЗ
10 Lolipop
 
14.11.15
18:05
(9) Это ХЗ.
То есть, надо обработать в двоичных данных?

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)      

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

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

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

&НаКлиенте
Процедура Загрузить(Команда)
    Диалог=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.МножественныйВыбор=Ложь;
    Диалог.Фильтр="Документы Word|*.doc|Все файлы|*.*";
    Если Диалог.Выбрать() Тогда
        АдресФайла=ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла), УникальныйИдентификатор);
        Ф=Новый Файл(Диалог.ПолноеИмяФайла);
        РасширениеФайла=Сред(Ф.Расширение, 2);
        Модифицированность=Истина;
    КонецЕсли;
КонецПроцедуры

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