Имя: Пароль:
1C
1С v8
УФ. Хранение файла в справочнике
,
0 Wobland
 
12.09.12
16:51
Что-то я совсем запутался в этих УФ, направьте на путь истинный, плз.
Исходная задача: хранить вордовский документ в справочнике, по кнопке его показывать. Ради этого завёл реквизит справочника типа ХЗ, загружаю так:
&НаКлиенте
Процедура Загрузить(Команда)
   Диалог=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   Диалог.МножественныйВыбор=Ложь;
   Диалог.Фильтр="Документ Word|*.doc|Все файлы|*.*";
   Если Диалог.Выбрать() Тогда
       Данные=Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
       Сохранить(Данные);
   КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура Сохранить(Данные)
   об=РеквизитФормыВЗначение("Объект");
   об.Файл=Новый ХранилищеЗначения(Данные);
КонецПроцедуры

элемент справочника, есессно, записываю. но, когда хочу потом получить значение, выходит неопределено:
&НаКлиенте
Процедура Показать(Команда)
   ДобытьФайл();
КонецПроцедуры

&НаСервере
Процедура ДобытьФайл()
   об=РеквизитФормыВЗначение("Объект");
   Файл=об.Файл.Получить();  //Неопределено
КонецПроцедуры


что я не так делаю?
1 and2
 
12.09.12
16:52
в справочнике нехорошо.
в РС выносят.
или в подчиненный справочник
2 lavryshev
 
12.09.12
16:58
попробуй так

&НаСервере
Процедура Сохранить(Данные)
   об=РеквизитФормыВЗначение("Объект");
   об.Файл=Новый ХранилищеЗначения(Данные);
   ЗначениеВРеквизитФормы(об, "Объект");
КонецПроцедуры
3 Wobland
 
12.09.12
16:59
(1) чем нехорошо? вообще задача такова. есть пара-тройка документов, надо их куда-то деть. не более.
4 Wobland
 
12.09.12
17:00
(2) картина та же
5 Cmyk32
 
12.09.12
17:02
&НаКлиенте
Процедура Загрузить()
Перем Имя, Адрес;

Если ПоместитьФайл(Адрес, "", Имя, Истина, ЭтаФорма.УникальныйИдентификатор) тогда
ПоместитьФайлОбъекта(Адрес)
КонецЕслиК
КонецПроцедуры

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

(1) +1
6 Cmyk32
 
12.09.12
17:04
(5) Естессно, в процедуре ПоместитьФайлОбъекта параметр не АдресВХ, а Адрес.
7 mikecool
 
12.09.12
17:04
(3) тем, что постоянно будешь хранилище за ссылкой таскать, если 1С читает его автоматом
8 Wobland
 
12.09.12
17:05
(5) про ПоместитьФайл не знал, код, видимо, рабочий, спасибо, буду думать
(7) спасибо, понял
9 Wobland
 
12.09.12
17:18
хм. а ведь я и раньше в загрузке видел, что в Файле двоичные данные. а прочитать не мог. и сейчас не могу. то есть в (0) и (5) всё отрабатывает, по всей видимости, просто я не могу достать? как достать тогда?
&НаКлиенте
Процедура Загрузить(Команда)
   Перем Адрес, Имя;
   
   Если ПоместитьФайл(Адрес, "", Имя, Истина, ЭтаФорма.УникальныйИдентификатор) Тогда
       Сохранить(Адрес);
   КонецЕсли;
КонецПроцедуры

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

&НаКлиенте
Процедура Показать(Команда)
   ДобытьФайл();
КонецПроцедуры

&НаСервере
Процедура ДобытьФайл()
   об=РеквизитФормыВЗначение("Объект");
   Файл=об.Файл.Получить();
КонецПроцедуры
10 Cmyk32
 
12.09.12
17:21
(9) На клиенте "нет" хранилища значений. Т.е. присвоить значение реквизиту ты сможешь только на сервере, но для этого тебе нужно передать его с клиента. Для этого и предназначено временное хранилище. Погугли форум по запросам: "Временное хранилище" или "ПоместитьФайл".
11 Wobland
 
12.09.12
17:21
(10) дык вон же, с тебя скопипастил
12 Cmyk32
 
12.09.12
17:24
(11) Можно так

&НаКлиенте
Процедура ОткрытьФайл(Команда)
   АдресФайла = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Файл");
   
   ПолучитьФайл(АдресФайла, <<ИмяФайла>>, ИСТИНА);    
КонецПроцедуры
13 Wobland
 
12.09.12
17:26
не записывает.
Сообщить(СтрокаРезультата.Файл.Получить()=Неопределено);
говорит, да.

консоль запросов с обработкой результата
14 Cmyk32
 
12.09.12
17:26
(9) Смотря что ты собираешься делать с файлом.
У меня есть конфигурация, которую я готовила для публикации по работе с файлами. Могу переслать.
15 Wobland
 
12.09.12
17:27
(14) спасибо, думаю, смысла нет. хочу тупо хранить и показывать. чтобы документы за базой не таскать
16 Learn_
 
12.09.12
17:28
(15) я долго буду ждать ответа?
17 Wobland
 
12.09.12
17:30
(12) {Справочник.Задания.Форма.ФормаЭлемента.Форма(22)}: Ошибка при вызове метода контекста (ПолучитьФайл)
   ПолучитьФайл(АдресФайла,"c:\temp\00", Ложь);
по причине:
Ошибка при выполнении файловой операции  'e1c://filev/e/1c/портфолио/e1cib/data/Справочник.Задания.Файл?ref=9ab700158315a39b11e1fcd7983ac7ee'

видимо, это тоже говорит от том, что там пусто
18 Wobland
 
12.09.12
17:30
(16) какой вид ответа мадам предпочитает в это время суток?
19 Learn_
 
12.09.12
17:31
(18) я там тебе все написала
20 Wobland
 
12.09.12
17:31
я, конечно, сделаю на православном РС это всё. но очень интересно понять, почему вот так не работает
21 Wobland
 
12.09.12
17:32
(19) у меня ТАМ только рассылка от анекдот.ру
22 Cmyk32
 
12.09.12
17:33
(17) перед УдалитьИзВременногоХранилища(Адрес);
вставь
Об.Записать()
23 Wobland
 
12.09.12
17:35
(19) ах, вон оно что. от я дундук. я после сотни быстро в угадай мелодию убежал негров слушать. отвечаю: недолго
24 palpetrovich
 
12.09.12
17:35
сильно не вникал, вот из конфы, которую я рисовал, изучая УФ (тут про картинку, надеюсь с ДОК-ом аналогично), может поможет:

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

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

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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
   
   СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "ФайлКартинки");
   
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
   Если НЕ Объект.ИмяФайлаКартинки = "" Тогда
       СсылкаНаКартинкуВБазе = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ФайлКартинки");
   КонецЕсли;
   
КонецПроцедуры
25 Wobland
 
12.09.12
17:37
(22) так в об.Файл.Получить() уже что-то есть. это прикол такой у ХЗ - записывать сразу надо?
26 Learn_
 
12.09.12
17:38
(23) ТАМ пост 184
27 Wobland
 
12.09.12
17:39
(26) именно это я и имел в виду под дундуком ;)
28 Vladal
 
12.09.12
17:40
(27) А дай ссылко от Learn_
29 Wobland
 
12.09.12
17:40
(25) плин, а как (5) работало? а (5) работало?
(24) спасибо, выглядит очень похожим на то, что нужно
30 Wobland
 
12.09.12
17:41
(28) чо?
31 Cmyk32
 
12.09.12
17:43
(29) Да, конфу подняла - у меня там еще Записать() стояло.
32 Learn_
 
12.09.12
17:45
(30) че в аське не отвечаеш
33 Wobland
 
12.09.12
18:38
в итоге вышло вот так:

&НаКлиенте
Процедура Загрузить(Команда)
   Перем Адрес, Имя;
   
   Если ПоместитьФайл(Адрес, "", Имя, Истина, ЭтаФорма.УникальныйИдентификатор) Тогда
       Сохранить(Адрес, Имя);
   КонецЕсли;
КонецПроцедуры

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

&НаКлиенте
Процедура Показать(Команда)
   Расширение="";
   Адрес=ДобытьФайл(Расширение);
   ВременноеИмя=ПолучитьИмяВременногоФайла(Расширение);
   ПолучитьФайл(Адрес, ВременноеИмя, Ложь);
   ЗапуститьПриложение(ВременноеИмя);
КонецПроцедуры

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