Имя: Пароль:
 
1C
1С v8
Передача Файла с Клиента на Сервер УПП
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