Имя: Пароль:
1C
1С v8
Фоновые задания, Временное хранилище и Обычные формы
0 seperblunt2
 
23.07.19
09:47
Всем добрый день.

Пытаюсь реализовать возврат результат работы ФЗ в "клиента" на обычных формах через временное хранилище.

Не могу сообразить, что нужно передать в качестве УникальногоИдентификатора формы в моменте когда получаешь адрес ВХ для передачи его в ФЗ.

На УФ это выглядит так: Адрес_ВХ = ПоместитьВоВременноеХранилище(Неопределено, ЭтаФорма.УникальныйИдентификатор);

на ОФ - что передать? КлючУникальности не отрабатывает..
1 zwolf
 
23.07.19
09:53

<Адрес> (необязательный)
Тип: УникальныйИдентификатор, Строка.

Уникальный идентификатор формы, во временное хранилище которой надо поместить данные и вернуть новый адрес. Или адрес во временном хранилище, по которому надо поместить данные. Адрес должен быть получен ранее с помощью данного метода.
В случае, если передается УникальныйИдентификатор формы или адрес в хранилище, то значение будет автоматически удалено после закрытия этой формы.
Если передан УникальныйИдентификатор, не являющийся уникальным идентификатором формы, то значение будет удалено после завершения сеанса пользователя.
Если передан адрес уже удаленного значения, будет сгенерировано исключение.
Если параметр не указан, помещенное значение будет удалено после очередного запроса сервера из общего модуля, при контекстном и неконтекстном серверном вызове из формы, при серверном вызове из модуля команды или при получении формы.


По-моему, так исчерпывающе
2 seperblunt2
 
23.07.19
09:57
(1) УникальныйИдентификатор формы есть только в УФ и там у меня все хорошо отрабатывает
(реализую многопоточность - готовятся куча ТаблицЗначений)..

... или я чего то не увидел в исчерпывающей справке?
3 Andreyyy
 
23.07.19
10:01
Адрес_ВХ = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
4 zwolf
 
23.07.19
10:02
(2) > готовятся куча ТаблицЗначений
Глубоко поъ.
Третий абзац.
5 seperblunt2
 
23.07.19
10:04
(3)(4) Тогда то, что помещу во временном в фоновое не будет доступно из формы:

Временное хранилище, сформированное в одном сеансе, недоступно из другого сеанса.
Исключением является возможность передачи данных из фонового задания в сеанс, инициировавший фоновое задание, с помощью временного хранилища. Для такой передачи следует в родительском сеансе поместить во временное хранилище пустое значение, передав идентификатор формы. Затем полученный адрес передать в фоновое задание через параметры фонового задания. Далее, если этот адрес использовать в параметре <Адрес>, то результат будет скопирован в сеанс, из которого было запущено фоновое задание.
6 Andreyyy
 
23.07.19
10:05
С ОФ какая-то засада была для клиент-сервера и пришлось сделать так:

1. Адрес получать в модуле на сервере:
АдресРезультатаФоновогоЗадания = ОбщийМодульНаСервереТакойТо.ПолучитьАдресРезультатаФоновогоЗадания(КлючУникальности);

Функция ПолучитьАдресРезультатаФоновогоЗадания(УникальныйИдентификатор) Экспорт
    
    Возврат(ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор));
    
КонецФункции
7 Andreyyy
 
23.07.19
10:07
2. Получение результата:

РезультатПодключения = ОбщийМодульНаСервереТакойТо.ПолучитьРезультатФоновогоЗадания(АдресРезультатаФоновогоЗадания);
УдалитьИзВременногоХранилища(АдресРезультатаФоновогоЗадания);

Функция ПолучитьРезультатФоновогоЗадания(АдресРезультатаФоновогоЗадания) Экспорт
    
    Возврат(ПолучитьИзВременногоХранилища(АдресРезультатаФоновогоЗадания));
    
КонецФункции
8 seperblunt2
 
23.07.19
10:13
(6) (7) - увы не взлетело

модуль формы:
Процедура Кнопка1Нажатие(Элемент)
    
    
    Массив_Заданий = Новый Массив;
    
    
    Для Сч = 1 По 1 Цикл
        
        Массив_Параметров = Новый Массив;
        
        Адрес_ВХ = РК_Операции_BI.ПолучитьАдресРезультатаФоновогоЗадания(КлючУникальности);
        
        //Адрес_ВХ = ПоместитьВоВременноеХранилище(Неопределено, КлючУникальности);
        ////Адрес_ВХ = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
        
        Массив_Параметров.Добавить(Адрес_ВХ);
                                                                                                             //СтрЗаменить(Новый УникальныйИдентификатор, "-", "_")
        Задание = ФоновыеЗадания.Выполнить("РК_Операции_BI.Поместить_ТЗ_В_Ячейку_Памяти", Массив_Параметров, , "Тест_фона");
        
        Массив_Заданий.Добавить(Новый Структура("Задание, Адрес_ВХ", Задание, Адрес_ВХ));
        
    КонецЦикла;     
    
    
КонецПроцедуры


Процедура Кнопка2Нажатие(Элемент)
    
    
    Для каждого Сохр_Задание Из Массив_Заданий Цикл
        
        Тек_Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Сохр_Задание.Задание.УникальныйИдентификатор);
        
        Если Тек_Задание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
            
            
            
            Результат = РК_Операции_BI.ПолучитьРезультатФоновогоЗадания(Сохр_Задание.Адрес_ВХ);
            
            УдалитьИзВременногоХранилища(Сохр_Задание.Адрес_ВХ);
            
            Если ЗначениеЗаполнено(Результат) Тогда
                
                Сообщить(Результат);
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЦикла;
    
    
КонецПроцедуры




Процедура ПриОткрытии()
    
    КлючУникальности = Новый УникальныйИдентификатор;
    
КонецПроцедуры




модуль РК_Операции_BI:



Процедура Поместить_ТЗ_В_Ячейку_Памяти(Адрес_Ячейки) Экспорт

    ГС = Новый ГенераторСлучайныхЧисел;

    ПоместитьВоВременноеХранилище(ГС.СлучайноеЧисло(100, 200), Адрес_Ячейки);
    
    Сообщить(ГС.СлучайноеЧисло(100, 200));
    
КонецПроцедуры


Функция ПолучитьАдресРезультатаФоновогоЗадания(УникальныйИдентификатор) Экспорт
    
    Возврат(ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор));
    
КонецФункции


Функция ПолучитьРезультатФоновогоЗадания(АдресРезультатаФоновогоЗадания) Экспорт
    
    Возврат(ПолучитьИзВременногоХранилища(АдресРезультатаФоновогоЗадания));
    
КонецФункции
9 Andreyyy
 
23.07.19
10:15
(8) КлючУникальности это свойство формы, присваивать ничего не нужно.
10 seperblunt2
 
23.07.19
10:22
(7) (8) заработало - снимаю шляпу. На модуле стояла галка "Клиент" сделал в чисто серверном модуле - полетело.

Благодарю
11 seperblunt2
 
23.07.19
10:24
Миста всемогущая :)