Имя: Пароль:
1C
1С v8
Прочитать файл во внешнем отчёте в клиент-серверном варианте
0 РыбаАист
 
06.12.23
15:42
ЗГУ 3.1. Платформа 8.3. Клиент-серверный вариант.

Сделали внешний отчёт, который берёт данные из указанного пользователем файла, отбирает нужные данные из базы и компонует в нужном виде. Отчёт работает, файл считывается, но только в файловом режиме.

В клиент-серверном же ошибка:
Каталог не обнаружен: "путь к каталогу"

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

Так вот вопрос:
Как передать файл с клиента на сервер, чтобы там его считать?

Пробовал через ПоместитьВоВременноеХранилище, не сработало.
1 РыбаАист
 
06.12.23
15:46
Файл читаю так:
ТабличныйДокумент.Прочитать(ПолучитьИзВременногоХранилища(Адрес), СпособЧтенияЗначенийТабличногоДокумента.Значение);
2 unenu
 
06.12.23
15:48
(0) передать можно через временное хранилище, но проще использовать пути в формате
\\...\...\МойФайл.тхт
если политики безопасности позволяют и права есть.
3 SleepyHead
 
06.12.23
15:49
(0) Отчет наверняка по умолчанию исполняется в фоне, а там свои тонкости с передачей значений через временное хранилище. Посмотри типовую общую форму "ФормаОтчета", как там передается, сделай так же.
4 SleepyHead
 
06.12.23
15:50
Если отчет со своей формой, и файл небольшой, можно в модуле формы просто скопировать файл в папку, видимую с сервера, и работать уже с этим файлом.
5 РыбаАист
 
06.12.23
15:58
(4) А как я скопирую файл с клиента на сервер, если серверу надо увидеть файл, чтоб скопировать к себе в каталог?
Или я что-то не понимаю, и копировать можно и на клиенте?

Или просто при указании каталога надо учитывать что путь с сервера к этому каталогу просто выглядит иначе, то есть узнать имя машины, на которой этот файл и попытаться выстроить путь с сервера к этому клиентскому каталогу...
6 Chai Nic
 
06.12.23
16:00
(2)  "пути в формате \\...\...\"
Вообще не правильно. Клиенте не обязан быть доступен с сервера. Он может например за NAT находиться или за файрволлом.
7 lis58
 
06.12.23
16:03
На клиенте
АдресФайла = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(Файл));

На сервере
ИмяВременногоФайла = "D:\*.*";
ДвоичныеДанныеФайлаИзХранилища = ПолучитьИзВременногоХранилища(АдресФайла);    ДвоичныеДанныеФайлаИзХранилища.Записать(ИмяВременногоФайла);

Как-то так вроде делал
8 Chai Nic
 
06.12.23
16:03
Самый простой но не самый правильный способ - это сериализовать двоичные данные и передать их в серверную процедуру как строку. А там обратно десериализовать.
9 РыбаАист
 
06.12.23
16:05
(7) Уже пробовал через поместитьВоВременноеХранилище
Не то же самое, что у меня написано?
10 lis58
 
06.12.23
16:05
(9) Нет. У меня копирует файл на сервер и там открывает
11 РыбаАист
 
06.12.23
16:08
(10) Теперь понял. Сейчас попробуем.
12 Chai Nic
 
06.12.23
16:14
(10) И так тоже не надо делать. Забудьте, что сервер может быть доступен с клиента иначе как через средства 1с.
13 РыбаАист
 
06.12.23
16:22
(10) Задумка интересная, сделать получилось. Но тоже не уверен, что оно того стоит. Там у клиента всё-таки всякая супер-пупер секретность и безопасность. Если перекидывать файлы на сервер - потом по башке настучат.
Но признаю, я сам спросил как перекинуть файл на сервер, так что соответствующий ответ и получил, так что спасибо.
14 Donkey_hot
 
06.12.23
16:30
(0) Если эксель или текстовик, можно прочитать на клиенте и передавать уже считанные данные, а не сам файл.
15 lis58
 
06.12.23
16:38
(12) Это понятно, но вопрос был именно как передать файл на сервер
16 РыбаАист
 
06.12.23
16:51
(14) Так считается он только на сервере. Я так и делал.
17 SleepyHead
 
07.12.23
06:03
(13) После чтения удаляйте файл с сервера.
18 Web00001
 
07.12.23
07:49
(16)Считаться он может где угодно. В этом по большей части, нет никакой проблемы. В(14) имеется ввиду что сначала можно считать файл в какую то коллекцию на клиенте, И потом передать ее на сервер. Таким образом на сервер попадут только те данные которые должны туда попасть а не весь файл. Если все там так секьюрно, что нельзя на полсекунды файл создать во временной папке.
19 Chai Nic
 
07.12.23
08:01
(15) "именно как передать файл на сервер"
Загрузить на клиенте в двоичные данные, а далее два способа передать на сервер - или через сериализацию, или через временное хранилище.
Проблема в том, что процедуры работы с временным хранилищем сейчас асинхронные, и не хочется с ними связываться. Если файл небольшой, я бы тупо сериализовал через ЗначениеВСтрокуВнутр и передал как строку на сервер.
20 banco
 
07.12.23
10:40
(0) ФайловаяСистемаКлиент.ЗагрузитьФайл