![]() |
![]() |
![]() |
|
Методы ПоместитьВоВременноеХранилище/ПолучитьИзВременногоХранилища | ☑ | ||
---|---|---|---|---|
0
tuxik07
21.05.10
✎
07:47
|
Пытаюсь организовать обмен сообщениями между фоновым заданием и общей формой. Смысл передавать в форму прогресс выполнения длительного задания. Использую временное хранилище. в хелпе к методу ПоместитьВоВременноеХранилище пишут, что "Также позволяет поместить данные из фонового задания в родительский сеанс. Для этого следует в родительском сеансе поместить во временное хранилище пустое значение, передав идентификатор формы. Затем полученный адрес передать в фоновое задание через параметры фонового задания. Далее, если этот адрес использовать в параметре <Адрес>, то результат будет скопирован в сеанс, из которого было запущено фоновое задание"
У формы есть реквизит АдресХранилища - строка в обработчике команды пишу АдресХранилища = ПоместитьВоВременноеХранилище(0, УникальныйИдентификатор); ЗапуститьФоновоеЗадание(); ПодключитьОбработчикОжидания("ОпросЗадания", 1); &НаСервере Процедура ЗапуститьФоновоеЗадание() ПараметрыЗадания = Новый Массив; ПараметрыЗадания.Добавить(АдресХранилища); ФоновоеЗадание = ФоновыеЗадания.Выполнить("ФоновыеЗаданияСервер.ТестЗадания", ПараметрыЗадания); КонецПроцедуры Вот модуль ФоновыеЗаданияСервер Процедура ТестЗадания(Адрес) Экспорт Счетчик = ПолучитьИзВременногоХранилища(Адрес); Для н = 1 По 100 Цикл Пауза(2); Счетчик = Счетчик + 1; ПоместитьВоВременноеХранилище(Счетчик, Адрес); КонецЦикла; КонецПроцедуры и тут косяк в строке: Счетчик = ПолучитьИзВременногоХранилища(Адрес); Получает значение из хранилища Неопределено. в обработчике ожидания на форме пытаюсь обратиться к хранилищу по адресу Счетчик = ПолучитьИзВременногоХранилища(Адрес) - всё срабатывает |
|||
1
tuxik07
21.05.10
✎
07:54
|
релиз платформы 8.2.11.220
|
|||
2
tuxik07
21.05.10
✎
08:25
|
походу весь народ в Пятнице тусит!
|
|||
3
tuxik07
21.05.10
✎
10:53
|
Людиииии.... Аууу
|
|||
4
Смешной 1С
21.05.10
✎
11:22
|
(0) Не уверен, но мне кажется что 0 - это не пустое значение. Попробуй так:
ПоместитьВоВременноеХранилище("", УникальныйИдентификатор); |
|||
5
tuxik07
21.05.10
✎
11:52
|
нифига, и 0 и неопределено и пустая строка ничего не подходит
|
|||
6
Defender aka LINN
21.05.10
✎
11:59
|
(0) "Также позволяет поместить данные из фонового задания в родительский сеанс" - где тут написано, что ты что-то можешь передать в фоновое задние таким способом?
|
|||
7
tuxik07
21.05.10
✎
12:32
|
да мне не нужно передать в фоновое задание, а из него
|
|||
8
SoftIce
21.05.10
✎
13:26
|
а в строке
Процедура ТестЗадания(Адрес) Экспорт параметр Адрес у вас случайно не массив получается? |
|||
9
SoftIce
21.05.10
✎
13:27
|
Вы же ПараметрыЗадания как массив передаете..
|
|||
10
tuxik07
21.05.10
✎
13:30
|
нет, адрес передается в параметре
|
|||
11
SoftIce
21.05.10
✎
13:46
|
а я бы все таки попробовал так
Процедура ТестЗадания(ПараметрЗадания) Экспорт Счетчик = ПолучитьИзВременногоХранилища(ПараметрЗадания[0]); |
|||
12
tuxik07
21.05.10
✎
13:52
|
{(1)}: Получение элемента по индексу для значения не определено
МенеджерФоновыхЗаданий (BackgroundJobsManager) Выполнить (Execute) Синтаксис: Выполнить(<ИмяМетода>, <Параметры>, <Ключ>, <Наименование>) Параметры: <ИмяМетода> (обязательный) Тип: Строка. Имя экспортируемой процедуры или функции неглобального общего модуля, который может быть выполнен на сервере, в форме ИмяМодуля.ИмяМетода. <Параметры> (необязательный) Тип: Массив. Массив параметров, передаваемых в метод. Количество и типы параметров должны соответствовать параметрам метода. |
|||
13
SoftIce
21.05.10
✎
14:44
|
а УникальныйИдентификатор откуда берется?
|
|||
14
acsent
21.05.10
✎
14:47
|
Временное хранилище живет только вместе с формой или до конца процедуры
|
|||
15
tuxik07
21.05.10
✎
15:17
|
уникальный идентификатор берется у формы, форма живет я ее не закрываю
|
|||
16
xzorkiix
21.05.10
✎
15:48
|
(0) а если подменить
Счетчик = ПолучитьИзВременногоХранилища(Адрес); на Счетчик = ПолучитьИзВременногоХранилища(Адрес); Если Не ТипЗнч(Счетчик) = тип("Число") Тогда Счетчик = 0; КонецЕсли; судя по тому как в справке написано. На клиенте создается пустое хранилище (т.е. главное получить адрес), а уже сервер выполняя фоновое задание будет пополнять хранилище, значение это будет доступно только сеансу вызвавшему все это добро. фоновые задания в файловой версии не взлетели. а под 8.2 пока в планах не было на sql базу выделять. так что попытки подумать как система. |
|||
17
acsent
21.05.10
✎
15:48
|
(15) Фоновое задание не имеет никакого отношения к форме. Это вообще другой сеанс
|
|||
18
xzorkiix
21.05.10
✎
15:50
|
(11) (12) специфика фоновх заданий. можно передать массив значений, порядок заполнения которого соответсвует параметрам вызываемой процедуры
т.е. для функции ЧтоТо(Имя, Возраст, ЧленПартииСР) нужно передать массив {"Алеша", 35, Истина} |
|||
19
tuxik07
21.05.10
✎
16:00
|
17 а никто и не говорит, что фоновое задание как то должно быть связано с формой, просто в документации написано что родительский процесс может получить данные из хранилища. Хранилище нужно проинициализировать соответсвующим образом
16 заменил строку Счетчик = ПолучитьИзВременногоХранилища(Адрес); на Счетчик = 0; результат тот же: в отладчике в контексте фонового задания не получается получить значение из хранилища. даже после выполнения: Счетчик = Счетчик + 1; ПоместитьВоВременноеХранилище(Счетчик, Адрес); притом у Счетчика значение всегда числового типа, и адрес тоже строка т.е. после выполнения ПоместитьВоВременноеХранилище(Счетчик, Адрес); ПолучитьИзВременногоХранилища возвращает Неопределено 18 а кто-бы сомневался. Нормально параметры передаются в процедуру и той получаются. |
|||
20
xzorkiix
21.05.10
✎
16:15
|
(19) в (18) для справки.
(19) ну я умываю руки. ну очень не хочется в пятницу вечером базы новые разворачивать. "не хочешь работать в субботу - не работай после обеда пятницы" и наоборот) наша народная мудрость в отделе |
|||
21
acsent
21.05.10
✎
16:19
|
(20) Ну тупые. ПоместитьВоВременноеХранилище не живет без форм
|
|||
22
tuxik07
21.05.10
✎
16:22
|
(21) как писал в (15) форма живет! Она не закрывается
|
|||
23
xzorkiix
21.05.10
✎
16:29
|
(21) умный. научи
В механизме работы с временным хранилищем есть возможность передать данные из фонового задания в сеанс, инициировавший фоновое задание. Для этого в родительском сеансе нужно поместить пустое значение во временное хранилище с помощью метода ПоместитьВоВременноеХранилище(). Полученный в результате адрес нужно передать через параметры фонового задания в процедуру. Если в фоновом задании методу ПоместитьВоВременноеХранилище() передать полученный адрес, то значение будет скопировано в родительский сеанс с этим же адресом. как я понимаю должно быть так: Процедура ТестЗадания(Адрес) Экспорт Счетчик = 0; Для н = 1 По 100 Цикл пауза(2); Счетчик = Счетчик + 1; ПоместитьВоВременноеХранилище(Счетчик, Адрес); КонецЦикла; КонецПроцедуры |
|||
24
tuxik07
21.05.10
✎
16:31
|
(23) так оно и есть. но не работает скотина. Походу бага в платформе
|
|||
25
xzorkiix
21.05.10
✎
16:39
|
(24) хз.
Метод ПоместитьВоВременноеХранилище() схож с предыдущим, за исключением того, что данные для записи во временное хранилище представляются не в виде пути в файловой системе, а в виде значения. Точно так же, если не указан существующий адрес во временном хранилище, создается новый адрес. Адрес возвращается как результат функции. Также как и для файлов, размещенные данные обязательно принадлежат какой-либо форме и автоматически удаляются после ее удаления. А если без привязки на уникальный индификатор формы? Адрес = ПоместитьВоВременноеХранилище(Неопределено) |
|||
26
tuxik07
21.05.10
✎
16:45
|
бесполезно, пробовал. Пробовал в реквизит формы сгенерить свой уникальный идентификатор и передать его. Не работает...
|
|||
27
hhhh
21.05.10
✎
17:32
|
(26) а длина этой строки АдресХранилища случаем не 10 у тебя?
|
|||
28
tuxik07
21.05.10
✎
18:30
|
нет, там стандартный адрес
|
|||
29
fisher
21.05.10
✎
18:36
|
Подпишусь. Тема очень интересная.
|
|||
30
TormozIT
гуру
21.05.10
✎
18:40
|
(29) А как подписаться?
|
|||
31
fisher
21.05.10
✎
18:45
|
(30) Уже :) Теперь сможешь найти эту ветку через "Темы с моим участием"
|
|||
32
TormozIT
гуру
21.05.10
✎
18:45
|
(31) Ну это как то некошерно. Я думал, может сделали фичу такую скрытую.
|
|||
33
xReason
21.05.10
✎
19:27
|
в закладки
|
|||
34
tuxik07
24.05.10
✎
10:52
|
типа больше никто не поможет, да?
|
|||
35
tuxik07
24.05.10
✎
14:33
|
я так понял, что ПоместитьВоВременноеХранилище не отрабатывает в фоновом задании
|
|||
36
acsent
24.05.10
✎
14:41
|
(33) Всем подписчикам бан обеспечен ))
|
|||
37
acsent
24.05.10
✎
14:41
|
||||
38
tuxik07
01.06.10
✎
12:20
|
короче проблема вот в чем. Данные по адресу становятся доступными только ПОСЛЕ выполнения фонового задания, чего как бы я не увидел в документации
|
|||
39
fisher
01.06.10
✎
17:30
|
Жаль. А казалось вот он - готовый инструмент для асинхронного обмена :)
|
|||
40
tuxik07
02.06.10
✎
04:19
|
я тож так думал
|
|||
41
tuxik07
08.06.10
✎
12:05
|
а ведь всё-таки это бага, 1с вчера вписало эту ошибку в список проблемных ситуаций и ошибок
|
|||
42
fisher
08.06.10
✎
13:16
|
(41) По-моему, просто обещали исправить описание в справке. Нет?
|
|||
43
tuxik07
08.06.10
✎
13:20
|
неа, в багрепорт вчера внесли багу что из фонового задания нельзя получитьизхранилища, хотя в принципе ни в какой справке про такую возможность даже не писали, мож и поместитьвхраилище заодно исправят. Ведь, как я думал, что написано в справке и не работает в действительности - это бага. А в багрепорте они описали фичу! :-) Мож и багу поправят
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |