"блимаємо" інтерфейсом, або ланцюжка асинхронних викликів. Періодичне виконання коду із заданим інтервалом часу - ОбробкаОчікування() Обробник очікування 1с 8.2

Платформа 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)

Але! Проблема в тому, що запустити обробку очікування можна лише один раз. Повторний запуск призведе до скасування попереднього. Іншими словами, якщо Ви хочете зробити, наприклад, обробку-таймер для відліку витраченого часу, то можна запустити тільки один таймер, т.к. запуск другого таймера призведе до зупинки першого. А що робити, якщо Вам треба запустити 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)

Але! Проблема в тому, що запустити обробку очікування можна лише один раз. Повторний запуск призведе до скасування попереднього. Іншими словами, якщо Ви хочете зробити, наприклад, обробку-таймер для відліку витраченого часу, то можна запустити тільки один таймер, т.к. запуск другого таймера призведе до зупинки першого. А що робити, якщо Вам треба запустити 2, 3 або більше таких таймерів одночасно? Чи Вам ще потрібно при цьому періодично сканувати стан документів?

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

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

У формах можна використовуватиКод 1C v 8.х Форма.ОбработкаОжидания("ИмяПроцедуры",ЧасЗапуска) ,
де Ім'яПроцедури - ім'я процедури, яка запускається через ЧасЗапуску секунд
У самій процедурі потрібно вставити Код 1C v 8.х Форма.ОбработкаОжидания("ИмяПроцедуры",0) припинення обробки очікування (звісно, ​​після виконання потрібних умов).
Джерело



Подібні публікації