|
ПоместитьВоВременноеХранилище() | ☑ | ||
---|---|---|---|---|
0
antihacker
21.11.16
✎
14:46
|
Всем привет !
В решение часто приходится читать двоичные данные из регистра сведений. Понятно как файл передаеться из сервера на клиент. Если отказаться использовать ПоместитьВоВременноеХранилище() на стороне сервера и вместо этого просто передать с сервера на клиент двоичные данные и на клиенте использовать ПоместитьВоВременноеХранилище(). Означает ли - это что я разгружаю сервер ? Типа что я там ничего не создаю. |
|||
1
DrZombi
гуру
21.11.16
✎
14:50
|
(0) >>> Означает ли - это что я разгружаю сервер
Ты загружаешь только свой мозг. Серверу фиолетово. Объем информации особо не уменьшается :) |
|||
2
beholder13
21.11.16
✎
14:52
|
Я могу ошибаться, но временное хранилище вроде как расположено на стороне сервера. Если Вы прочитаете на стороне клиента и очистите хранилище (УдалитьИзВременногоХранилища), то разгрузите.
(1) Есть мнение, что у человека идет речь о действительно крупных данных, к примеру, сканах документов в pdf или tiff. |
|||
3
beholder13
21.11.16
✎
14:54
|
+2 Ведь вам явно не нужны двоичные данные на стороне клиента, нужен сам файл, который они определяют, так и забирайте его и работайте с ним в памяти клиента.
|
|||
4
antihacker
21.11.16
✎
14:57
|
beholder13, ты прав. Скан. доки. Вто что означает забирайте ? Забирать с сервера ? Для этого нужно сперва создать на сервере, что и не хочеться этого. Идея просто. Ни создавать ничего на сервере. От туда просто получить двоичные данные из хранилища и уж потом создать на клиенте.
|
|||
5
Defender aka LINN
21.11.16
✎
15:00
|
(4) Создать ЧТО, простите?
|
|||
6
antihacker
21.11.16
✎
15:02
|
НУ файл ? Или я не правильно понял определение ПоместитьВоВременноеХранилище(). Если его испоьзовтаь на сервере, то временное хранилище где создастся ?
|
|||
7
beholder13
21.11.16
✎
15:03
|
(4) Попробуйте проделать то, о чем Вы говорите на сервере, и, если получится, подумайте, что из этого Вы можете вынести на клиент. На выходе должно получиться так, что на сервере Вы читаете только данные из регистра и помещаете во временное хранилище для передачи на клиент. Без временного хранилища не передадите, с этим придется смириться, понять и простить.
|
|||
8
antihacker
21.11.16
✎
15:07
|
Ну я уже сделал. Все работает.
На клиенте ЛокальныйАдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайлаСсервера, УникальныйИдентификатор); ПолучитьФайл(ЛокальныйАдресФайла, Элементы.ФТЧДокументыДоговора.ТекущиеДанные.ИмяФайла, Истина); На сервере &НаСервере Функция СформироватьФайл(ИмяФайла) ВременныйАдресФайла = ""; ЗапросСписокПользователей=Новый Запрос; ЗапросСписокПользователей.Текст=" | ВЫБРАТЬ | ХранилищеФайлов.ИмяФайла КАК ИмяФайла, | ХранилищеФайлов.ДвоичныеДанныеФайла КАК ДвоичныеДанныеФайла | ИЗ РегистрСведений.ХранилищеФайлов КАК ХранилищеФайлов ГДЕ ХранилищеФайлов.ВладелецФайла=&ВладелецФайла И ХранилищеФайлов.ИмяФайла=&ИмяФайла"; ЗапросСписокПользователей.УстановитьПараметр("ВладелецФайла", Объект.Ссылка); ЗапросСписокПользователей.УстановитьПараметр("ИмяФайла", ИмяФайла); РезЗапросСписокПользователей=ЗапросСписокПользователей.Выполнить().Выбрать(); Пока РезЗапросСписокПользователей.Следующий() Цикл Если ЗначениеЗаполнено(РезЗапросСписокПользователей.ДвоичныеДанныеФайла) Тогда ВременныйАдресФайла = РезЗапросСписокПользователей.ДвоичныеДанныеФайла.Получить(); КонецЕсли; КонецЦикла; возврат ВременныйАдресФайла; |
|||
9
beholder13
21.11.16
✎
15:07
|
(6) Более того, есть вероятность того, что на сервере нет приложения, способного работать с нужным файлом (допустим, не установлен MS Office, а надо работать с двоичным шаблоном Active Document, это как пример), и тогда для сервера, как ни крути, это просто бесполезный набор двоичных данных, которые имеют смысл только на клиенте, где пользователь будет работать непосредственно с файлом, и где эти данные действительно инициализируются во внешнем приложении. Да, в общем смысле Вы не создаете файл, а инициализируете сущность приложения, в котором этот файл открывается.
|
|||
10
beholder13
21.11.16
✎
15:08
|
(8) ДвоичныеДанныеФайлаСсервера - это что?
|
|||
11
antihacker
21.11.16
✎
15:09
|
Ой упустил
Вот так на клиенте ДвоичныеДанныеФайлаСсервера = СформироватьФайл(Элементы.ФТЧДокументыДоговора.ТекущиеДанные.ИмяФайла); //сообщить(АдресФайла); Если ДвоичныеДанныеФайлаСсервера <> "" Тогда ЛокальныйАдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайлаСсервера, УникальныйИдентификатор); ПолучитьФайл(ЛокальныйАдресФайла, Элементы.ФТЧДокументыДоговора.ТекущиеДанные.ИмяФайла, Истина); УдалитьИзВременногоХранилища(ЛокальныйАдресФайла); КонецЕсли; КонецЕсли; |
|||
12
beholder13
21.11.16
✎
15:10
|
ДвоичныеДанныеФайла - какой тип?
|
|||
13
antihacker
21.11.16
✎
15:10
|
Объясните мне. ПоместитьВоВременноеХранилище() не имеет значение где ты его используешь ? Все равно на сервере ?
|
|||
14
beholder13
21.11.16
✎
15:11
|
Есть мнение, что ХранилищеЗначения
|
|||
15
antihacker
21.11.16
✎
15:11
|
ДвоичныеДанныеФайла береться из поля регистра. А поле с типом ХранилищеЗначения.
|
|||
16
beholder13
21.11.16
✎
15:12
|
(13) Да, временное хранилище на сервере находится
|
|||
17
beholder13
21.11.16
✎
15:13
|
>> ЛокальныйАдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайлаСсервера, УникальныйИдентификатор);
вот это надо делать на сервере и возвращать на клиент только адрес |
|||
18
antihacker
21.11.16
✎
15:15
|
То есть ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайлаСсервера, УникальныйИдентификатор);
создаст временное хранилище все равно на сервере, если я даже использую на клиенте ? Тогда я наооброт загружаю сервер и сеть. Сперва получаю двоичные данные на клиент, потом отправляю на сервер и опять обратно получаю ссылку. А тут на сервере получил двоичные и там же создал и просто передал на клиент адрес. |
|||
19
beholder13
21.11.16
✎
15:15
|
А так получается, что сначала с сервера прилетают двоичные данные, потом летят обратно на сервер, и потом еще в ПолучитьФайл() летят обратно на клиент. Тут важно не столько разгрузить сервер, сколько соединение между клиентом и сервером.
|
|||
20
beholder13
21.11.16
✎
15:17
|
(18) да, только создавать ничего не надо на сервере, сразу кладите во ВременноеХранилище из ХранилищаЗначения
|
|||
21
beholder13
21.11.16
✎
15:20
|
А файл получается только для сохранения на диск, или же с ним надо работать в интерактивном режиме?
|
|||
22
antihacker
21.11.16
✎
15:20
|
Тогда подправтье ВременныйАдресФайла = "";
ЗапросСписокПользователей=Новый Запрос; ЗапросСписокПользователей.Текст=" | ВЫБРАТЬ | ХранилищеФайлов.ИмяФайла КАК ИмяФайла, | ХранилищеФайлов.ДвоичныеДанныеФайла КАК ДвоичныеДанныеФайла | ИЗ РегистрСведений.ХранилищеФайлов КАК ХранилищеФайлов ГДЕ ХранилищеФайлов.ВладелецФайла=&ВладелецФайла И ХранилищеФайлов.ИмяФайла=&ИмяФайла"; ЗапросСписокПользователей.УстановитьПараметр("ВладелецФайла", Объект.Ссылка); ЗапросСписокПользователей.УстановитьПараметр("ИмяФайла", ИмяФайла); РезЗапросСписокПользователей=ЗапросСписокПользователей.Выполнить().Выбрать(); Пока РезЗапросСписокПользователей.Следующий() Цикл Если ЗначениеЗаполнено(РезЗапросСписокПользователей.ДвоичныеДанныеФайла) Тогда ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); //Тут создаем наш файл и записываем его в ИмяВременногоФайла ДвоичныеДанные = РезЗапросСписокПользователей.ДвоичныеДанныеФайла.Получить(); ДвоичныеДанные.Записать(ИмяВременногоФайла); //Возвращаем на клиент адрес во временном хранилище ВременныйАдресФайла = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла), УникальныйИдентификатор); КонецЕсли; |
|||
23
antihacker
21.11.16
✎
15:22
|
ДвоичныеДанные = РезЗапросСписокПользователей.ДвоичныеДанныеФайла.Получить();
ВременныйАдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор); |
|||
24
beholder13
21.11.16
✎
15:22
|
Если РезЗапросСписокПользователей.Следующий() И ЗначениеЗаполнено(РезЗапросСписокПользователей.ДвоичныеДанныеФайла) Тогда
Возврат ПоместитьВоВременноеХранилище(РезЗапросСписокПользователей.ДвоичныеДанныеФайла.Получить()); Иначе Возврат ""; КонецЕсли |
|||
25
beholder13
21.11.16
✎
15:24
|
Вернется адрес во временном хранилище, если вторым параметром прописать UID формы, то временное хранилище умрет на сервере при ее закрытии вместе с ней
|
|||
26
antihacker
21.11.16
✎
15:24
|
ОК ! СПАСИБО БОЛЬШОЕ !
|
|||
27
beholder13
21.11.16
✎
15:24
|
(26) Не за что =)
|
|||
28
antihacker
21.11.16
✎
15:26
|
По поводу хранилище умрет вместе. Можно по подробнее. А то я везде кодом удаляю.
ВременныйАдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор); Вот здесь УникальныйИдентификатор разве не UID формы ? |
|||
29
beholder13
21.11.16
✎
15:27
|
(28) Да, все верно
|
|||
30
antihacker
21.11.16
✎
15:28
|
СПАСИБО БРАТ !
|
|||
31
beholder13
21.11.16
✎
15:29
|
+29 Можно удалить кодом наверняка, можно оставить в памяти, мало ли, еще пригодится в той же сессии, а придется опять на сервер идти и опять к БД обращаться, опять читать из ХранилищаЗначения и класть во ВременноеХранилище, это одна из самых громоздких операций и важно оптимизировать с учетом по максимуму всех возможностей
|
|||
32
antihacker
21.11.16
✎
15:37
|
АГА. Я это уже понал -)
|
|||
33
etc
21.11.16
✎
15:47
|
Теперь модно использовать функцию ПолучитьФайл():
Адрес = ПолучитьНавигационнуюСсылку(КлючЗаписиРегСведений, "ДанныеФайла"); ПолучитьФайл(Адрес, ИмяФайла, Истина); |
|||
34
beholder13
21.11.16
✎
15:59
|
(33) Пробовали использовать эти две великолепные строчки?) Нужно с умом подходить к использованию безусловных методов обращения к базе, каковым является ПолучитьНавигационнуюСсылку() в глобальном контексте. Они хорошо работают только когда речь идет о сферическом коне в вакууме, или же при полной отработке возможных критических ситуаций, которой я тут явно не вижу.
|
|||
35
antihacker
22.11.16
✎
06:26
|
beholder13, я пробовал этот метод, но не работает.
Можешь дать работающий пример ? |
|||
36
antihacker
22.11.16
✎
06:35
|
Ты про это ?
КлючЗаписиРег = РегистрыСведений.ХранилищеФайлов.СоздатьКлючЗаписи(Новый Структура("Ном", Объект.ссылка)); Отбор = Новый Структура; Отбор.Вставить("ВладелецФайла", Объект.Ссылка); Отбор.Вставить("НомерФайла", СокрЛП(НомерФайла+1)); КлючЗаписиРег = РегистрыСведений.ХранилищеФайлов.СоздатьКлючЗаписи(Отбор); Если Не КлючЗаписиРег.Пустой() Тогда Ссылкана= ПолучитьНавигационнуюСсылку(КлючЗаписиРег, "Картинка"); КонецЕсли; возврат Ссылкана; Ни как не могу добиться чо бы этот код заработал. |
|||
37
antihacker
22.11.16
✎
06:38
|
В моем случае эт отак
КлючЗаписиРег = РегистрыСведений.ХранилищеФайлов.СоздатьКлючЗаписи(Новый Структура("ИмяФайла", ИмяФайла)); Отбор = Новый Структура; Отбор.Вставить("ВладелецФайла", Объект.Ссылка); Отбор.Вставить("ИмяФайла", СокрЛП(ИмяФайла)); КлючЗаписиРег = РегистрыСведений.ХранилищеФайлов.СоздатьКлючЗаписи(Отбор); Если Не КлючЗаписиРег.Пустой() Тогда Ссылкана= ПолучитьНавигационнуюСсылку(КлючЗаписиРег, "ДвоичныеДанныеФайла"); КонецЕсли; возврат Ссылкана; |
|||
38
antihacker
22.11.16
✎
06:40
|
вот такая ошибка
{БизнесПроцесс.БПДоговора.Форма.ФормаБизнесПроцесса.Форма(308)}: Ошибка при вызове метода контекста (ПолучитьФайл) ПолучитьФайл(ВременныйАдресФайла, Элементы.ФТЧДокументыДоговора.ТекущиеДанные.ИмяФайла, Истина); по причине: Файл не обнаружен 'e1c://server/skyzmo039vapp1/ABPDB/e1cib/data/РегистрСведений.ХранилищеФайлов.ДвоичныеДанныеФайла?ВладелецФайла=9bee00155d0a6a0c11e6af99c5d7c074&ИмяФайла=images%20%20%20%20456.jpg' по причине: Неправильный путь к файлу '/e1cib/data/РегистрСведений.ХранилищеФайлов.ДвоичныеДанныеФайла?ВладелецФайла=9bee00155d0a6a0c11e6af99c5d7c074&ИмяФайла=images |
|||
39
Mauser
22.11.16
✎
07:33
|
Не осилил в одну тему?
Ссылка на регистр сведений. |
|||
40
antihacker
22.11.16
✎
07:55
|
По ходу он и не создает временное хранилище.
Потому что этот код открывает файл ПолучитьФайл(ВременныйАдресФайла, Элементы.ФТЧДокументыДоговора.ТекущиеДанные.ИмяФайла, Истина); УдалитьИзВременногоХранилища(ВременныйАдресФайла); Но когда дело доходит до УдалитьИзВременногоХранилища(ВременныйАдресФайла); Пишет {БизнесПроцесс.БПДоговора.Форма.ФормаБизнесПроцесса.Форма(309)}: Ошибка при вызове метода контекста (УдалитьИзВременногоХранилища) УдалитьИзВременногоХранилища(ВременныйАдресФайла); по причине: Ошибка удаления значения из временного хранилища |
|||
41
beholder13
22.11.16
✎
11:28
|
Так не удаляй принудительно
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |