Имя: Пароль:
1C
1С v8
Ссылка на регистр сведений.
0 antihacker
 
18.11.16
13:56
Всем привет ! Помогите ради бога !  Замучался.

Ситуация такая.

Нужно загрузить файлы в регистр сведений и выгрузить от туда. С загрузкой вроед проблем.


Загружаю так.

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

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

&НаСервере
Процедура ДобавитФайлВСписок(ВыбранноеИмяФайла,АдресПрикрепленныйФайл)
    
    

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


Но не удаеться прочитать. Читаю так

&НаКлиенте
Процедура ФТЧДокументыДоговораВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
          
          Если Элементы.ФТЧДокументыДоговора.ТекущиеДанные.НовыйФайл Тогда  
               ПолучитьФайл(Элементы.ФТЧДокументыДоговора.ТекущиеДанные.АдресВременногоХранилища, "1213.png", Истина);  
           Иначе

              
               ин = Объект.ТЧДокументыДоговора.индекс(Элементы.ФТЧДокументыДоговора.ТекущиеДанные);

              
              
               ПолучитьФайл(СформироватьФайл(ин), "1213.png", Истина);  

          КонецЕсли;


КонецПроцедуры

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

Если Не КлючЗаписиРег.Пустой() Тогда

        Ссылкана= ПолучитьНавигационнуюСсылку(КлючЗаписиРег, "Картинка");
КонецЕсли;

возврат Ссылкана;


КонецФункции


Пишет                ПолучитьФайл(Элементы.ФТЧДокументыДоговора.ТекущиеДанные.АдресВременногоХранилища, "1213.png", Истина);  
по причине:
Неправильный путь к файлу 'e1c://server/skyzmo039vapp1/ABPDB/e1cib/tempstorage/091d8fca-ffe4-47d0-98f5-8c63eb751348'


ДАЙТЕ РАБОЧИЙ ПРИМЕР ! КАК ПАВИЛЬНО ПРОЧИТАТЬ ИЗ РЕГИСТРА СВЕДЕНИЙ - ФАЙЛ ?
1 antihacker
 
18.11.16
14:00
ах да забыл еще вот так в регитср кидаю\\&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
        Для Каждого ТекСтрока Из ТекущийОбъект.ТЧДокументыДоговора Цикл
        Если ЭтоАдресВременногоХранилища(ТекСтрока.АдресВременногоХранилища) Тогда
            
             //ДвоичныеДанные = ПолучитьИзВременногоХранилища(ТекСтрока.АдресВременногоХранилища);
                         
             МенеджерЗаписи=РегистрыСведений.ХранилищеФайлов.СоздатьМенеджерЗаписи();
             МенеджерЗаписи.НомерФайла = ТекСтрока.НомерСтроки;
             МенеджерЗаписи.ВладелецФайла=Объект.Ссылка;
             МенеджерЗаписи.ИмяФайла = ТекСтрока.ИмяФайла;
             МенеджерЗаписи.Картинка=Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(ТекСтрока.АдресВременногоХранилища),Новый СжатиеДанных());

             МенеджерЗаписи.Записать();

        КонецЕсли;
        КонецЦикла;
    

КонецПроцедуры
2 Лефмихалыч
 
18.11.16
14:03
МенеджерЗаписи=РегистрыСведений.ХранилищеФайлов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.НомерФайла = НомерСтроки
МенеджерЗаписи.ВладелецФайла = Ссылка;
МенеджерЗаписи.Прочитать();
3 antihacker
 
18.11.16
14:14
Забыл. Форма управляемая.
4 antihacker
 
18.11.16
14:17
Лефмихалыч,  а а как потом получить ссылку на ?
6 Лефмихалыч
 
18.11.16
16:03
(4) какую ссылку тебе надо?
7 antihacker
 
22.11.16
07:22
Лефмихалыч?
Вот этот код работает.

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

возврат ВременныйАдресФайла;


А этот нет.

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

Если Не КлючЗаписиРег.Пустой() Тогда
        ВременныйАдресФайла= ПолучитьНавигационнуюСсылку(КлючЗаписиРег, "ДвоичныеДанныеФайла");
КонецЕсли;

возврат ВременныйАдресФайла;


В чем причина. Про эту ссылку я и говорю.

Регистр один и тот же. Двоичные данные там точно есть раз уж первый код открывает.

ПИшет

{БизнесПроцесс.БПДоговора.Форма.ФормаБизнесПроцесса.Форма(308)}: Ошибка при вызове метода контекста (ПолучитьФайл)
                    ПолучитьФайл(ВременныйАдресФайла, Элементы.ФТЧДокументыДоговора.ТекущиеДанные.ИмяФайла, Истина);
по причине:
Файл не обнаружен 'e1c://server/skyzmo039vapp1/ABPDB/e1cib/data/РегистрСведений.ХранилищеФайлов.ДвоичныеДанныеФайла?ВладелецФайла=9bee00155d0a6a0c11e6af99c5d7c074&ИмяФайла=PhoneBook.xlsx'
по причине:
Неправильный путь к файлу '/e1cib/data/РегистрСведений.ХранилищеФайлов.ДвоичныеДанныеФайла?ВладелецФайла=9bee00155d0a6a0c11e6af99c5d7c074&
8 Mauser
 
22.11.16
07:31
А что тебя заставляет думать, что данные базы и временное хранилище это одно и то же?
9 antihacker
 
22.11.16
07:37
Я так ни сказал. Но меня застваляет думать что  ПолучитьНавигационнуюСсылку и ПоместитьВоВременноеХранилище это не одно и тоже.
10 dmpl
 
22.11.16
07:38
(0) Ссылок на запись регистра сведений не существует. Это не ссылочный тип. Для идентификации записи надо указать отбор по всем измерениям регистра (не забыть про период у периодических регистров).
11 Mauser
 
22.11.16
07:39
(10) Существует навигационная ссылка, включающая в себя набор измерений. Так-то.
12 Mauser
 
22.11.16
07:40
(9) Тогда зачем ты пытаешься получить из временного хранилища то, чего там никогда не было?
13 Web00001
 
22.11.16
07:41
(12)зачем ты повторяешь за ним тоже самое, только другими словами?
14 Mauser
 
22.11.16
07:42
(13) Чтобы он понял что слово "Навигационная", оно не зря в названии участвует
15 dmpl
 
22.11.16
07:46
(11) Для которой надо указать отбор по всем изменениям, чтобы сослаться на конкретную запись.
16 antihacker
 
22.11.16
07:47
Mauser, ты не прав. Ты не знаешь чем отличаеться работа ПолучитьНавигационнуюСсылку и ПоместитьВоВременноеХранилище.

А вот   dmpl прав на все сто. В отбор я не включал одно измерение. Из за этого не работал. Сейчас работает.

Для ПолучитьНавигационнуюСсылку не нужен временное хранилище. Или же он сам создает его тихоря. Не знаю. Но точно не нужно этого делать программисту. Сам вытаскивает из поля с типом ХранилищеДанных и передает на клиент.
17 Mauser
 
22.11.16
07:50
(16) Точно, я не дочитал до получить файл.
18 antihacker
 
22.11.16
08:05
По ходу он и не создает временное хранилище.


Потому что этот код открывает файл

                    ПолучитьФайл(ВременныйАдресФайла, Элементы.ФТЧДокументыДоговора.ТекущиеДанные.ИмяФайла, Истина);
                    УдалитьИзВременногоХранилища(ВременныйАдресФайла);

Но когда дело доходит до

УдалитьИзВременногоХранилища(ВременныйАдресФайла);


Пишет что:


{БизнесПроцесс.БПДоговора.Форма.ФормаБизнесПроцесса.Форма(309)}: Ошибка при вызове метода контекста (УдалитьИзВременногоХранилища)

                    УдалитьИзВременногоХранилища(ВременныйАдресФайла);
по причине:
Ошибка удаления значения из временного хранилища
19 antihacker
 
22.11.16
08:06
Он как то  формирует сам файл где то. Это нам не известно. Где и как.
20 antihacker
 
22.11.16
08:15
Я вот одно не могу понять.

Почему он заставляет включать все измерения регистра ? Нужен не нужен, но объязан. В чем смысл ?
21 1dvd
 
22.11.16
08:34
(20) потому что одна запись в РС уникальна со своим набором ВСЕХ измерений. Если одно измерение не указано, то это может быть несколько записей
22 antihacker
 
22.11.16
08:40
То есть 1С исключает тот момент, где запись может быть уникальной без учета одной измерении.

Ясно !
23 dmpl
 
22.11.16
09:03
(20) Когда не все измерения указаны - это получается набор записей.
24 antihacker
 
22.11.16
09:17
Ага. Получаеться так если в наборе только одна запись. Набор, а не запись.
25 antihacker
 
22.11.16
09:19
Плохо, что ссылку нельзя открывать из вне. Если не ошибаюсь из вне через браузер только форма открываеться. Или я ошибаюсь 7
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший