Разное

Подключитьобработчикожидания 1с: 1С 8.3 : Периодическое выполнение кода с заданным интервалом времени

Обработчик ожидания – выполнение кода через заданное время

В этой статье покажем как в 1С выполнять код с заданной периодичностью с использованием функций обработчика ожидания:

  • ПодключитьОбработчикОжидания
  • ОтключитьОбработчикОжидания

Обработчик ожидания – это механизм, который используется на стороне клиентского приложения (т.е. в пользовательских формах и т.п.). Его задача запустить процесс, который выполнит определённые действия однократно или через заданный интервал времени. Обработчик ожидания выполняет свои действия параллельно (в выделенном потоке) основной работе пользователя.

 

Синтаксис

Рассмотрим синтаксис вышеуказанных функций:

ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>) – Подключает вызов указанной процедуры 1С через определённый интервал времени.

  • ИмяПроцедуры — <Строка> – Путь к экспортируемой процедуре. Процедура должна располагаться на клиенте и не содержать параметров.
  • Интервал — <Число> – Интервал (точность до 0,1 секунды) в секундах через который будет осуществляться вызов процедуры.
  • Однократно — <Булево> – Однократно или многократно будет исполнен код подключаемой процедуры.

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

  • ИмяПроцедуры — <Строка> — Путь к процедуре, которая должна быть отключена.

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

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

 

Пример вызова обработчика ожидания

Приведём пример работы с обработчиком ожидания:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
&НаКлиенте
Процедура ПодключитьОбработчик()
 ПодключитьОбработчикОжидания("ОбработатьОжидание", 60, Ложь);
КонецПроцедуры
 
&НаКлиенте
Процедура ОбработатьОжидание()
 ОбработатьОжиданиеНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура ОбработатьОжиданиеНаСервере()
 //Выполняем серверный код 1С
КонецПроцедуры;

В этом примере обработчик вызывается с клиента и выполняет клиентскую процедуру, которая, в свою очередь, передаёт управление серверной процедуре.

К примеру, вы хотите сделать с помощью данного механизма таймер. И хотите, чтобы имелась возможность вызывать несколько таймеров за раз. Вышеприведённый код не позволит вам вызывать обработчик несколько раз. Для этого можно сделать одну из следующих вещей:

  • Каждый раз создавать новую форму таймера, к которой привязана соответственно выполняющаяся процедура.
  • Каждый раз вызывать новый обработчик ожидания (с другим именем). К примеру: ОбработатьОжидание1, ОбработатьОжидание2, ОбработатьОжидание3

По ссылке ниже можно скачать пример внешней обработки ожидания.

Если у вас остались вопросы, задавайте их ниже в комментариях.

 

Нравится статья? Подпишитесь прямо сейчас и получайте обновления на свой E-Mail:

Facebook

Twitter

Мой мир

Вконтакте

Одноклассники

Google+

Похожее

 Распечатать статью

Выполнение кода через определенное время, используя обработчик ожидания 1С.

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

Для реализации нам необходимо использовать две процедуры:

  1. ПодключитьОбработчикОжидания
  2. ОтключитьОбработчикОжидания

ПодключитьОбработчикОжидания(<НаименованиеПроцедуры>, <Интервал>, <Однократно>) – Подключает вызов указанной процедуры 1С через определённый интервал времени.

НаименованиеПроцедуры— Имя экспортной процедуры без параметров, которая должна располагаться на стороне клиента . (Строка)
Интервал — Интервал в секундах (точность до 0,1) через который будет осуществляться вызов процедуры. (Число)
Однократно — Однократное или многократное исполнение подключаемой процедуры. (Булево)

ОтключитьОбработчикОжидания(<НаименованиеПроцедуры>) – Отключает вызов указанной процедуры 1С.

НаименованиеПроцедуры— имя отключаемой процедуры.

Как уже ранее сообщал, обработчик ожидания доступен только на клиенте. Его вызов будет продолжаться до тех пор, пока пользователь не закроет форму или не будет вызвана процедура ОтключитьОбработчикОжидания.

Пример. Допустим мы создали некую форму, которая сразу же после открытия будет напоминать нам, что необходимо перепровести документы за декабрь.

&НаКлиенте
Процедура ПриОткрытии(Отказ)
          ПодключитьОбработчикОжидания(«ОбработатьОжидание», 60, Ложь);
КонецПроцедуры
 
&НаКлиенте
Процедура ОбработатьОжидание()
          ОбработатьОжиданиеНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура ОбработатьОжиданиеНаСервере()
          Сообщить(«Не забудьте перепровести все документы за декабрь 2016 года»);
КонецПроцедуры

Повтор выполнения кода будет осуществляться каждые 60 секунд. Для прекращения пользователю необходимо закрыть форму, либо можно добавить кнопку и «повестить» на нее процедуру ОтключитьОбработчикОжидания.

Новая концепция завершения работы приложения 1С 8.3.8

Функция ДобавитьЗаписьАвторизацииПользователей(СеансИБ, ТекущаяДатаСеанса) Экспорт

ТекущийПользователь = НайтиСсылкуПоИдентификаторуПользователя(СеансИБ.Пользователь.УникальныйИдентификатор);

Если НЕ ЗначениеЗаполнено(ТекущийПользователь) Тогда

Возврат Неопределено;

КонецЕсли;

Запрос = Новый Запрос;

Запрос.Текст =

«ВЫБРАТЬ ПЕРВЫЕ 1

| 1 КАК Поле

|ИЗ

| РегистрСведений.ккПериодическиеСведенияОПользователях.СрезПоследних(

| &ДатаРегистрации,

| Пользователь = &Пользователь

| И НомерСеанса = &НомерСеанса

| И ЗавершенияСеанса = ДАТАВРЕМЯ(1, 1, 1)) КАК ккПериодическиеСведенияОПользователяхОстатки»;

Запрос.УстановитьПараметр(«ДатаРегистрации», ТекущаяДатаСеанса);

Запрос.УстановитьПараметр(«Пользователь», ТекущийПользователь);

Запрос.УстановитьПараметр(«НомерСеанса», СеансИБ.НомерСеанса);

Результат = Запрос.Выполнить();

НаборЗаписей = РегистрыСведений.ккПериодическиеСведенияОПользователях.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Период.Установить(СеансИБ.НачалоСеанса);

НаборЗаписей.Отбор.Пользователь.Установить(ТекущийПользователь);

НаборЗаписей.Отбор.НомерСеанса.Установить(СеансИБ.НомерСеанса);

НаборЗаписей.Прочитать();

Если НЕ Результат.Пустой() Тогда

Если НаборЗаписей.Количество() Тогда

СведенияОПользователе = НаборЗаписей[0];

СведенияОПользователе.ВремяВСеансе = ТекущаяДатаСеанса — СведенияОПользователе.Период;

КонецЕсли;

Иначе

СведенияОПользователе = НаборЗаписей.Добавить();

СведенияОПользователе.Период = СеансИБ.НачалоСеанса;

СведенияОПользователе.Пользователь = ТекущийПользователь;

СведенияОПользователе.НомерСеанса = СеансИБ.НомерСеанса;

СведенияОПользователе.Подключение = 1;

СведенияОПользователе.ВремяВСеансе = ТекущаяДатаСеанса — СведенияОПользователе.Период;

СведенияОПользователе.ИмяПриложения = ПредставлениеПриложения(СеансИБ.ИмяПриложения);

СведенияОПользователе.ИмяКомпьютера = СеансИБ.ИмяКомпьютера;

КонецЕсли;

Попытка

НаборЗаписей.Записать();

Исключение

КонецПопытки;

Возврат ТекущийПользователь;

КонецФункции

 

Функция НайтиСсылкуПоИдентификаторуПользователя(Идентификатор)

// Нет доступа к разделенному справочнику из неразделенного сеанса.

Если ОбщегоНазначения.РазделениеВключено()

И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда

Возврат Неопределено;

КонецЕсли;

Запрос = Новый Запрос;

ШаблонТекстаЗапроса =

«ВЫБРАТЬ

| Ссылка КАК Ссылка

|ИЗ

| %1

|ГДЕ

| ИдентификаторПользователяИБ = &Идентификатор»;

ТекстЗапросаПоПользователям = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаЗапроса, Метаданные.Справочники.Пользователи.ПолноеИмя());

ТекстЗапросаПоВнешнимПользователям = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаЗапроса, Метаданные.Справочники.ВнешниеПользователи.ПолноеИмя());

Запрос.Текст = ТекстЗапросаПоПользователям;

Запрос.Параметры.Вставить(«Идентификатор», Идентификатор);

Результат = Запрос.Выполнить();

Если НЕ Результат.Пустой() Тогда

Выборка = Результат.Выбрать();

Выборка.Следующий();

Возврат Выборка.Ссылка;

КонецЕсли;

Запрос.Текст = ТекстЗапросаПоВнешнимПользователям;

Результат = Запрос.Выполнить();

Если НЕ Результат.Пустой() Тогда

Выборка = Результат.Выбрать();

Выборка.Следующий();

Возврат Выборка.Ссылка;

КонецЕсли;

Возврат Справочники.Пользователи.ПустаяСсылка();

КонецФункции

1С БСП. Запуск фонового задания во внешней обработке с индикацией

&НаКлиенте

Функция ПодготовитьДанныеДляДлительнойОперации()

Возврат Новый Структура(«КоличествоИтераций», КоличествоИтераций);

КонецФункции

 

&НаКлиенте

Процедура ЗапуститьВыполнение(Команда)

        //сохраним идентификатор задания в реквизите формы

        ИДЗадания  = «»;

        //готовим входящие данные для фоновой процедуры

ПараметрыЗапуска = ПодготовитьДанныеДляДлительнойОперации();

        //запускаем фоновое задание, параметры: структура вх. данных и уникальный идентификатор формы-владельца

СтруктураФоновогоЗадания = ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор);

ИДЗадания = СтруктураФоновогоЗадания.ИдентификаторЗадания;

//получаем структуру параметров ожидания и устанавливаем необходимые параметры

ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);

// указываем необходимость вывода окна с индикацией

ПараметрыОжидания.ВыводитьОкноОжидания = Истина;

// указываем необходимость вывода прогресса состояния

ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;

// указываем интервал обновления состояния в секундах, если не указать,

// то интервал будет увеличиваться при каждой итерации в 1.4 раза.

ПараметрыОжидания.Интервал = 2;

 

        //Ожидать завершения выполнение процедуры в фоновом задании и открыть форму ожидания длительной операции.

ДлительныеОперацииКлиент.ОжидатьЗавершение(

СтруктураФоновогоЗадания,

Новый ОписаниеОповещения(«ОбработатьДанные», ЭтотОбъект),

ПараметрыОжидания);

КонецПроцедуры

 

&НаСервереБезКонтекста

Функция ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор)

 

НаименованиеЗадания = НСтр(«ru = ‘Запуск длительной операции'»);

        //ссылка на доп. обработку, подключенную к базе. В данном примере ищем по наименованию, указанному в Сведениях о внешней обработке

ДополнительнаяОбработкаСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(«Пример длит. операций во внешней обработке»);

        //запуск фоновой процедуры происходит через метод «ВыполнитьПроцедуруМодуляОбъектаОбработки», куда мы передаем данные об обработке и о процедуре, которую необходимо запустить

ВыполняемыйМетод = «ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки»;

ПараметрыЗадания = Новый Структура;

        //имя внешней обработки

ПараметрыЗадания.Вставить(«ИмяОбработки», «ВнешняяОбработка.ДлительныеОперацииВоВнешнейОбработке»);

        //имя экспортной серверной процедуры обработки

ПараметрыЗадания.Вставить(«ИмяМетода», «ДлительнаяОперация»);

        //входящие параметры процедуры

ПараметрыЗадания.Вставить(«ПараметрыВыполнения», ПараметрыЗапуска);

        //признак внешней обработки

ПараметрыЗадания.Вставить(«ЭтоВнешняяОбработка», Истина);

        //ссылка на доп. обработку в базе

ПараметрыЗадания.Вставить(«ДополнительнаяОбработкаСсылка»,ДополнительнаяОбработкаСсылка);

        //получаем пустую структуру параметров выполнения фонового задания и заполняем ее необходимыми данными

ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);

ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;

ПараметрыВыполнения.ЗапуститьВФоне = Истина;

ПараметрыВыполнения.Вставить(«ИдентификаторФормы», УникальныйИдентификатор);

        //запускаем выполнение фонового задания

СтруктураФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне(ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения);

Возврат СтруктураФоновогоЗадания;

КонецФункции

 

&НаКлиенте

Процедура ОбработатьДанные(Результат, ДополнительныеПараметры) Экспорт

 

Если Результат = Неопределено Тогда

Возврат;

ИначеЕсли Результат.Статус = «Ошибка» Тогда

ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Результат.ПодробноеПредставлениеОшибки);

ИначеЕсли Результат.Статус = «Выполнено» Тогда

// обрабатываем результат

Данные = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);

ВозвратноеЗначение = Данные.Количество();

КонецЕсли;

 

КонецПроцедуры

c # — Подождите одну секунду в запущенной программе

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

.Цикл событий

— документация Python 3.9.0

Исходный код: Lib / asyncio / events.py,
Библиотека / asyncio / base_events.py


Предисловие

Цикл событий — это ядро ​​любого приложения asyncio.
Циклы событий запускают асинхронные задачи и обратные вызовы, выполняют сетевые
Операции ввода-вывода и запускать подпроцессы.

Разработчики приложений обычно должны использовать высокоуровневые функции asyncio,
например asyncio.run () , и редко нужно ссылаться на цикл
объект или вызовите его методы.Этот раздел предназначен в основном для авторов
кода нижнего уровня, библиотек и фреймворков, которым нужен более тонкий контроль над
поведение цикла событий.

Получение цикла событий

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

asyncio. get_running_loop ()

Вернуть текущий цикл обработки событий в текущем потоке ОС.

Если цикл обработки событий отсутствует, возникает ошибка RuntimeError .Эта функция может быть вызвана только из сопрограммы или обратного вызова.

asyncio. get_event_loop ()

Получить текущий цикл событий.

Если в текущем потоке ОС не установлен текущий цикл событий,
поток ОС является основным, а set_event_loop () еще не
был вызван, asyncio создаст новый цикл событий и установит его как
текущий.

Поскольку эта функция имеет довольно сложное поведение (особенно
когда используются настраиваемые политики цикла событий), используя
get_running_loop () функция предпочтительнее get_event_loop ()
в сопрограммах и обратных вызовах.

Рассмотрите также возможность использования функции asyncio.run () вместо использования
функции нижнего уровня для создания и закрытия цикла событий вручную.

asyncio. set_event_loop ( петля )

Установить цикл как текущий цикл событий для текущего потока ОС.

asyncio. new_event_loop ()

Создайте новый объект цикла событий.

Обратите внимание, что поведение get_event_loop () , set_event_loop () ,
и new_event_loop () функции могут быть изменены
установка настраиваемой политики цикла событий.

Содержание

Эта страница документации содержит следующие разделы:

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *