Имя: Пароль:
1C
1С v8
Временное Хранилище
0 mikha
 
22.01.18
12:48
Приветствую.
В последнее время перестал работать обмен данными между сервером (фоновое задание) и клиентом через временное хранилище.

на клиенте делаю
АдресПараметров = ПоместитьВоВременноеХранилище(Неопределено)
передаю параметром фоновому заданию

на сервере в фоновом задании чё-то делаю, выкладываю результат в
ПоместитьВоВременноеХранилище(Результат, АдресПараметров)

на клиенте обработчик ожидания смотрит завершение задания и
Результат = ПолучитьИзВременногоХранилища(АдресПараметров)

И если в начале день, два всё работает, то потом результат получается из хранилища на второй третий раз, а сейчас постоянно "неопределено". Одну обработку перевёл на хранилище настроек, всё заработало отлично, но это же не правильно.

Платформа 1С:Предприятие 8.3 (8.3.10.2580) УПП 1.3.100.1 SQL 2008
1 Franchiser
 
гуру
22.01.18
13:26
ПоместитьвовременноеХранилище(Неопределено, Новый   УникальныйИдентификатор)
2 mikha
 
22.01.18
14:00
не работает
и даже если проставить форме ЭтаФорма.КлючУникальности, то всё равно не работает
сильное подозрение, что не работает именно на стороне фонового задания
3 Ц_У
 
22.01.18
14:22
Поместить и получить проверь адреса, возможно разные
4 Вафель
 
22.01.18
14:23
АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, ЭтаФорма.УникальныйИдентификатор)
5 ComradeKite
 
22.01.18
14:33
От туда можно, туда нельзя. Из временного хранилища нельзя получить данные в фоновом задании. Передавай в фоновое задание структуру.
6 mikha
 
22.01.18
14:33
уже делал
7 mikha
 
22.01.18
14:35
(5) в фоновое задание передаю массив с параметрами, какие описаны в обработке, в отладчике вижу параметры, передают ся корректно
8 ComradeKite
 
22.01.18
14:37
По моему в типовом варианте Если Результат <> Неопределено Тогда получай из хранилища. По моему и сам так делал.
9 ComradeKite
 
22.01.18
14:38
Пардон если <>Неопределено, тогда Результат обрабатывай
10 mikha
 
22.01.18
14:48
(9)пардон не принят, результат = неопреледено постоянно

сделал в обработке выполняемой в задании
ПоместитьВоВременноеХранилище(новый Структура("Результат, Данные", Результат, Данные), АдресПараметров);
фыв = ПолучитьИзВременногоХранилища(АдресПараметров);
фыв неопределено постоянно
а хранилище настроек отлично работает
мля
11 mikha
 
22.01.18
14:49
(9) а как значение может быть больше или меньше неопределено?
12 Вафель
 
22.01.18
14:49
(10) к форме нужно привязывать хранилище
13 Вафель
 
22.01.18
14:50
(11) Эх, ты сколько лет в 1С???
14 mikha
 
22.01.18
14:52
(12) ПоместитьВоВременноеХранилище(Неопределено, ЭтаФорма.УникальныйИдентификатор) канает?
(13) не понял
15 Вафель
 
22.01.18
15:03
(14) столько лет в 1с, а не знаешь как "не равно" пишется
16 dezss
 
22.01.18
15:08
А сколько времени проходит между передачей адреса хранилища на сервер и получением его результата на клиенте?
17 dezss
 
22.01.18
15:09
(16) + и что в результате хранится?
18 mikha
 
22.01.18
15:31
(15) ты не поверишь, но так и пишется "не а = с"
когда-то в некоторых языках отсутствовало НЕ, но здесь-то оно присутствует, так зачем сравнивать "неопределено" на больше меньше?
(16) вот этого не знаю, есть подозрение что не успевает попасть, но в отладчике пробовал получать в течение минуты в конце процедуры, не срабатывает
(17) без разницы, по ману помещается любое сериализуемое значение, пробовал таблицу значений, структуру
19 mikha
 
22.01.18
15:36
(15) и ещё, ты, похоже, никогда не задумывался как транслируется твой код в байткод
20 Вафель
 
22.01.18
15:43
(18) 1с крайне не рекомендует так писать
21 dezss
 
22.01.18
15:53
(18) Так а фоновое точно завершилось?
22 mikha
 
22.01.18
16:10
(21) пробовал внутри задания, пробовал при статусе задания завершено
23 DmitrO
 
22.01.18
17:02
правильный ответ в (4)
(2) КлючУникальности - это не то пальто
24 Franchiser
 
гуру
22.01.18
17:11
Может у тебя результат не сериализуемый в ВХ?
25 Franchiser
 
гуру
22.01.18
17:18
Напиши так:
АдресРезультата = ПоместитьВоВременноеХранилище("Тест", ЭтаФорма.УникальныйИдентификатор);
Если по завершении будет неопределено, значит результат в ВХ сбросился, если останется "Тест", значит фоновое задание не завершилось.
26 mikha
 
22.01.18
19:15
(23) делал до того как сюда писать
27 4St
 
23.01.18
08:59
В СП на тему ВХ и фоновых заданий довольно длинный текст с кучей сюрпризов.

"Примечание:

Временное хранилище, сформированное в одном сеансе, недоступно из другого сеанса.
Исключением является возможность передачи данных из фонового задания в сеанс, инициировавший фоновое задание, с помощью временного хранилища. Для такой передачи следует в родительском сеансе поместить во временное хранилище пустое значение, передав идентификатор формы. Затем полученный адрес передать в фоновое задание через параметры фонового задания. Далее, если этот адрес использовать в параметре <Адрес>, то результат будет скопирован в сеанс, из которого было запущено фоновое задание.
Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания.
Данные, помещенные в фоновом сеансе в хранилище по сформированному в родительском сеансе адресу, сразу после помещения становятся недоступными в фоновом сеансе. "
28 rozer76
 
23.01.18
09:13
по классике все просто:

в форме реквизиты формы АдресВХранилище и ИдентификаторЗадания и ...  

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) АдресВХранилище = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор); мПараметры = Новый Массив; мПараметры.Добавить(АдресВХранилище); ФоновоеЗадание = ФоновыеЗадания.Выполнить( "МодульФоновыеЗадания.ТестовоеЗадание", мПараметры); ИдентификаторЗадания = ФоновоеЗадание.УникальныйИдентификатор; КонецПроцедуры

далее в фоне в серверном ОМ типо этого:

Процедура ТестовоеЗадание(Адрес) Экспорт ТЗ = Новый ТаблицаЗначений; Для test=1 По 100 Цикл ТЗ.Добавить(); КонецЦикла; ПоместитьВоВременноеХранилище(ТЗ,Адрес); ДатаЗавершения = ТекущаяДата()+60; Пока ДатаЗавершения>ТекущаяДата() Цикл КонецЦикла; КонецПроцедуры


.. и в форме ловим все это из фона:

&НаКлиенте Процедура ПолучитьДанные(Команда) ПолучитьДанныеНаСервере(АдресВХранилище,ИдентификаторЗадания); КонецПроцедуры &НаСервереБезКонтекста Процедура ПолучитьДанныеНаСервере(АдресВХранилище, ИдентификаторЗадания) ФоновоеЗадание = ФоновыеЗадания. НайтиПоУникальномуИдентификатору(ИдентификаторЗадания); Если ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда ТЗ = ПолучитьИзВременногоХранилища(АдресВХранилище); Если ТЗ<>Неопределено Тогда Сообщить("Из фона получена таблица, строк-”+ ТЗ.Количество()); КонецЕсли; Иначе Сообщить("Задание еще активно"); КонецЕсли; КонецПроцедуры

должно работать
29 mikha
 
24.01.18
13:06
Благодарю Всех за ответы,
НО. Почему Вы не обратили внимание на то, что вначале всё работает. Повторюсь: работает! Потом срабатывает через раз, и только потом совсем не работает. Это занимает от 2 до 4 дней в разных базах (5 баз).
2 + 2 = 3.9999999999999999999999999999999...