|
Передача Файла с Клиента на Сервер УПП | ☑ | ||
---|---|---|---|---|
0
Eskeych
23.07.21
✎
11:10
|
Здравствуйте, второй день мучаюсь с вопросом передачи файла между клиентом и сервером. Клиент это мой пк, Сервер Отдельная коробочка в другой стороне комнаты. База серверная. пробовал передать через временное хранилище, Адрес записывал как строку в рег.сведений, на сервере считывал, пытался получить через ПолучитьИзВременногоХранилища(), Но возвращает значение Неопределено. Что делать подскажите пж :) В какую сторону копать?
|
|||
1
ДенисЧ
23.07.21
✎
11:12
|
Глобальный контекст (Global context)
ПоместитьФайл (PutFile) Синтаксис: ПоместитьФайл(<Адрес>, <НачальноеИмяФайла>, <ВыбранноеИмяФайла>, <Интерактивно>, <УникальныйИдентификаторФормы>) |
|||
2
Eskeych
23.07.21
✎
11:28
|
(1) как получить адрес с этой функции, если его не задавать. Что бы получить файл на сервере.
Или вот так нужно: Адрес = ПоместитьВоВременноеХранилище(ПолноеИмяФайла, Идентификатор); ПоместитьФайл(Адрес, ПолноеИмяФайла(Адрес на клиенте),Ложь, Идентификатор); |
|||
3
ДенисЧ
23.07.21
✎
11:31
|
(2) <Адрес> (необязательный)
Тип: Строка. Адрес во временном хранилище, по которому должны быть помещены данные. Если значение параметра не задано или является пустой строкой, то будет создан новый файл. Расположение нового файла возвращается в данном параметре. Последние два предложения. |
|||
4
Мультук
гуру
23.07.21
✎
11:35
|
||||
5
Eskeych
23.07.21
✎
11:44
|
{ВнешняяОбработка.БК_РассылкаРасчетныхЛистов.Форма.Форма.Форма(112)}: Значение не является значением объектного типа (Записать)
Файл.Записать(Адрес); Адрес - e1cib/tempstorage/e82344fa-77bc-43fa-9b36-f58f4800eb66?seanceId=7cf97e47-e9cf-4400-8a11-4ad5c086f2a9 Пробовал еще: C:\Users\user\AppData\Local\Temp\temp.pdf |
|||
6
Eskeych
23.07.21
✎
11:45
|
Адрес в формате строка
|
|||
7
Kassern
23.07.21
✎
11:47
|
(6) в клиент серверном варианте это просто делается (работа со временным хранилищем)
На клиенте ДД=Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла); Адрес=ПоместитьВоВременноеХранилище(ДД,УникальныйИдентификатор); ЗагрузитьФайлExсelКодовНаСервере(Адрес,Файл.Расширение); На сервере ДД=ПолучитьИзВременногоХранилища(Адрес); ИмяФайла=ПолучитьИмяВременногоФайла(Расширение); ДД.Записать(ИмяФайла); |
|||
8
Eskeych
23.07.21
✎
12:00
|
(7) не работает ошибка та же Значение не является значением объектного типа (Записать)
в обработку запихнул ДД=Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла); Адрес=ПоместитьВоВременноеХранилище(ДД,УникальныйИдентификатор); Адрес записал в рег сведений в модуль регл задания ДД=ПолучитьИзВременногоХранилища(Адрес); ИмяФайла=ПолучитьИмяВременногоФайла(Расширение); ДД.Записать(ИмяФайла); Адрес для записи получал из регистра сведений |
|||
9
Eskeych
23.07.21
✎
12:01
|
если клиент и сервер 2 разных пк. то временное хранилище действует только на клиенте, правильно?
|
|||
10
Kassern
23.07.21
✎
12:03
|
(8) А зачем вам регистр и регламентное задание?
|
|||
11
Kassern
23.07.21
✎
12:03
|
(9) откройте сп и почитайте про параметр адрес в ПоместитьВоВременноеХранилище
|
|||
12
Kassern
23.07.21
✎
12:03
|
(11) откроете для себя много нового)
|
|||
13
Eskeych
23.07.21
✎
12:08
|
(10) мне нужно отправлять сообщения на почту из 1с. Обработкой формирую файлы с отчетом, в регистр записываю подобие очереди. Регламентным заданием хочу рассылать сообщения, что бы пользователь не ждал пока все отправится ибо сообщений может быть 200+. Но что бы их отправлять нужно на сервер передать файлы для отправки.
|
|||
14
Kassern
23.07.21
✎
12:15
|
(13) чет костылями запахло...эх если уж решил так реализовывать, то передавай сразу на сервер, когда обработкой отчеты формируешь и в регистре храни путь до файла на сервере. Либо создай общую папку и туда скидывай. Когда речь идет про временное хранилище, то данные там хранятся лишь во время жизни сеанса, а порой и жизни формы. Можешь еще следующий велосипед сделать: Добавить в регистр реквизит с типом хранилище значений и туда пихать твои сообщения. В общем все на ваш страх и риск. С упп я плотно не работал. В других конфах есть для этого ЭлектронноеПисьмоВходящее/Исходящее, типовые рассылки отчетов и т.д.
|
|||
15
ДенисЧ
23.07.21
✎
12:18
|
(14) В УПП тоже есть е-письма ))
Но их же тоже создать надо, а 200 штук - это многовато |
|||
16
Smallrat
23.07.21
✎
12:18
|
(9) действует в сеансе, в другой сеанс через временное хранилище ничего не передать. Если файл небольшой, а регистр свой проще сразу двоичные данные в регистр записать и прочитать их в задании.
|
|||
17
Eskeych
23.07.21
✎
12:21
|
(14) в том то и дело, я не могу файл на сервер записать ))
|
|||
18
Kassern
23.07.21
✎
12:22
|
(17) я же скидывал вам как в одном сеансе это делается. На клиенте передаете в хранилище, на сервере получаете по адресу из хранилища и записываете в временны файл на сервере.
|
|||
19
Kassern
23.07.21
✎
12:23
|
(18) а вы зачем то начали адрес пихать в регистр, закрывать текущий сеанс и в регламентом задании ждали чуда)
|
|||
20
Serg_1960
23.07.21
✎
12:25
|
УПП хоть и старая конфигурация, но БСП таки имеет:
ФайловаяСистемаКлиент.ЗагрузитьФайл() ФайловаяСистемаКлиент.ЗагрузитьФайлы() ... |
|||
21
Eskeych
23.07.21
✎
12:25
|
(19) так я не закрывал сеанс) у меня все в ошибку падало %)
|
|||
22
Kassern
23.07.21
✎
12:29
|
(21) ваше регламентное задание ничего не знает о данных во временном хранилище вашего сеанса. А судя по параметру 2 в "ПоместитьВоВременноеХранилище(ПолноеИмяФайла, Идентификатор);" то ваши данные в хранилище живут, пока живет форма, а не сеанс.
|
|||
23
Eskeych
23.07.21
✎
12:33
|
(21) Форма остается открытой. Сейчас попробую в регистр записать двоичные данные файла.
|
|||
24
Kassern
23.07.21
✎
12:39
|
(23) блин вы читали СП или нет? Там же по русски все написано:
Примечание: Временное хранилище, сформированное в одном сеансе, недоступно из другого сеанса. Исключением является возможность передачи данных из фонового задания в сеанс, инициировавший фоновое задание, с помощью временного хранилища. Для такой передачи следует в родительском сеансе поместить во временное хранилище пустое значение, передав идентификатор формы. Затем полученный адрес передать в фоновое задание через параметры фонового задания. Далее, если этот адрес использовать в параметре <Адрес>, то результат будет скопирован в сеанс, из которого было запущено фоновое задание. Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания. Данные, помещенные в фоновом сеансе в хранилище по сформированному в родительском сеансе адресу, сразу после помещения становятся недоступными в фоновом сеансе. |
|||
25
Kassern
23.07.21
✎
12:40
|
(23) внимательно прочитайте первую строчку. А потом подумайте, как так сеанс регламентного задания не видит данные временного хранилища вашего сеанса)
|
|||
26
Eskeych
23.07.21
✎
12:46
|
(24) Хорошо, а как тогда передать файл на сервер?)
Из двоичных данных собирать на севере файл? |
|||
27
Kassern
23.07.21
✎
12:48
|
(26) прочитайте еще раз (18). В любом случае он будет из двоичных данных там собираться.
|
|||
28
Kassern
23.07.21
✎
12:50
|
(26) Скину вам простой пример чтения файла экселя с клиента на сервере, может у вас появится понимание...
&НаКлиенте Процедура Пуск(Команда) Диалог=Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог.Заголовок = "Выберите файл Excel"; Диалог.ПолноеИмяФайла = ""; Диалог.ПредварительныйПросмотр = Истина; Диалог.Фильтр ="Формат Excel (*.xls;*.xlsx)|*.xls;*.xlsx|"; ВыбранФайл=Диалог.Выбрать(); Если ВыбранФайл Тогда Файл=Новый Файл(Диалог.ПолноеИмяФайла); ДД=Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла); Адрес=ПоместитьВоВременноеХранилище(ДД,УникальныйИдентификатор); ЗагрузитьФайлExсelНаСервере(Адрес,Файл.Расширение); КонецЕсли; КонецПроцедуры &НаСервере Процедура ЗагрузитьФайлExсelНаСервере(Адрес,Расширение) ДД=ПолучитьИзВременногоХранилища(Адрес); ИмяФайла=ПолучитьИмяВременногоФайла(Расширение); ДД.Записать(ИмяФайла); ТабДок=Новый ТабличныйДокумент; ТабДок.Прочитать(ИмяФайла,СпособЧтенияЗначенийТабличногоДокумента.Значение); |
|||
29
Kassern
23.07.21
✎
12:50
|
(27) Директивы &НаКлиенте\&НаСервере как раз определяют, где будет вызываться код.
|
|||
30
Eskeych
23.07.21
✎
12:54
|
(29) в УПП такого нет :) Там все пишется сплошняком. На управляемых формах это появилось, если не ошибаюсь
|
|||
31
Kassern
23.07.21
✎
13:01
|
(30) вам же знающие УПП люди подсказывали в (20) пробовали?
|
|||
32
Eskeych
23.07.21
✎
13:13
|
(31) Вот ифа с ИТС "Если в конфигурацию встроена Библиотека стандартных подсистем для помещения файлов во временное хранилище необходимо использовать процедуры ЗагрузитьФайл и ЗагрузитьФайлы общего модуля ФайловаяСистемаКлиент. Для сохранения данных файла между несколькими серверными вызовами необходимо использовать свойство ИдентификаторФормы параметра ПараметрыЗагрузки"
|
|||
33
Eskeych
23.07.21
✎
14:11
|
В общем моё говнецо заработало
НА КЛИЕНТЕ (обработка) Результат = ФормаОтчета.ЭлементыФормы.Результат; ТабДок = Новый ТабличныйДокумент; ТабДок.АвтоМасштаб = Истина; ТабДок.Вывести(Результат); ПутьКФайлу = "C:\Users\Public\РасчетныеЛисты\"; ИмяФайла = "РасчетныйЛист"+СотрудникОтбор+".pdf"; ПолноеИмяФайла = ПутьКФайлу+ИмяФайла; ВыгрузитьТДвФайл(ТабДок, ПолноеИмяФайла); ДД = Новый ДвоичныеДанные(ПолноеИмяФайла); //Из файла Делаем двоичные данные ХЗ = Новый ХранилищеЗначения(ДД); //помещаем в хранилище НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Получатель = СотрудникОтбор; НоваяЗапись.Почта = Почта; НоваяЗапись.ПутьХранения = ПолноеИмяФайла; //НоваяЗапись.АдресНаСервере = ИмяПромежуточногоФайла; НоваяЗапись.ДвоичныеДанные = ХЗ; //помещаем в регистр НА СЕРВЕРЕ (у меня в регл задании) ДД = ТабДок.Получить(); //Получаем двоичные данные из хранилища ИмяФайла=ПолучитьИмяВременногоФайла(".pdf"); ДД.Записать(ИмяФайла); Письмо.Вложения.Добавить(ИмяФайла); Всем спасибо за подсказки :) |
|||
34
серый КТУЛХУ
23.07.21
✎
14:38
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |