"блимаємо" інтерфейсом, або ланцюжка асинхронних викликів. Періодичне виконання коду із заданим інтервалом часу - ОбробкаОчікування() Обробник очікування 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) припинення обробки очікування (звісно, після виконання потрібних умов).
Джерело