Единый семинар «1С» для бухгалтеров и руководителей

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

Программирование - Практика программирования

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

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

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

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

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

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

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

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

 
 Магия :)

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

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

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

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

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

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

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

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

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

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

См. также

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

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

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


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