Имя: Пароль:
1C
 
Глюк платформы - временное хранилище (Обычные формы)
0 Air777
 
03.07.18
15:51
Если в фоновом задании передать значение через временное хранилище то 1й раз система всегда возвращает Неопределено. 2й и далее ок.

Проблема воспроизводится на 8.3.8 и 8.3.10 ТОЛЬКО в клиент серверном варианте. В файловом работает как надо!

https://cloud.mail.ru/public/JXzu/xEQ4oszkg

По ссылке контрольная БД демонстрирующая проблему.

Загрузить и запустить в режиме предприятия.
В открывшейся обработке нажать "Выполнить".
Получите сообщение "Результат=" (Неопределено)
Если нажать еще раз будет: "Результат=1"
В файловой сразу как надо.

Также замечено что при активном использовании данного механизма результат также может иногда выпадать. 100 раз норм потом разово неопределено и дальше снова 100 раз норм. Условные 100раз конечно.
Но 1й раз у меня всегда стабильно воспроизводится

Пожалуйста проверьте воспроизводится ли у вас и желательно на более старших платформах.

Заранее спасибо
1 Air777
 
03.07.18
16:27
Для тех кому лениво качать ниже текст кода из конфигурации:

////////////////////////////модуль обработки

Перем Ключ,АдресРезультата;

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


Процедура ПроверкаГотовности() Экспорт
    
    ФильтрОтбора = Новый Структура("Наименование,Ключ,Состояние", "Задание", Ключ, СостояниеФоновогоЗадания.Завершено);
    МассивЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(ФильтрОтбора);
    
    Если МассивЗаданий.Количество() > 0 Тогда //И НЕ МассивЗаданий[0].ИнформацияОбОшибке.Описание = "" Тогда
                
        Значение=ПолучитьИзВременногоХранилища(АдресРезультата);
        Сообщить("Результат="+СокрЛП(Значение));            
    Иначе        
        ПодключитьОбработчикОжидания("ПроверкаГотовности",0.4,Истина);
    КонецЕсли;
КонецПроцедуры


/////////////////модуль Сервер

Процедура Сформировать(АдресРезульта) Экспорт
    
Результат=1;    
ПоместитьВоВременноеХранилище(Результат,АдресРезульта);    

КонецПроцедуры
2 sechs
 
03.07.18
16:40
(0) Это не глюк, а давно известное поведение, юный падаван.

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

Так что ожидай завершения фонового по его состоянию и читай книжки...
3 Wingless
 
03.07.18
16:49
(0) Единственный работающий вариант передачи данных через временное хранилище между сеансом и фоновым заданием, работающий одинаково в файловом и клиент-серверном варианте - это помещение результата В фоновом задании, а не наоборот.
4 Wingless
 
03.07.18
16:50
5 Air777
 
04.07.18
00:20
(2) задание завершается вполне успешно. Это достигается фильтром СостояниеФоновогоЗадания.Завершено.
Ткните меня носом в книжку где этот нюанс описан.

(4) спасибо. Оно должно или не должно работать таким образом ? Если это НЕ баг то почему оно работает со 2й попытки?! В ветке я не нашел ответа или решения

(3) Буду благодарен за рабочий пример
6 sechs
 
04.07.18
04:38
(5) Задание надо искать по его уникальному, единственному и неповторимому идентификатору. А не ковыряться в куче уже завершенных ранее фоновых.
7 Air777
 
04.07.18
10:21
(6) ну как бы да это всё есть в коде в (1) это же очевидные вещи
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.