Имя: Пароль:
1C
1С v8
Доступность элементов формы асинхронно
Ø (Волшебник 25.07.2023 15:14)
, ,
0 Gross2023
 
24.07.23
16:16
Возникла сложность: не могу понять как умудриться установить доступность элементов формы (УФ) раньше, чем исполнится цикл.
Есть процедура на клиенте, в ней есть код:

Элементы.Поле1.Доступность = Ложь;
Для Каждого ЭлементМассива Из Массив Цикл
...
КонецЦикла;

Так вот в интерфейсе происходит задержка изменения доступности на время исполнения цикла.
Как сделать так, чтобы пользователь сразу увидел что элемент недоступен?
1 Fish
 
24.07.23
16:18
Устанавливай доступность в процедуре, в которой нет цикла.
2 Волшебник
 
24.07.23
16:19
(0) Уберите цикл, передайте управление платформе, чтобы она отрисовала изменения на форме.
3 Gross2023
 
24.07.23
16:19
(1) Пробовал
4 Gross2023
 
24.07.23
16:19
(2) Это как? Без цикла нельзя
5 lodger
 
24.07.23
16:21
(4) сделай 2 разных процедуры. вызывай по-очереди.
6 Fish
 
24.07.23
16:21
(3) Установи доступность в ПриСозданииНаСервере.
7 Gross2023
 
24.07.23
16:21
(6) Необходимо при нажатии на кнопку устанавливать доступность
8 Gross2023
 
24.07.23
16:22
(5) Не помогает
9 Gross2023
 
24.07.23
16:23
Сейчас вот так:
&НаКлиенте
Процедура ВыполнитьОбработку(Команда)
    УстановитьДоступностьЭлементовУправления(Ложь);
    МассивДанных = ПолучитьМассивДанных();
КонецПроцедуры
10 Fish
 
24.07.23
16:24
(9) Тут нет никакого цикла.
11 Gross2023
 
24.07.23
16:26
(10) ТУТ есть:
Функция ПолучитьМассивДанных()
12 Мультук
 
гуру
24.07.23
16:30
(0)

Типовое решение из типовой конфигурации.

&НаКлиенте
Процедура СделатьХорошо() Экспорт
   Элементы.Поле1.Доступность = Ложь;     

   ПодключитьОбработчикОжидания("СделатьХорошоВЦикле", 0.1, Истина);
    
КонецПроцедуры


&НаКлиенте
Процедура СделатьХорошоВЦикле() Экспорт
   Для Каждого ЭлементМассива Из Массив Цикл

   КонецЦикла;     

КонецПроцедуры
13 Gross2023
 
24.07.23
16:37
(12) Отлично, а как передать обратно массив?
14 Donkey_hot
 
24.07.23
16:38
Как вариант:

&НаКлиенте
Процедура Команда1(Команда)
    //Устанавливаем видимость;
    Оповестить("НадоВыполнитьЦикл");        
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "НадоВыполнитьЦикл" Тогда
        //выполняем цикл
    КонецЕсли;

КонецПроцедуры
15 Gross2023
 
24.07.23
16:41
(14) данные из цикла через глобальную переменную передавать?
16 Donkey_hot
 
24.07.23
16:46
(15) Куда передавать, не очень понятно... Вы хотели выполнить какой-то кусок кода на клиенте, он просто будет выполнен в другой процедуре.
17 Мультук
 
гуру
24.07.23
16:47
(13)


Типовое решение из типовой конфигурации.

&НаКлиенте
Процедура СделатьХорошо() Экспорт
   Элементы.Поле1.Доступность = Ложь;    

   ПодключитьОбработчикОжидания("СделатьХорошоВЦикле", 0.1, Истина);
    
КонецПроцедуры


&НаКлиенте
Процедура СделатьХорошоВЦикле() Экспорт
   МассивДанных = ПолучитьМассивДанных();

   Для Каждого ЭлементМассива Из МассивДанных Цикл

   КонецЦикла;    

КонецПроцедуры
18 Gross2023
 
24.07.23
16:53
(17) Ну, короче, создавать реквизит, или глобальную переменную?
19 Gross2023
 
24.07.23
16:55
(17) В процедуре СделатьХорошо() нужны данные из МассивДанных
20 Aleksandr N
 
24.07.23
16:55
(0) Условное оформление не предлалагть?
21 Gross2023
 
24.07.23
16:56
(20) Предлагать, если будет работать
22 Aleksandr N
 
24.07.23
16:56
(21) Предлагаю.
23 Donkey_hot
 
24.07.23
16:56
(19) А что мешает получить массив и тут же его обработать в данной процедуре?
24 Aleksandr N
 
24.07.23
16:57
(22) хотя не, это же для таблиц вроде
25 Gross2023
 
24.07.23
16:57
(22) Спасибо
26 Donkey_hot
 
24.07.23
16:58
(23) Проще говоря, что мешает вынести все, что Вы планировали выполнить после установки видимости в отдельную процедуру и вызвать ее как угодно (через обработчик ожидания или через Оповестить())?
27 Gross2023
 
24.07.23
16:59
(26) Спасибо, попробую. И оформление попробую тоже
28 Жан Пердежон
 
24.07.23
18:49
(19) не нужны
29 Gross2023
 
25.07.23
08:10
Получилось так:

&НаКлиенте
Процедура ВыполнитьОбработку(Команда)
    УстановитьДоступностьЭлементовУправления(Ложь);
    ПодключитьОбработчикОжидания("ЗапуститьФоновоеЗаданиеНаКлиенте", 0.1, Истина);
КонецПроцедуры

Цикл выполняется в обработчике ожидания. Всем спасибо, а то к вечеру голова не работает совсем...
30 lodger
 
25.07.23
12:06
(29) >> а то к вечеру голова не работает совсем
какой знакомый симптом. был тут один многоликий .нус с таким симптомом.
31 Gross2023
 
25.07.23
15:07
(30) Это оскорбление?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.