|
Вопрос по ПоместитьВоВременноеХранилище, модуль объекта и теорию | ☑ | ||
---|---|---|---|---|
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) был про потребление памяти. Поэтому правильный ответ на вопрос - помещать во временное хранилище значительные объемы данных нельзя, особенно при многопользовательской работе. Обращение к сеансовым данным всегда происходит через кэш - т.е. будет расходоваться память рабочего процесса. Кроме того, эти данные будут пересылаться через сеть в менеджер кластера. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |