Вход | Регистрация


1С:Предприятие ::

Метки:

Методы ПоместитьВоВременноеХранилище/ПолучитьИзВременногоХранилища

Я
   tuxik07
 
21.05.10 - 07:47
Пытаюсь организовать обмен сообщениями между фоновым заданием и общей формой. Смысл передавать в форму прогресс выполнения длительного задания. Использую временное хранилище. в хелпе к методу ПоместитьВоВременноеХранилище пишут, что "Также позволяет поместить данные из фонового задания в родительский сеанс. Для этого следует в родительском сеансе поместить во временное хранилище пустое значение, передав идентификатор формы. Затем полученный адрес передать в фоновое задание через параметры фонового задания. Далее, если этот адрес использовать в параметре <Адрес>, то результат будет скопирован в сеанс, из которого было запущено фоновое задание"

У  формы есть реквизит АдресХранилища - строка

в обработчике команды пишу

    АдресХранилища = ПоместитьВоВременноеХранилище(0, УникальныйИдентификатор);
    ЗапуститьФоновоеЗадание();
    ПодключитьОбработчикОжидания("ОпросЗадания", 1);    


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


Вот модуль ФоновыеЗаданияСервер
Процедура ТестЗадания(Адрес) Экспорт
    Счетчик = ПолучитьИзВременногоХранилища(Адрес);
    Для н = 1 По 100 Цикл
        Пауза(2);
        Счетчик = Счетчик + 1;
        ПоместитьВоВременноеХранилище(Счетчик, Адрес);
    КонецЦикла;
КонецПроцедуры

и тут косяк в строке: Счетчик = ПолучитьИзВременногоХранилища(Адрес);
Получает значение из хранилища Неопределено.


в обработчике ожидания на форме пытаюсь обратиться к хранилищу по адресу Счетчик = ПолучитьИзВременногоХранилища(Адрес) - всё срабатывает
4
6
16
 
 
   tuxik07
 
1 - 21.05.10 - 07:54
релиз платформы 8.2.11.220
12
   tuxik07
 
2 - 21.05.10 - 08:25
походу весь народ в Пятнице тусит!
0
23
   tuxik07
 
3 - 21.05.10 - 10:53
Людиииии.... Аууу
   Смешной 1С
 
4 - 21.05.10 - 11:22
(0) Не уверен, но мне кажется что 0 - это не пустое значение. Попробуй так:
ПоместитьВоВременноеХранилище("", УникальныйИдентификатор);
   tuxik07
 
5 - 21.05.10 - 11:52
нифига, и 0 и неопределено и пустая строка ничего не подходит
   Defender aka LINN
 
6 - 21.05.10 - 11:59
(0) "Также позволяет поместить данные из фонового задания в родительский сеанс" - где тут написано, что ты что-то можешь передать в фоновое задние таким способом?
   tuxik07
 
7 - 21.05.10 - 12:32
да мне не нужно передать в фоновое задание, а из него
   SoftIce
 
8 - 21.05.10 - 13:26
а в строке 

Процедура ТестЗадания(Адрес) Экспорт

параметр Адрес у вас случайно не массив получается?
   SoftIce
 
9 - 21.05.10 - 13:27
Вы же ПараметрыЗадания как массив передаете..
   tuxik07
 
10 - 21.05.10 - 13:30
нет, адрес передается в параметре
 
 
   SoftIce
 
11 - 21.05.10 - 13:46
а я бы все таки попробовал так
Процедура ТестЗадания(ПараметрЗадания) Экспорт

   Счетчик = ПолучитьИзВременногоХранилища(ПараметрЗадания[0]);
18
   tuxik07
 
12 - 21.05.10 - 13:52
{(1)}: Получение элемента по индексу для значения не определено

МенеджерФоновыхЗаданий (BackgroundJobsManager)
Выполнить (Execute)
Синтаксис:
Выполнить(<ИмяМетода>, <Параметры>, <Ключ>, <Наименование>)
Параметры:
<ИмяМетода> (обязательный)
Тип: Строка. Имя экспортируемой процедуры или функции неглобального общего модуля, который может быть выполнен на сервере, в форме ИмяМодуля.ИмяМетода.
<Параметры> (необязательный)

Тип: Массив. Массив параметров, передаваемых в метод. Количество и типы параметров должны соответствовать параметрам метода.
18
   SoftIce
 
13 - 21.05.10 - 14:44
а УникальныйИдентификатор откуда берется?
   acsent
 
14 - 21.05.10 - 14:47
Временное хранилище живет только вместе с формой или до конца процедуры
   tuxik07
 
15 - 21.05.10 - 15:17
уникальный идентификатор берется у формы, форма живет я ее не закрываю
17
22
   xzorkiix
 
16 - 21.05.10 - 15:48
(0) а если подменить

Счетчик = ПолучитьИзВременногоХранилища(Адрес);

на

Счетчик = ПолучитьИзВременногоХранилища(Адрес);
Если Не ТипЗнч(Счетчик) = тип("Число") Тогда
Счетчик = 0;
КонецЕсли;
судя по тому как в справке написано. На клиенте создается пустое хранилище (т.е. главное получить адрес), а уже сервер выполняя фоновое задание будет пополнять хранилище, значение это будет доступно только сеансу вызвавшему все это добро.

фоновые задания в файловой версии не взлетели. а под 8.2 пока в планах не было на sql базу выделять. так что попытки подумать как система.
   acsent
 
17 - 21.05.10 - 15:48
(15) Фоновое задание не имеет никакого отношения к форме. Это вообще другой сеанс
   xzorkiix
 
18 - 21.05.10 - 15:50
(11) (12) специфика фоновх заданий. можно передать массив значений, порядок заполнения которого соответсвует параметрам вызываемой процедуры

т.е. для функции ЧтоТо(Имя, Возраст, ЧленПартииСР) нужно передать массив {"Алеша", 35, Истина}
20
   tuxik07
 
19 - 21.05.10 - 16:00
17 а никто и не говорит, что фоновое задание как то должно быть связано с формой, просто в документации написано что родительский процесс может получить данные из хранилища. Хранилище нужно проинициализировать соответсвующим образом

16 заменил строку Счетчик = ПолучитьИзВременногоХранилища(Адрес);
на Счетчик = 0;

результат тот же: в отладчике в контексте фонового задания не получается получить значение из хранилища. даже после выполнения:
Счетчик = Счетчик + 1;
ПоместитьВоВременноеХранилище(Счетчик, Адрес);


притом у Счетчика значение всегда числового типа, и адрес тоже строка
т.е. после выполнения ПоместитьВоВременноеХранилище(Счетчик, Адрес);
ПолучитьИзВременногоХранилища возвращает Неопределено

18 а кто-бы сомневался. Нормально параметры передаются в процедуру и той получаются.
20
20
   xzorkiix
 
20 - 21.05.10 - 16:15
(19) в (18) для справки.

(19) ну я умываю руки. ну очень не хочется в пятницу вечером базы новые разворачивать. "не хочешь работать в субботу - не работай после обеда пятницы" и наоборот) наша народная мудрость в отделе
21
   acsent
 
21 - 21.05.10 - 16:19
(20) Ну тупые. ПоместитьВоВременноеХранилище не живет без форм
22
23
   tuxik07
 
22 - 21.05.10 - 16:22
(21) как писал в (15) форма живет! Она не закрывается
   xzorkiix
 
23 - 21.05.10 - 16:29
(21) умный. научи

В механизме работы с временным хранилищем есть возможность передать данные из фонового задания в сеанс, инициировавший фоновое задание.

Для этого в родительском сеансе нужно поместить пустое значение во временное хранилище с помощью метода ПоместитьВоВременноеХранилище().

Полученный в результате адрес нужно передать через параметры фонового задания в процедуру.

Если в фоновом задании методу ПоместитьВоВременноеХранилище() передать полученный адрес, то значение будет скопировано в родительский сеанс с этим же адресом.

как я понимаю должно быть так:

Процедура ТестЗадания(Адрес) Экспорт
Счетчик = 0;
Для н = 1 По 100 Цикл
   пауза(2);
   Счетчик = Счетчик + 1;
   ПоместитьВоВременноеХранилище(Счетчик, Адрес);
КонецЦикла;
КонецПроцедуры
24
   tuxik07
 
24 - 21.05.10 - 16:31
(23) так оно и есть. но не работает скотина. Походу бага в платформе
25
   xzorkiix
 
25 - 21.05.10 - 16:39
(24) хз.

Метод ПоместитьВоВременноеХранилище() схож с предыдущим, за исключением того, что данные для записи во временное хранилище представляются не в виде пути в файловой системе, а в виде значения. Точно так же, если не указан существующий адрес во временном хранилище, создается новый адрес. Адрес возвращается как результат функции. Также как и для файлов, размещенные данные обязательно принадлежат какой-либо форме и автоматически удаляются после ее удаления.

А если без привязки на уникальный индификатор формы?

Адрес = ПоместитьВоВременноеХранилище(Неопределено)
   tuxik07
 
26 - 21.05.10 - 16:45
бесполезно, пробовал. Пробовал в реквизит формы сгенерить свой уникальный идентификатор и передать его.  Не работает...
27
   hhhh
 
27 - 21.05.10 - 17:32
(26) а длина этой строки АдресХранилища случаем не 10 у тебя?
   tuxik07
 
28 - 21.05.10 - 18:30
нет, там стандартный адрес
   fisher
 
29 - 21.05.10 - 18:36
Подпишусь. Тема очень интересная.
30
   TormozIT
 
30 - 21.05.10 - 18:40
(29) А как подписаться?
31
   fisher
 
31 - 21.05.10 - 18:45
(30) Уже :) Теперь сможешь найти эту ветку через "Темы с моим участием"
32
   TormozIT
 
32 - 21.05.10 - 18:45
(31) Ну это как то некошерно. Я думал, может сделали фичу такую скрытую.
   xReason
 
33 - 21.05.10 - 19:27
в закладки
36
 
 
   tuxik07
 
34 - 24.05.10 - 10:52
типа больше никто не поможет, да?
   tuxik07
 
35 - 24.05.10 - 14:33
я так понял, что ПоместитьВоВременноеХранилище не отрабатывает в фоновом задании
   acsent
 
36 - 24.05.10 - 14:41
(33) Всем подписчикам бан обеспечен ))
   acsent
 
37 - 24.05.10 - 14:41
   tuxik07
 
38 - 01.06.10 - 12:20
короче проблема вот в чем. Данные по адресу становятся доступными только ПОСЛЕ выполнения фонового задания, чего как бы я не увидел в документации
   fisher
 
39 - 01.06.10 - 17:30
Жаль. А казалось вот он - готовый инструмент для асинхронного обмена :)
   tuxik07
 
40 - 02.06.10 - 04:19
я тож так думал
   tuxik07
 
41 - 08.06.10 - 12:05
а ведь всё-таки это бага, 1с вчера вписало эту ошибку в список проблемных ситуаций и ошибок
42
   fisher
 
42 - 08.06.10 - 13:16
(41) По-моему, просто обещали исправить описание в справке. Нет?
   tuxik07
 
43 - 08.06.10 - 13:20
неа, в багрепорт вчера внесли багу что из фонового задания нельзя получитьизхранилища, хотя в принципе ни в какой справке про такую возможность даже не писали, мож и поместитьвхраилище заодно исправят. Ведь, как я думал, что написано в справке и не работает в действительности - это бага. А в багрепорте они описали фичу! :-) Мож и багу поправят

 

Список тем форума

 
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.