|
Заполнить ДеревоЗначений на форме в фоновом задании | ☑ | ||
---|---|---|---|---|
0
zelenprog
19.04.24
✎
12:25
|
Здравствуйте!
В данных обработки есть реквизит с типом "ДеревоЗначений". При работе с программным кодом тип этого реквизита - ДанныеФормыДерево. На самой форме обработки есть элемент "Таблица", который "ссылается" на это дерево значений и отображает его. В фоновом задании формируется "настоящее" ДеревоЗначений. Нужно заполнить таблицу на форме данными из "настоящего" ДереваЗначений, сформированного в фоновом задании. Причем, хотелось бы чтобы "процесс" заполнения таблицы происходил постепенно-визуально для пользователя. То есть чтобы пользователь видел, как появляются новые строки в таблице, как меняются значения в ячейках. Решение в "лоб" - передать в фоновое задание ссылку на ДанныеФормыДерево - не сработало. Выдается ошибка "Параметр фонового задания не поддерживает сериализацию". Вроде как это логично. Получается, что из фонового задания это не возможно сделать? Можно ли что-нибудь придумать? |
|||
1
Климов Сергей
19.04.24
✎
12:31
|
Дерево передать в фоновое задание через временное хранилище. Результат получить так же.
Если хочется анимированного отображения, то дерево надо нарубить на кусочки, с каждым кусочком запускать фоновое задание. По завершения - обновлять форму. |
|||
2
arsik
гуру
19.04.24
✎
12:56
|
(0) Так фоновое же может оповещать форму о своей работе. Вот и подсмотри как это реализовано
|
|||
3
zelenprog
19.04.24
✎
13:25
|
(1) >> По завершения - обновлять форму.
Так вот обновление формы хотелось выполнять непосредственно в фоновом задании, а не по завершении. |
|||
4
zelenprog
19.04.24
✎
13:28
|
(2) >> Так фоновое же может оповещать форму о своей работе. Вот и подсмотри как это реализовано
Оно то оповещает... Но похоже что фоновое задание доступа к форме и к элементам формы не имеет. Получается, что фоновое обновление элементов формы невозможно в принципе? |
|||
5
arsik
гуру
19.04.24
✎
13:31
|
(4) Смотри как в БСП сделаны. Все там работает
|
|||
6
Мультук
гуру
19.04.24
✎
13:34
|
(0)
Типовая УТ или ЕРП или еще что-то на БСП e1cib/app/Обработка.УдалениеПомеченныхОбъектов Дерево заполняется вполне себе в фоне |
|||
7
zelenprog
19.04.24
✎
14:13
|
(6) >> Обработка.УдалениеПомеченныхОбъектов
Посмотрел эту обработку... >> Дерево заполняется вполне себе в фоне Нет, дерево не заполняется в фоне. Точнее так. Данные дерева заполняются в фоне, но их отображение в таблице-дереве на форме выполняется НЕ в фоне. Вот код из обработки: Реквизит передается в фоновое задание как
А после завершения фонового задания выполняется:
То есть самого процесса постепенного заполнения данными в таблицу-дерево на форме мы не видим. |
|||
8
zelenprog
19.04.24
✎
14:14
|
(5) >> Смотри как в БСП сделаны. Все там работает
Конкретнее можешь сказать где смотреть? |
|||
9
arsik
гуру
19.04.24
✎
14:38
|
(7)
&НаКлиенте Процедура ПриОбновленииПрогрессаФоновогоЗадания(Задание, ДополнительныеПараметры) Экспорт Если Задание.Прогресс <> Неопределено Тогда Элементы.ПредставлениеПрогресса.Видимость = Истина; Элементы.ПредставлениеПрогресса.Заголовок = Задание.Прогресс.Текст; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПриНачалеФоновогоЗадания(Знач Обработчик) Перем НастройкиОжидания; НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); НастройкиОжидания.ВыводитьОкноОжидания = Ложь; НастройкиОжидания.ВыводитьПрогрессВыполнения = Истина; НастройкиОжидания.ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПриОбновленииПрогрессаФоновогоЗадания", ЭтотОбъект); ДлительныеОперацииКлиент.ОжидатьЗавершение(ВыполняемаяОперация, Обработчик, НастройкиОжидания); Если ВыполняемаяОперация <> Неопределено И ВыполняемаяОперация.Статус = "Выполняется" Тогда ПоказатьДиалогПередЗакрытием = Истина; КонецЕсли; КонецПроцедуры |
|||
10
zelenprog
19.04.24
✎
15:21
|
(9) В целом механизм обновления прогресса понятен.
Но не вижу как реализовать задуманное с помощью этого механизма. Суть хотелки в том, чтобы мы могли постепенно по мере выполнения фонового задания заполнять таблицу-дерева на форме. Для того чтобы это сделать, для этого при обновлении прогресса нам нужна информация о строках дерева, которые были обработаны в фоновом задании с момента предыдущего обновления прогресса. То есть надо чтобы в процедуру "ПриОбновленииПрогрессаФоновогоЗадания" был передан параметр что-то типа массива "ЗаполненныеСтрокиДереваСПредыдущегоОбновленияПрогресса". Теоретически это как-то можно просунуть через параметр "ДополнительныеПараметры". Но как это сделать практически? Фоновое задание ведь не знает в какой момент вызывается клиентская процедура "ПриОбновленииПрогрессаФоновогоЗадания". Есть какие-нибудь идеи? |
|||
11
AlexeyKh
19.04.24
✎
15:46
|
как вариант, в своей форме с деревом
с помощью ПодключитьОбработчикОжидания() запускаете процедуру опроса своего ФЗ например каждые 10 сек. и форма работает, и анимация заполнения (прямо розовый бантик) гораздо проще вывести надпись: "Ждите идет формирование дерева..." но при этом можно в форме работать |
|||
12
zelenprog
19.04.24
✎
16:55
|
(11) >> с помощью ПодключитьОбработчикОжидания() запускаете процедуру опроса своего ФЗ
Не совсем понятно что будет делать этот обработчик. Какой примерный алгоритм этого обработчика по заполнению дерева формы? |
|||
13
Garykom
гуру
19.04.24
✎
17:25
|
(0) Чтобы сделать постепенное заполнение да еще визуально видимым сделать - придется поизвращаться
|
|||
14
Garykom
гуру
19.04.24
✎
17:26
|
(12) Получать от фонового очередной кусок подчиненных строк и вставлять его в нужное место ДанныеФормыДерево
Но как узнать в какое место вставлять? |
|||
15
zelenprog
20.04.24
✎
16:27
|
(14) >> Получать от фонового очередной кусок подчиненных строк
А как из фонового задания передать эти данные? Получается, они должны быть переданы через параметр "ДополнительныеПараметры"?
Верно? Или как-то по другому? Объясни пожалуйста |
|||
16
Garykom
гуру
20.04.24
✎
18:02
|
(15) временное хранилище же
|
|||
17
vis
20.04.24
✎
18:17
|
А зачем вам эта анимация?
|
|||
18
eddy_n
20.04.24
✎
20:02
|
(17) Кроме понтов никакого практического смысла.
|
|||
19
ProxyInspector
20.04.24
✎
22:57
|
Есть приемчик, которым я успешно пользуюсь для передачи хода выполнения фоновой процедуры.
На сколько я понимаю, 1С так и не удалось реализовать прозрачный механизм функции Состояние() из фонового процесса. К счастью 1С на 20 году развития придумала механизм ОбщиеНастройки. Это что то типа регистра сведений, данные которого доступны на клиенте и на сервере. В фоновой процедуре пишете ОбщиеНастройки.Сохранить а на клиенте в обработчике Ожидания - ОбщиеНастройки.Восстановить. Здесь же можно реализовать прерывание выполнения фонового процесса. |
|||
20
zelenprog
21.04.24
✎
12:33
|
(17),(18)
Ну в данном случае может быть смысла мало. Но в принципе, изменение интерфейса при выполнении длительной операции - это естественно необходимая задача, которая может во многих случаях быть полезной. Иначе какой смысл смотреть на не-меняющийся интерфейс при выполнении длительной операции, если в нем ничего не меняется? Ну да само приложение не блокируется, так как не модальное. А что делать в этом приложении, если я не вижу актуальных данных? |
|||
21
zelenprog
21.04.24
✎
13:24
|
(19) Спасибо за идею.
"ОбщиеНастройки" - это те, которые настраиваются в интерфейсе пользователя в разделе "Администрирование"? Попробую найти и почитать как их можно использовать для фонового задания. |
|||
22
Garykom
гуру
21.04.24
✎
13:23
|
(21) не учись плохому
есть стандарт "Работа с временным хранилищем в фоновом задании" все остальное от лукавого |
|||
23
Garykom
гуру
21.04.24
✎
13:24
|
(22)+ https://its.1c.ru/db/v8320doc#bookmark:dev:TI000000819
21.3.9. Работа с временным хранилищем в фоновом задании
В механизме работы с временным хранилищем есть возможность передать данные из фонового задания в сеанс, инициировавший фоновое задание. Для такой передачи следует в родительском сеансе поместить во временное хранилище пустое значение (с помощью метода ПоместитьВоВременноеХранилище()), указав какой-либо идентификатор создаваемого временного хранилища (параметр Адрес). Затем полученный адрес передать в фоновое задание через параметры фонового задания. Далее, если в фоновом задании этот адрес использовать в качестве значения параметра Адрес метода ПоместитьВоВременноеХранилище(), то результат будет скопирован в сеанс, из которого было запущено фоновое задание. Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания. |
|||
24
zelenprog
21.04.24
✎
14:23
|
(22),(23) судя по следующей фразе, временное хранилище не сработает - данные не будут доступны в методе "ПриОбновленииПрогрессаФоновогоЗадания":
"Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания." |
|||
25
Garykom
гуру
21.04.24
✎
14:47
|
(24) и это правильно
разбить на кучу фоновых, запустить их ловить их завершение и получать из временного хранилища результат - обновлять на форме |
|||
26
ProxyInspector
21.04.24
✎
15:21
|
"Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания."
Извращенцы. |
|||
27
ProxyInspector
21.04.24
✎
15:26
|
В фоновой процедуре или процедуре НаСервере пишете
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки, ОписаниеНастройки, ИмяПользователя) А НаКлиенте Настройки = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек,ОписаниеНастройки, ИмяПользователя) |
|||
28
ProxyInspector
21.04.24
✎
15:29
|
<Настройки> (обязательный)
Тип: Произвольный. Содержит настройки, которые нужно сохранить в хранилище. Доступность: Сервер, толстый клиент, внешнее соединение. |
|||
29
Garykom
гуру
21.04.24
✎
17:31
|
(27) дада
или проблемы с одновременным вызовом фоновых из разных сеансов и/или загаживание базы в настройках |
|||
30
ProxyInspector
21.04.24
✎
20:11
|
А ВременноеХранилище - это не загаживание базы? Когда это временное Хранилище чистится?
|
|||
31
Garykom
гуру
21.04.24
✎
20:26
|
(30) это просто оперативка + временные файлы на диске
|
|||
32
zelenprog
21.04.24
✎
21:28
|
(29) >> или проблемы с одновременным вызовом фоновых из разных сеансов...
А какие могут быть проблемы? Если для каждого сеанса использовать свой уникальный "КлючОбъекта" и "КлючНастроек"? |
|||
33
Garykom
гуру
21.04.24
✎
21:38
|
(32) как быстро база загадится?
|
|||
34
Garykom
гуру
21.04.24
✎
21:38
|
(33)+ временное хранилище очищается при рестарте сервера ))
а ХранилищеОбщихНастроек нет |
|||
35
ProxyInspector
22.04.24
✎
11:38
|
В конце фоновой процедуры можно удалять не нужную ветку настроек
ХранилищеОбщихНастроек.Удалить(КлючОбъекта, КлючНастроек,ИмяПользователя); |
|||
36
ProxyInspector
22.04.24
✎
11:41
|
Здесь же можно организовать прерывание фоновой процедуры
Если глПрерватьФоновуюПроцедуру(КлючОбъекта, КлючНастроек,ИмяПользователя) Тогда Возврат; КонецЕсли; |
|||
37
ProxyInspector
22.04.24
✎
11:46
|
на базе подобных подходов 1С могла бы без проблем Реализовать функцию Состояние() для серверных вызовов, ну и заодно реализовать прерывание длительных серверных вызовов при нажатии "ESC"
|
|||
38
Garykom
гуру
22.04.24
✎
11:54
|
(35) Можно конечно
Если без аварийного завершения |
|||
39
Garykom
гуру
22.04.24
✎
11:58
|
(37) Пробовал в БСП заглядывать?
Например ОбщийМодуль.ДлительныеОперации Там Функция СообщенияПользователю |
|||
40
Garykom
гуру
22.04.24
✎
11:59
|
(39)+ Или хотя бы в СП
Там ПолучитьСообщенияПользователю |
|||
41
Garykom
гуру
22.04.24
✎
12:03
|
(37) >и заодно реализовать прерывание длительных серверных вызовов при нажатии "ESC"
Зачем? Ты понимаешь что серверный вызов может выполняться на другом компе отличном от клиента? А фоновое на третьем, отличном и от клиента и от сервера? 1. Что, зачем и как ты собрался прерывать по ESC? 2. Чем не устраивает ОбработкаПрерыванияПользователя() и программное завершение как задумал (и реализовал) прог? Если прог не подумал и не реализовал (или такой задачи не было) ну извините |
|||
42
ProxyInspector
22.04.24
✎
15:30
|
ОбработкаПрерыванияПользователя() - это на клиенте и срабатывает через раз. Если ты имел неосторожность переключиться на другое окно, то твое ОбработкаПрерыванияПользователя() не сработает.
СообщенияПользователю() срабатывает, когда управление передается на клиент. Для фоновых его можно использовать. Так как на клиенте сидим. А прервать выполнение длительной процедуры НаСервере вообще не возможно, а фоновой процедуры 50/50 как звезды лягут. |
|||
43
ProxyInspector
22.04.24
✎
15:38
|
Судя по всему задача (0) через ХранилищеОбщихНастроек работать будет великолепно, а с использованием БСП - никогда
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |