Периодическое выполнение кода с заданным интервалом времени - ОбработкаОжидания(). Периодическое выполнение кода с заданным интервалом времени - ОбработкаОжидания() 1c 8 html обработчик ожидания

Платформа 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) для прекращения обработки ожидания (естественно, после выполнения нужных условий).
Источник

Код 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) для прекращения обработки ожидания (естественно, после выполнения нужных условий).
Источник



Понравилась статья? Поделиться с друзьями: