Имя: Пароль:
1C
1С v8
Вопрос по ПоместитьВоВременноеХранилище, модуль объекта и теорию
,
0 ШангриЛа
 
10.06.13
20:30
Есть обработка.
В модуле объекта обработки заполняется табличная часть обработки у которой есть колонка "АдресВремХранилища" (Строка).

В цикле перебираются строки табличной части, по каждой строке создается ТабличныйДокумент с картинками. Табличный документ помещается во временное хранилище и адрес хранилища записывается в колонку строки табличной части.

Далее, управление переходит на клиента. В итоге, в форме получается заполненная табличная часть в каждой строке которой есть строка с адресом временного хранилища.

Пользователь кликает по строке табличной части, считывается табличный документ из временного хранилища и открывается.

Это можно реализовать с помощью ПоместитьВоВременноеХранилище или по окончанию работы процедуры модуля объекта, временное хранилище уничтожится?
1 exwill
 
10.06.13
20:31
Не уничтожится. Просто останется на сервере.
2 ДенисЧ
 
10.06.13
20:33
только может сдохнуть через некотрое время
3 H A D G E H O G s
 
10.06.13
20:34
(0) Все будет хорошо.
(2) 20 минут хватит всем. Ну или времени жизни формы.
4 ДенисЧ
 
10.06.13
20:34
(3) ага.... Билли тоже говорил про 640...
5 ИсчадиеADO
 
10.06.13
20:34
ПоместитьВоВременноеХранилище(<Данные>, <Адрес>)
Параметры:

<Данные> (обязательный)

Тип: Произвольный.
Данные, которые необходимо поместить во временное хранилище.
<Адрес> (необязательный)

Тип: УникальныйИдентификатор; Строка.
Адрес во временном хранилище, по которому надо поместить данные. Или уникальный идентификатор формы, во временное хранилище которой, надо поместить данные и вернуть новый адрес.
В случае, если передается УникальныйИдентификатор формы, то значение будет автоматически удалено после закрытия этой формы.
Если параметр не указан, помещенное значение будет удалено после очередного запроса сервера из общего модуля, при контекстном и неконтекстном серверном вызове из формы, при серверном вызове из модуля команды или при получении формы.
6 ШангриЛа
 
10.06.13
20:45
(5)

В модуле объекта:

Для каждого СтрокаТаб Из ТабличнаяЧасть Цикл
ТабДок = ПолучитьТабДок(СтрокаТаб);

УИД = Новый УникальныйИдентификатор;

АдресХр = ПоместитьВоВременноеХранилище(ТабДок, Уид);

СтрокаТаб.АдресХР = АдресХР;

КонецЦикла

Что надо сделать, чтобы потом хранилище жило пока не закроется форма?
7 ШангриЛа
 
10.06.13
20:47
+(6) или пока не начнут формировать отчет заново?
8 ИсчадиеADO
 
10.06.13
20:47
пихай УИД формы, вестимо
9 ИсчадиеADO
 
10.06.13
20:48
"В случае, если передается УникальныйИдентификатор формы, то значение будет автоматически удалено после закрытия этой формы" це
10 ШангриЛа
 
10.06.13
20:48
(8) дык в модуле объекта УИД формы чем отличается от обычного УИД?
11 ШангриЛа
 
10.06.13
20:49
(9) Меня смущает то, что если бы я это делал в модуле формы, то сомнений бы никаких не возникало.

А я хочу это делать в модуле объекта.
Разве разницы нет?
12 ИсчадиеADO
 
10.06.13
20:55
главное, чтобы УИД жил нужное тебе время. Можешь в любой модуль передать УИД как параметр, главное чтобы он объявлялся и жил на клиенте
13 ШангриЛа
 
10.06.13
20:59
(12) понял, спасибо :)

То есть в запуск процедуры модуля объекта передаю ЭтаФорма.УникальныйИдентификатор.

А в модуле объекта запихиваю его при создании врем. хранилища?
14 ШангриЛа
 
10.06.13
21:09
(12) попробовал на практике, спасибо.

Надеюсь, что пока жив УИД формы, все будет ништяк :)
15 ШангриЛа
 
10.06.13
21:17
Набросок:

В ФОРМЕ:
&НаКлиенте
Процедура Записать(Команда)
   УИДФормы = ЭтаФорма.УникальныйИдентификатор;
   
   ЗаписатьНаСервере(УИДФормы);
   
   ОтобразитьИзменениеДанных(Объект.Реквизит1,ВидИзмененияДанных.Изменение);
КонецПроцедуры

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


&НаКлиенте
Процедура ТабличнаяЧасть1АдресВремХрОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;

АдресВремХр = Элементы.ТабличнаяЧасть1.ТекущиеДанные.АдресВремХр;

ТабДок = ПолучитьИзВременногоХранилища(АдресВремХр);

ТабДок.Показать();

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


В МОДУЛЕ ОБЪЕКТА ОБРАБОТКИ:

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


Думаю, что перед перезапуском заполнения табличной части надо еще применять УдалитьИзВременногоХранилища.
А то юзер 50 раз нажмет у обработки кнопку "Сформировать" и сервер ляжет.
16 ШангриЛа
 
10.06.13
21:19
Спасибо всем за помощь и советы. Если есть что еще добавить, с удовольствием послушаю.
17 ШангриЛа
 
10.06.13
21:24
Еще вопрос.

Есть ли смысл сохранять ТабДок в файл на сервере, запихивать его во врем хранилище или лучше на клиенте сохранить?
18 ШангриЛа
 
10.06.13
21:29
+(17) В смысле, что на сервере:
- сохраню табличный документ в файл
- файл запихаю как двоичные данные во временное хранилище
- передам на клиент адрес хранилища.

Если надо, то потом просто получу двоичные данные по адресу и сохраню в папку.

Есть в этом смысл или лишняя нагрузка на сервер?
19 ШангриЛа
 
10.06.13
21:31
(18) Так-то удобнее все в модуле объекта обработки все обстряпать, а потом просто на клиенте из хранилища все тянуть.
20 ШангриЛа
 
10.06.13
21:43
Временное хранилище в памяти создается или это на диске сервера?
В смысле, сильно память оперативная сервера отожрется, если я создам пару тысяч временных хранилищ и помещу в каждое двоичные данные?
21 ДенисЧ
 
10.06.13
21:46
(20) сильно
22 ШангриЛа
 
10.06.13
21:50
(21) пля, а куда деваться, если надо массово формировать по нескольким тысячам строк табличный документ с картинками, и сохранять их в PDF на рабочем столе юзера.

Набуя - второй вопрос. Надо!
23 ДенисЧ
 
10.06.13
21:51
(22) ответить пользователю "вам это не надо"
24 ШангриЛа
 
10.06.13
21:54
(23) не так крут, чтобы ответить так.
25 ШангриЛа
 
10.06.13
21:54
+(24) есть задача, надо делать. Все оплачено :)
26 ДенисЧ
 
10.06.13
21:58
тогда делай. Не твоя память.
27 ШангриЛа
 
10.06.13
22:07
Вроде ограничения на количество временных хранилищ нет...

Для е = 1 По 10000 Цикл
       
       Спр = Справочники.Справочник1.Выбрать();
       
       Пока Спр.Следующий() Цикл
           
           СтрокаТЧ = ТабличнаяЧасть1.Добавить();
           СтрокаТЧ.Реквизит1 = Спр.Ссылка;
           ТабДок = Новый ТабличныйДокумент;
           
           АдресХр = ПоместитьВоВременноеХранилище(ТабДок,УИДФормы);
           СтрокаТЧ.АдресВремХр = АдресХр;
           
       КонецЦикла;
       
   КонецЦикла;

Но медленно, мля, работает....
28 ШангриЛа
 
10.06.13
22:13
Кстати, оперативная память не жрется, больше диском шуршит
29 ШангриЛа
 
10.06.13
22:14
+(28) файловая бд
30 H A D G E H O G s
 
10.06.13
23:11
ДенисЧ брелд написал, ну как обычно.
31 H A D G E H O G s
 
10.06.13
23:11
ВремХран храниться в темповых файлах винды в клиент-серверной и в файле 1Cv8tmp.1CD в файловом режиме.
32 H A D G E H O G s
 
10.06.13
23:13
(27)
Пока Спр.Следующий() Цикл
Для е = 1 По 10000 Цикл
Спр = Справочники.Справочник1.Выбрать();

Руки себе оторвите за такую херню
33 H A D G E H O G s
 
10.06.13
23:23
Когда выполнял формирование печатных форм рег отчетности на сервере (ибо памяти клиента не хватало) - передавал табдок через временное хранилище (с КЛИЕНТА на СЕРВЕР).

Передачи ДвоичныеДанные приводили к лютым тормозам, прямая передача табдока приводила к ошибке XDTO преобразования.

Табличный док был размера 600 метров примерно.

Его надо было разбить на листы для печати, вставим шапку и подвал на каждый лист (типовой алкгоритм, бил бы за него, но менять нельзя).
34 blopp
 
11.06.13
07:41
(20), (31)
См. руководство разработчика 20.2.3
...При получении на сервере значения из временного хранилища следует учитывать то, что оно получается по ссылке. В действительности, ссылка эта указывает на значение, которое хранится в кэше. В течение 20 минут, с момента помещения в хранилище или же с момента последнего обращения, значение сохранится в кэше, а затем записывается на диск и из кэша удаляется. ...

Это как бы намекает...
35 Defender aka LINN
 
11.06.13
07:47
(16) Что делает эта хрень в модуле объекта?
36 H A D G E H O G s
 
11.06.13
08:09
(34) Убей. Себя. Ап стену.
37 H A D G E H O G s
 
11.06.13
08:10
(34) "а затем записывается на диск"

Угу. Записывается. Ага.
38 blopp
 
11.06.13
13:57
Пусть меня считают некропостером но все же вдруг это еще кто-то прочитает кроме неадекватных ежей.

Вопрос в (20) был про потребление памяти.

Поэтому правильный ответ на вопрос - помещать во временное хранилище значительные объемы данных нельзя, особенно при многопользовательской работе. Обращение к сеансовым данным всегда происходит через кэш - т.е. будет расходоваться память рабочего процесса. Кроме того, эти данные будут пересылаться через сеть в менеджер кластера.