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