Имя: Пароль:
1C
1С v8
Передача массива файлов в фоновое задание
0 neusro84
 
14.10.20
05:51
Приветствую. Что-то не получается получить файлы, помещённые на сервер при помощи НачатьПомещениеФайловНаСервер, в фоновом задании.
При помещении файлов указываю УИД формы.
В фоновое задание передаю массив адресов файлов (полученных в результате работы НачатьПомещениеФайловНаСервер) , в фоновом пытаюсь получить файл из хранилища, а в ответ Неопределено. Причем тот же код при выполнении не в фоновом задании возвращает из адреса файл. В чем может быть проблема?
1 DrZombi
 
гуру
14.10.20
06:10
(0) Запусти Отладчик с параметром запуска "РежимОтладки". И ваши фоновые задания переведутся в локальные с отладкой :)
2 DrZombi
 
гуру
14.10.20
06:11
+ Дальше дело вашего взгляда.
3 DrZombi
 
гуру
14.10.20
06:12
+(1) "фоновые задания" - будут запущены под вашей сессией на сервере, а не отдельным заданием. (как то так)
4 neusro84
 
14.10.20
06:44
(1) И что я там увижу, кроме того что уже видел. Массив с адресами передается нормально, перед запуском фонового задания делаю в режиме отладки - ПолучитьИзВременногоХранилища - получаю двоичные данные, при входе в фоновое задание массив содержит элементы, но по адресам уже нет  двоичных данных.
5 PuhUfa
 
14.10.20
07:35
(0) >>При помещении файлов указываю УИД формы.
Что за форма в фоновом задании?
6 neusro84
 
14.10.20
09:40
(5) Файлы передаются с клиента через форму и фоновое запускается тоже с клиента
7 Basilio
 
14.10.20
10:20
Форма на момент работы фонового еще существует? Данные из Временного Хранилища удаляются в момент закрытия Формы.
8 neusro84
 
14.10.20
11:01
(7) В том то и дело что существует, проблема воспроизводится в файловом и серверном варианте работы на версии 8.3.16.
9 Вафель
 
14.10.20
11:03
код в студию
10 neusro84
 
14.10.20
11:17
Тестовый код для воспроизведения ошибки

Код формы

&НаКлиенте
Процедура Команда1(Команда)
    
    МассивПутей = Новый Массив();
    МассивПутей.Добавить(Новый ОписаниеПередаваемогоФайла("D:\tmp\file1.pdf"));
    МассивПутей.Добавить(Новый ОписаниеПередаваемогоФайла("D:\tmp\file1.pdf"));
    Описание = Новый ОписаниеОповещения("Завершение", ЭтотОбъект, МассивПутей );
    НачатьПомещениеФайловНаСервер(Описание,,,МассивПутей,УникальныйИдентификатор);
КонецПроцедуры


&НаКлиенте
Процедура Завершение(Результат, Доппараметры) Экспорт
    Мас = Новый Массив();
    Для каждого стр из Результат Цикл
        Доп = Новый Структура("Адрес",стр.Адрес);
        Мас.Добавить(Доп);
    КонецЦикла;    
    
    ЗавершениеНаСервере(Мас);
КонецПроцедуры

&НаСервере
Процедура ЗавершениеНаСервере(Доппараметры) Экспорт

    ПараметрыЗФ = Новый Массив();
    ПараметрыЗФ.Добавить(Доппараметры);
    
    ФоновыеЗадания.Выполнить("МодульСКодом.ВыполнитьЗагрузкуФайлов" , ПараметрыЗФ);
    
КонецПроцедуры


Код фонового задания модуля "МодульСКодом"

Процедура ВыполнитьЗагрузкуФайлов(МассивАдресов) Экспорт
    
    Для каждого стр из МассивАдресов Цикл
        
        Данные = ПолучитьИзВременногоХранилища(стр.Адрес); //В переменой Данные будет Неопределено

        
    КонецЦикла;
    
КонецПроцедуры
11 Вафель
 
14.10.20
11:24
так у тебя хранилища в хранилищах.
передавай напрямую двоичные данные
12 Вафель
 
14.10.20
11:25
ну и вообще хранилище может оказаться на другом сервере чем само фоновое.
потому ничего и нет
13 ДенисЧ
 
14.10.20
11:27
(12) Об этом менеджер кластера позаботится.
(0) А ты пробовал указывать не уид формы, а новый произвольный уид?
14 Вафель
 
14.10.20
11:28
(13) вот оно  и видно как позаботился
15 neusro84
 
14.10.20
11:50
(11) Мне необходимо передать все файлы за один раз. Другого способа не нашел.
(13) Да, то же самое.
16 Вафель
 
14.10.20
11:51
(15) массив двоичных данных
17 Вафель
 
14.10.20
11:52
с произвольным уидом хранилище умирает сразу после завершения процедуры
18 polosov
 
14.10.20
12:01
(10)ПомещениеФайлаОтменено  проанализируй в Процедура Завершение
19 acht
 
14.10.20
12:11
(13) Не позаботится. Временное хранилище всегд существует в рамках сеанса. Читать из одного сеанса данные другого нельзя (сам понимаешь, почему). Единственное, специально реализованное платформой исключение - копирование результата фонового в вызывающий сеанс. А фоновое задание всегда запускает новый сеанс.

Единственный способ передать данные в фоновое задание - его параметры. Надо или передавать файлы через двоичные данные, или выкладывать их на внешний по отношению к 1С ресурс (типа файловой шары), который доступен из разных сеансов (практически даже - с разных серверов), передавать параметром в фоновое их расположение.