Имя: Пароль:
1C
1С v8
Работа с хранилищем значения в табличной части 8.3
,
0 Adoff
 
19.02.15
03:47
Есть документ в табличной части которого хранятся сканы документов. Код открытия вложения:
&НаКлиенте
Процедура ВложенияСохранить(Команда)
    НомерСтроки = Элементы.Вложения.ТекущаяСтрока;
    Адрес = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Вложения.Файл", НомерСтроки);
    ПолучитьФайл(Адрес, "c:\Tmp\1.jpg", Истина);
КонецПроцедуры

этот код работает без проблем много лет в базе 8.2, но после перехода на 8.3 (текущая 8.3.5.1460) выдает ошибку:

Ошибка при вызове метода контекста (ПолучитьФайл) ПолучитьФайл(Адрес, ИмяФайлаВрем, Ложь);
по причине:
Неправильный путь к файлу 'e1c://filev/C/1C_Bases/v83/Test/e1cib/data/Документ.Заявка.Вложения.Файл?ref=b485002590e5a7ad11e4b311d46304e2&index=0'

Встречал очень много похожих тем, но решения так и не увидел. Этот же код отрабатывает, если брать вложение не из ТЧ, а из реквизита документа.
Может кто помочь?
1 Adoff
 
19.02.15
05:27
в режиме совместимости вплоть до 8.3.2 (включая) всё работает.
2 Записьдампа
 
19.02.15
08:06
НомерСтроки = Элементы.Вложения.ТекущаяСтрока;
Это - неверное предположение.
3 Adoff
 
19.02.15
08:31
(2) С чего это вдруг? Это номер строки, можно заменить на НомерСтроки = 0; результат не изменится.
4 WebberNSK
 
19.02.15
08:40
(3) он просто хочет сказать, что там хранится идентификатор, а не номер строки...

имхо тут надо писать на партнерский форму
5 Мимохожий Однако
 
19.02.15
08:43
Покажи функцию ПолучитьФайл() в СП для  8.3.5.1460
6 Мимохожий Однако
 
19.02.15
08:44
Параметры:

<Адрес> (обязательный)

Тип: Строка.
Расположение данных во временном хранилище или в информационной базе.
...
Навигационная ссылка немного другое
7 Adoff
 
19.02.15
10:53
(6) и что же, по-вашему, такое навигационная ссылка?

еще раз говорю, этот код работает на платформе 8.3.2
почему он перестал работать на более поздних версиях найти информацию не могу
8 WebberNSK
 
19.02.15
11:00
(7) а как подобные задачи решаются в типовых? в той же
9 Smallrat
 
19.02.15
11:02
(0) там поведедение похоже на то что для реквизита хранилища не вызывается метод Получить()
я тут это выяснял - помочь никто не смог
http://infostart.ru/public/195003/#comm

остаётся только переписать типа так:


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

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

&НаКлиенте
Процедура ВыгрузитьФайл(Команда)
    Если Элементы.Вложения.ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Если Не ДанныеЗаполнены(Элементы.Вложения.ТекущаяСтрока) Тогда
        Сообщить("Файл не загружен");
        Возврат;
    КонецЕсли;
    АдресХранилища = ПолучитьАдресХранилища();
    ПолучитьФайл(АдресХранилища, Элементы.Вложения.ТекущиеДанные.ИмяФайла, Истина);
    
КонецПроцедуры
10 Smallrat
 
19.02.15
11:02
Элементы.ПечатныеФормы.ТекущаяСтрока -> Элементы.Вложения.ТекущаяСтрока
11 Smallrat
 
19.02.15
11:05
забыл еще:

&НаСервере
Функция ДанныеЗаполнены(ТекущаяСтрока)
    ЭлементСправочника = РеквизитФормыВЗначение("Объект");
    Возврат ЭлементСправочника..Вложения.Получить(ТекущаяСтрока).Данные.Получить() <> Неопределено;
КонецФункции
12 Adoff
 
20.02.15
02:08
(8) в типовых все вложения помещены в отдельный справочник (бывает регистр), а в ТЧ ссылка на него

(9) Да, через временное хранилище работает. Спасибо!!!
13 fisher
 
20.02.15
11:37
(12) "в типовых все вложения помещены в отдельный справочник (бывает регистр), а в ТЧ ссылка на него" - и это неспроста так сделано. У тебя, каждый раз когда создается ДокументОбъект, вычитываются в память все его сканы.
14 Adoff
 
24.02.15
03:42
(13) это хранилище, оно не "вычитывается", пока я не выполню Получить()
15 fisher
 
26.02.15
10:52
(14) Ты заблуждаешься.
16 Adoff
 
27.02.15
05:14
(15) Это как-то аргументируется или просто топтание клавиатуры?
Интересно зачем тогда метод Получить(), если значение читается из базы в любом случае?
17 mehfk
 
27.02.15
06:07
(16) А ты воспользуйся профайлером в SQL.
18 fisher
 
27.02.15
13:37
(16) И в рекомендациях 1С прописано (то ли на ИТС, то ли в проф-разработке видел) и на практике проверяли. Пруфы искать лень. Если не веришь - сам найдешь. А Получить(), выходит, только преобразование данных к исходному типу выполняет.
19 fisher
 
27.02.15
13:51
Таки нашел, не поленился. В проф-разработке:
"Особенно аккуратно нужно относиться к возможности использования полей типа ХранилищеЗначения в составе объектов (например, справочников, документов), активно использующихся при реализации основной бизнес-логики. Ведь данные объектов считываются целиком при обращении к ним. Поэтому, например, вопрос хранения тех же фотографий лучше решать не в составе справочника Сотрудники, а в отдельном подчиненном справочнике или регистре сведений."
20 Adoff
 
02.03.15
04:53
(19) Спасибо за инфу!
Ошибка? Это не ошибка, это системная функция.