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

Код 1C v 8.2 УП ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Параметры:
<ИмяПроцедуры>
<Интервал> (обязательный) Тип: Число. Интервал времени в секундах с точностью до 1/10 секунды, через который будет осуществляться вызов процедуры (положительное число).Если указано значение меньше 1, то значение третьего параметра должно быть равно Истина.
<Однократно> (необязательный) Тип: Булево. Признак однократного выполнения обработчика ожидания.
Истина - указанный обработчик ожидания будет выполнен один раз. Значение по умолчанию: Ложь
Описание: Подключает указанную процедуру в качестве обработчика ожидания. Процедура будет вызываться в период ожидания системы каждый раз по истечению указанного интервала времени.

Доступность:
Тонкий клиент, веб-клиент, толстый клиент.

Примечание:
Вызов обработчика ожидания продолжается пока форма не будет закрыта или пока не будет вызван метод формы ОтключитьОбработчикОжидания. Код 1C v 8.2 УП ОтключитьОбработчикОжидания(<ИмяПроцедуры>)

Код 1C v 8.2 УП
&НаКлиенте
Процедура ОболочкаОбработчика ()
ОбработатьОжидание();
КонецПроцедуры

&НаСервере
Процедура ОбработатьОжидание()
// делаем всё, что требуется
КонецПроцедуры

//....
ПодключитьОбработчикОжидания("ОболочкаОбработчика", 3, Истина);

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Подключает вызов указанной процедуры модуля управляемого приложения (модуля обычного приложения) или глобального общего модуля через определенный интервал времени. Вызов будет осуществляться только в "состоянии покоя", то есть в тот момент, когда программа не выполняет никаких действий. Вызов обработчика ожидания продолжается, пока система не завершит работу или пока не будет вызван метод глобального контекста ОтключитьОбработчикОжидания.
Код 1C v 8.х Процедура ОтчетОпродажахЗаДень()
// ...
КонецПроцедуры

//...
ПодключитьОбработчикОжидания("ОтчетОпродажахЗаДень", 60); // каждую минуту
Код 1C v 8.х // В типовых проверка дин. обновления конфигурации каждые 20 мин.
ПодключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ", 20 * 60);
// подключим обработчик обменов данными
ПодключитьОбработчикОжидания("ПроверкаОбменаДанными", глЗначениеПеременной("глКоличествоСекундОпросаОбмена"));
ПодключитьОбработчикОжидания("ПроверитьОтветыНаЗаявленияНаПодключение", 86400); // = 24(ч) * 60(мин) * 60(сек) = 1 сутки

Для Формы
Код 1C v 8.х ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Параметры:
<ИмяПроцедуры> (обязательный) Тип: Строка. Имя процедуры, подключаемой в качестве обработчика ожидания.
<Интервал> (обязательный) Тип: Число. Интервал времени в секундах с точностью до 1/10 секунды, через который будет осуществляться вызов процедуры (положительное число). Если указано значение меньше 1, то значение третьего параметра должно быть равно Истина.
<Однократно> (необязательный) Тип: Булево. Признак однократного выполнения обработчика ожидания. 0Истина - указанный обработчик ожидания будет выполнен один раз. Значение по умолчанию: Ложь

Описание:
Подключает указанную процедуру в качестве обработчика ожидания. Процедура будет вызываться в период ожидания системы каждый раз по истечению указанного интервала времени.

Доступность:
Толстый клиент.
Примечание:
Вызов обработчика ожидания продолжается пока форма не будет закрыта или пока не будет вызван метод формы ОтключитьОбработчикОжидания.
Пример:
Код 1C v 8.х ПодключитьОбработчикОжидания("ПриОжидании", 1);
Код 1C v 8.х Форма.мИнтервалАвтосохранения = 300; // 5 минут
Если Форма.мИнтервалАвтосохранения <> 0 Тогда
Форма.ПодключитьОбработчикОжидания("ОбработчикСобытияПоТаймеру", Цел(Форма.мИнтервалАвтосохранения * 60));
КонецЕсли;

Обработка ожидания в системе 1С:Предприятие , как следует из документации, предназначена для периодического выполнения процедуры глобального модуля с заданным интервалом времени. Код для запуска будет выглядеть следующим образом:
Код 1C v 7.x ОбработкаОжидания("ОбновитьСчетчик_",1);
Где "ОбновитьСчетчик_" - имя процедуры глобального модуля, которая будет запускаться с периодичностью в 1 сек. (второй параметр, равный 1)

Но! Проблема в том, что запустить обработку ожидания можно только 1 раз. Повторный запуск приведет к отмене предыдущего. Другими словами, если Вы хотите сделать, к примеру, обработку-таймер для отсчета затраченного времени, то запустить можно только один таймер, т.к. запуск второго таймера приведет к остановке первого. А что делать если Вам надо запустить 2, 3 или больше таких таймеров одновременно? Или Вам надо еще при этом периодически сканировать состояние документов?

Выход есть! Обработку ожидания надо запустить в контексте формы, чтобы отделить этот поток от глобального контекста. И тогда станет возможным периодический запуск процедуры локального модуля, т.е. процедуры, расположенной в модуле формы Вашей обработки.

Код для запуска будет выглядеть следующим образом:
Код 1C v 7.x Форма.ОбработкаОжидания("ОбновитьСчетчик_",1);
Где "ОбновитьСчетчик_" - имя процедуры локального модуля формы обработки, которая будет запускаться с периодичностью в 1 сек. (второй параметр, равный 1)
Таким образом, в каждой обработке можно запустить свою обработку ожидания, которая будет работать до тех пор, пока открыта форма.

В формах можно использовать Код 1C v 8.х Форма.ОбработкаОжидания("ИмяПроцедуры",ВремяЗапуска) ,
где ИмяПроцедуры - имя процедуры, которая запускается через ВремяЗапуска секунд
В самой процедуре нужно вставить Код 1C v 8.х Форма.ОбработкаОжидания("ИмяПроцедуры",0) для прекращения обработки ожидания (естественно, после выполнения нужных условий).
Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Код 1C v 8.2 УП ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Параметры:
<ИмяПроцедуры>
<Интервал> (обязательный) Тип: Число. Интервал времени в секундах с точностью до 1/10 секунды, через который будет осуществляться вызов процедуры (положительное число).Если указано значение меньше 1, то значение третьего параметра должно быть равно Истина.
<Однократно> (необязательный) Тип: Булево. Признак однократного выполнения обработчика ожидания.
Истина - указанный обработчик ожидания будет выполнен один раз. Значение по умолчанию: Ложь
Описание: Подключает указанную процедуру в качестве обработчика ожидания. Процедура будет вызываться в период ожидания системы каждый раз по истечению указанного интервала времени.

Доступность:
Тонкий клиент, веб-клиент, толстый клиент.

Примечание:
Вызов обработчика ожидания продолжается пока форма не будет закрыта или пока не будет вызван метод формы ОтключитьОбработчикОжидания. Код 1C v 8.2 УП ОтключитьОбработчикОжидания(<ИмяПроцедуры>)

Код 1C v 8.2 УП
&НаКлиенте
Процедура ОболочкаОбработчика ()
ОбработатьОжидание();
КонецПроцедуры

&НаСервере
Процедура ОбработатьОжидание()
// делаем всё, что требуется
КонецПроцедуры

//....
ПодключитьОбработчикОжидания("ОболочкаОбработчика", 3, Истина);

<ИмяПроцедуры>, <Интервал>, <Однократно>)
Подключает вызов указанной процедуры модуля управляемого приложения (модуля обычного приложения) или глобального общего модуля через определенный интервал времени. Вызов будет осуществляться только в "состоянии покоя", то есть в тот момент, когда программа не выполняет никаких действий. Вызов обработчика ожидания продолжается, пока система не завершит работу или пока не будет вызван метод глобального контекста ОтключитьОбработчикОжидания.
Код 1C v 8.х Процедура ОтчетОпродажахЗаДень()
// ...
КонецПроцедуры

//...
ПодключитьОбработчикОжидания("ОтчетОпродажахЗаДень", 60); // каждую минуту
Код 1C v 8.х // В типовых проверка дин. обновления конфигурации каждые 20 мин.
ПодключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ", 20 * 60);
// подключим обработчик обменов данными
ПодключитьОбработчикОжидания("ПроверкаОбменаДанными", глЗначениеПеременной("глКоличествоСекундОпросаОбмена"));
ПодключитьОбработчикОжидания("ПроверитьОтветыНаЗаявленияНаПодключение", 86400); // = 24(ч) * 60(мин) * 60(сек) = 1 сутки

Для Формы
Код 1C v 8.х ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Параметры:
<ИмяПроцедуры> (обязательный) Тип: Строка. Имя процедуры, подключаемой в качестве обработчика ожидания.
<Интервал> (обязательный) Тип: Число. Интервал времени в секундах с точностью до 1/10 секунды, через который будет осуществляться вызов процедуры (положительное число). Если указано значение меньше 1, то значение третьего параметра должно быть равно Истина.
<Однократно> (необязательный) Тип: Булево. Признак однократного выполнения обработчика ожидания. 0Истина - указанный обработчик ожидания будет выполнен один раз. Значение по умолчанию: Ложь

Описание:
Подключает указанную процедуру в качестве обработчика ожидания. Процедура будет вызываться в период ожидания системы каждый раз по истечению указанного интервала времени.

Доступность:
Толстый клиент.
Примечание:
Вызов обработчика ожидания продолжается пока форма не будет закрыта или пока не будет вызван метод формы ОтключитьОбработчикОжидания.
Пример:
Код 1C v 8.х ПодключитьОбработчикОжидания("ПриОжидании", 1);
Код 1C v 8.х Форма.мИнтервалАвтосохранения = 300; // 5 минут
Если Форма.мИнтервалАвтосохранения <> 0 Тогда
Форма.ПодключитьОбработчикОжидания("ОбработчикСобытияПоТаймеру", Цел(Форма.мИнтервалАвтосохранения * 60));
КонецЕсли;

Обработка ожидания в системе 1С:Предприятие , как следует из документации, предназначена для периодического выполнения процедуры глобального модуля с заданным интервалом времени. Код для запуска будет выглядеть следующим образом:
Код 1C v 7.x ОбработкаОжидания("ОбновитьСчетчик_",1);
Где "ОбновитьСчетчик_" - имя процедуры глобального модуля, которая будет запускаться с периодичностью в 1 сек. (второй параметр, равный 1)

Но! Проблема в том, что запустить обработку ожидания можно только 1 раз. Повторный запуск приведет к отмене предыдущего. Другими словами, если Вы хотите сделать, к примеру, обработку-таймер для отсчета затраченного времени, то запустить можно только один таймер, т.к. запуск второго таймера приведет к остановке первого. А что делать если Вам надо запустить 2, 3 или больше таких таймеров одновременно? Или Вам надо еще при этом периодически сканировать состояние документов?

Выход есть! Обработку ожидания надо запустить в контексте формы, чтобы отделить этот поток от глобального контекста. И тогда станет возможным периодический запуск процедуры локального модуля, т.е. процедуры, расположенной в модуле формы Вашей обработки.

Код для запуска будет выглядеть следующим образом:
Код 1C v 7.x Форма.ОбработкаОжидания("ОбновитьСчетчик_",1);
Где "ОбновитьСчетчик_" - имя процедуры локального модуля формы обработки, которая будет запускаться с периодичностью в 1 сек. (второй параметр, равный 1)
Таким образом, в каждой обработке можно запустить свою обработку ожидания, которая будет работать до тех пор, пока открыта форма.

В формах можно использовать Код 1C v 8.х Форма.ОбработкаОжидания("ИмяПроцедуры",ВремяЗапуска) ,
где ИмяПроцедуры - имя процедуры, которая запускается через ВремяЗапуска секунд
В самой процедуре нужно вставить Код 1C v 8.х Форма.ОбработкаОжидания("ИмяПроцедуры",0) для прекращения обработки ожидания (естественно, после выполнения нужных условий).
Источник