"Мигаем" интерфейсом, или цепочки асинхронных вызовов

06.09.17

Разработка - Механизмы платформы 1С

Как, не блокируя интерфейс, привлечь внимание пользователя к интерфейсным элементам. Или, попросту говоря, "мигнуть" чем-то.

Платформа 1С предоставляет нам возможности асинхронных вызовов процедур, которые, порой, можно использовать для простых, но весёлых вещей. Например, можно "мигать" всем, у чего есть цвет или любая возможность изменения визуального оформления. Причём, можно использовать как более простой, но неконтролируемый механизм, так и сконструировать интересную цепочку асинхронных вызовов и задать ей предпочтительное поведение.

Речь здесь идёт, конечно же, о процедуре ПодключитьОбработчикОжидания().

Напомню синтаксис процедуры: 

ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>)

, причём, если указывать интервал меньше секунды, запуск процедуры обязан быть однократным. Вот здесь мы и теряем контроль над потоком исполнения и теряем возможность его "кастомизировать" (гибко, индивидуально настроить).

Но это ограничение легко обходится.

Чтобы не растекаться мыслею по древу, сразу приведу простой пример и объясню его.

 
 Магия :)

 Допустим, у нас на форме есть табличный документ и мы хотим "мигнуть" 5 раз какой-то его областью.

////////////////////
//
// "Мигнём" областью Табличного документа 5 раз, с интервалом в полсекунды
//
////////////////////

&НаКлиенте
Процедура ПомигатьОбластью(Команда)
	
	мфСколькоРазМигать = 3; // Счётчик. Реквизит формы, "видимый" в процедурах обработчиков ожидания
	
	ПодключитьОбработчикОжидания("ПоказатьВыделениеОбласти", 0.1, Истина); // Можно и напрямую вызвать
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьВыделениеОбласти()
	
	Область = Объект.ТД.Область(мфПерваяСтрокаДанных, мфПерваяКолонкаДанных, мфПоследняяСтрокаДанных, мфПоследняяКолонкаДанных);
	
	Граница = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Двойная);
	
	Область.Обвести(Граница, Граница, Граница, Граница); // Обводим область
	
	мфСколькоРазМигать = мфСколькоРазМигать - 1; // Декремент счётчика
	
	ПодключитьОбработчикОжидания("УбратьВыделениеОбласти", 0.5, Истина); // Соединяем цепочку асинхронных вызовов
	
КонецПроцедуры

&НаКлиенте
Процедура УбратьВыделениеОбласти()
	
	Область = Объект.ТД.Область(мфПерваяСтрокаДанных, мфПерваяКолонкаДанных, мфПоследняяСтрокаДанных, мфПоследняяКолонкаДанных);
	
	Граница = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии);
	
	Область.Обвести(Граница, Граница, Граница, Граница); // Снимаем обведение области
	
	Если мфСколькоРазМигать > 0 Тогда
		ПодключитьОбработчикОжидания("ПоказатьВыделениеОбласти", 0.5, Истина); // Повторяем столько, сколько осталось по счётчику
	КонецЕсли;
	
КонецПроцедуры

Основное требование только в том, чтобы переменная-счётчик мфСколькоРазМигать была "видна" из процедур, которые мы запускаем асинхронно. В данном случае переменная — это реквизит формы.

Внимательный читатель мог заметить, что с формированием таких цепочек мы убиваем сразу двух зайцев:

  • Обходим ограничение на повторяемость вызовов процедуры со значениями интервала меньше секунды;
  • Имеем возможность формировать цепочки разной длины и сложности:
    • подключать обработчик ожидания непосредственно в самой процедуре обработчика ожидания;
    • сделать, чтобы такие процедуры подключали друг друга;
    • организовать более сложную структуру цепочек вызовов;
    • бесконечно усложнять вариативность управления вызовами (например, изменять внутри вызовов не только их счётчики, но и значения интервалов, стили оформления (чтобы радугой переливалось 🌈).

Несмотря на простоту описанного метода, в нём скрыт немалый потенциал.

В 2017-м году более гибко управлять поведением программы — это современно.

асинхронные цепочки вызовов процедуры неблокирующие вызовы неблокируемый интерфейс

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4532    dsdred    53    

72

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5295    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6410    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18475    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12088    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8824    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15986    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. kraynev-navi 647 06.09.17 21:10 Сейчас в теме
1С могло бы уже наконец, что-то платформенное добавить в наш интерактивный век.
Вот еще на тему привлечения внимания: анимация фона https://infostart.ru/public/330799/
4. Yashazz 4709 07.09.17 11:01 Сейчас в теме
(1) 1С соорудила нахрен не нужную систему внутренних оповещений, а потом сообразила, что с её помощью таки можно "мигать интерфейсом". Читайте зазеркалье. Десяти лет не пройдёт, как будет нам щастье.

По сути публикации - ничего нового.
5. GreenDragon 07.09.17 21:23 Сейчас в теме
(4) Таки не 1С сообразила с морганием интерфейсом, а топикстартер. 1С дала сервер взаимодействия, если читать зазеркалье. По сути статья о некоем резиновом костыле (гибком решении), который вполне себе может прекратить работать с любым релизом. Причём обрезание возможности указывать нецелочисленные значения в параметрах вызова с 99% вероятностью даже не будет заявлено в фиксах. В общем, на свой страх и риск.

P.S. Есть что-то неуловимо схожее у этой статьи и тем анекдотом про удаление аппендикса ложкой...
6. Yashazz 4709 07.09.17 23:15 Сейчас в теме
7. Chrizt 264 08.09.17 12:38 Сейчас в теме
(5) Не думаю, что интерфейсные "мигания" настолько важны, чтобы отслеживать выпиливание нецелочисленных значений интервала.
Пример для того и дан, чтобы показать всю несерьёзность использования. А то, если кого-то понесёт костылить из этого что-то более серьёзное...
например, распараллелить умножение матриц друг на друга.


А если отвалится "мигалка" - да ну и хрен бы с ней!
2. brr 182 07.09.17 09:06 Сейчас в теме
3. protexprotex 113 07.09.17 10:17 Сейчас в теме
Хорошо было бы чтоб была возможность из 1С запустить несколько потоков с барьерной синхронизацией - например, распараллелить умножение матриц друг на друга.
8. bonv 1510 08.09.17 14:58 Сейчас в теме
(3) матрицы умножайте во внешней компоненте или в крайнем случае запросом. Но уж точно не встроенным языком
9. protexprotex 113 08.09.17 16:17 Сейчас в теме
(8) Ну а так я о том и пишу - сделали бы команду умножения матриц друг на друга. Хотя, это уже к 1С-ке мало как относится.
10. Krasnyj 1282 09.09.17 00:30 Сейчас в теме
Мигание интерфейсом - чем плохо, например, мигнуть нужной кнопкой, когда пользователь жмет не туда? :)
maksa2005; Chrizt; +2 Ответить
11. Chrizt 264 10.09.17 04:12 Сейчас в теме
Статья с Хабра:
"Параллелизм против многопоточности против асинхронного программирования: разъяснение".
Может помочь лучше понять, чем отличаются все три понятия и в каких случаях используются.
12. Бубузяка 62 13.09.17 09:17 Сейчас в теме
Прикольно.
Однако, "съезжает" ТекущаяОбласть в "мигающую" ячейку, неудобно. Проверил на форме. Фокус клавиатуры в формах не переместился на "мигалку". Можно применять.
13. sa1m0nn 28 14.09.17 19:06 Сейчас в теме
Оставьте свое сообщение