Обработка ожидания

Код 1C v 8.2 УП ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Параметры:
<ИмяПроцедуры> (обязательный) Тип: Строка. Имя процедуры, подключаемой в качестве обработчика ожидания.
<Интервал> (обязательный) Тип: Число. Интервал времени в секундах с точностью до 1/10 секунды, через который будет осуществляться вызов процедуры (положительное число).Если указано значение меньше 1, то значение третьего параметра должно быть равно Истина.
<Однократно> (необязательный) Тип: Булево. Признак однократного выполнения обработчика ожидания.
Истина — указанный обработчик ожидания будет выполнен один раз. Значение по умолчанию: Ложь
Описание: Подключает указанную процедуру в качестве обработчика ожидания. Процедура будет вызываться в период ожидания системы каждый раз по истечению указанного интервала времени.
Доступность:
Тонкий клиент, веб-клиент, толстый клиент.
Примечание:
Вызов обработчика ожидания продолжается пока форма не будет закрыта или пока не будет вызван метод формы ОтключитьОбработчикОжидания. Код 1C v 8.2 УП ОтключитьОбработчикОжидания(<ИмяПроцедуры>)
Код 1C v 8.2 УП
&НаКлиенте
Процедура ОболочкаОбработчика ()
ОбработатьОжидание();
КонецПроцедуры
&НаСервере
Процедура ОбработатьОжидание()
// делаем всё, что требуется
КонецПроцедуры
//….
ПодключитьОбработчикОжидания(«ОболочкаОбработчика», 3, Истина);
Код 1C v 8.х ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Подключает вызов указанной процедуры модуля управляемого приложения (модуля обычного приложения) или глобального общего модуля через определенный интервал времени. Вызов будет осуществляться только в «состоянии покоя», то есть в тот момент, когда программа не выполняет никаких действий. Вызов обработчика ожидания продолжается, пока система не завершит работу или пока не будет вызван метод глобального контекста ОтключитьОбработчикОжидания.
Код 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С 8? Давайте рассмотрим подробнее.

Прогресс бар в 1С 8.2

К примеру, в нашей обработке перебирается некий огромный массив данных, после чего с этим массивом происходят другие действия. Так вот сколько процентов будет выполняться данные действия мы и рассмотрим. В 1С 8.2 прогресс бар — это всего-навсего объект со своими свойствами. Для реализации его графического отображения нам необходимо будет сначала на форму вставить элемент управления «Индикатор», а в модуле в цикле прибавлять некоторый числовой шаг.

Прогресс бар в управляемых формах 1С 8

В управляемых формах, при обычном выполнении процедуры на сервере, пользовательский интерфейс полностью блокируется. При таком подходе мы не увидим плавного увеличения статусной строки. А только сразу 0\% и после выполнения обработки сразу 100\%. Для решения нам необходимо применять фоновый режим и использовать метод асинхронного программирования. При таком подходе интерфейс пользователя не блокируется и мы можем полностью с ним работать. При этом необходимо опрашивать состояние фонового режима.

Алгоритм действий:

  • Необходимо разместить в общем модуле (не глобальном) длительную процедуру, которая будет на определенном моменте посылать пользователю сообщение со статусом и процентом выполенения, например:

Процедура Посылка() Экспорт

Для Шаг= 1 По 100 Цикл


Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Строка(Шаг);
Сообщение.Сообщить();
КонецЦикла;

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

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

&НаКлиенте
Процедура Старт(Команда)
ЗапускНаСервере();
ПодключитьОбработчикОжидания(«ПроверитьСтатусЗадания», 1); //каждую секунду
КонецПроцедуры

&НаСервере
Процедура ЗапускНаСервере()
ЗаданиеВФоне = ФоновыеЗадания.Выполнить(«НашМодуль.Посылка»); //Здесь указываем нашу длительную процедуру, которую мы создали в начале
Идентификатор = ЗаданиеВФоне .УникальныйИдентификатор; // Идентификатор — реквизит формы с типом уникальный идентификатор
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСтатусЗадания()
Стутус= ПолучитьСообщения();
Если Стутус= «Выполнено» Тогда
ОтключитьОбработчикОжидания(«ПроверитьСтатусЗадания»);
Состояние(«Выполнено:», 100);
Иначе
Для Каждого Шаг Из Стутус Цикл
Состояние(«Выполнено:», Число(Шаг));
КонецЦикла;

КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьСообщения()

Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор);
Если Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
Возврат Задание.ПолучитьСообщенияПользователю(Истина); //Получаем и сообщения, которые были отправлены из длительной процедуры
Иначе
Возврат «Выполнено»;
КонецЕсли;

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

Таким образом мы можем получать сведения о статусе выполнения процедуры на сервере, получать сообщения со статусом, обрабатывать и уже после обновлять состояние прогресс бара.

Для более глубокого изучения 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…

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

1) Установите дистрибутив поставки конфигурации, нажав setup.exe из полученного Вами дистрибутива (запомните путь, куда будет установлен дистрибутив подсистемы).

2) Зайдите в конфигуратор информационной базы. Конфигурация может находиться на поддержке без возможности изменения (возле каждого объекта могут быть «замочки»). «Замочки» означают, что конфигурацию нельзя редактировать. Если замочков уже нет, идем к шагу 6.

3) Для того, чтобы открыть возможность редактирования конфигурации зайдите в меню: «Конфигурация>Поддержка>Настройка поддержки»

4) Включите возможность изменения конфигурации.

После этого будет задан вопрос:

Необходимо нажать «Да». Далее появится окно:

Необходимо выбрать указанный пункт и нажать OK, немного подождать и закрыть окно «Настройка поддержки».

5) После того как возможность изменения будет включена необходимо сохранить конфигурацию. Для этого нажмите F7.

6) В меню выберите пункт «Конфигурация>Сравнить и объединить с конфигурацией из файла»:

7) После чего укажите файл 1Cv8.cf из каталога установленного дистрибутива нашей подсистемы на первом шаге и подпапке «journ», например, в Windows 7 путь будет следующим:

«c:\Users\<Имя учетной записи>\AppData\Roaming\1C\1Cv82\tmplts\journ\»).

Будет задан вопрос о постановке на поддержку:

Нажимаем «Да».

8) Откроется окно сравнения, объединения с конфигураций. В этом окне необходимо снять флажок с корневого элемента дерева. Будут сняты все флажки.

9) Нажимаем в этом окне «Действия>Отметить по подсистемам файла»

Выбираем указанные флаги и нажимаем «Установить».

10) После этого в подсистемах устанавливаем флаг возле строки «внЖурналРегистриации» (в дереве объектов Общие>Подсистемы).

11) Нажмите кнопку «Выполнить». Появится диалоговое окно:

Нажмите «OK». После чего сохраните конфигурацию нажав F7.

12) Теперь необходимо добавить служебный код, чтобы подсистема смогла работать при запуске:

Правой кнопкой по корню конфигурации и можно открыть любой модуль

Для управляемого приложения (управляемое приложение):

В начало процедуры ПриНачалеРаботыСистемы:

Процедура ПриНачалеРаботыСистемы() //<< вн внЖурналРегистрацииКлиент.ПриНачалеРаботыСистемы(); //>>

Процедура ПриНачалеРаботыСистемы()

//<< вн

внЖурналРегистрацииКлиент.ПриНачалеРаботыСистемы();

В конец процедуры ПриЗавершенииРаботыСистемы (если ее нет, создать):

Процедура ПриЗавершенииРаботыСистемы()

// Добавляем в конец процедуры

//<< вн

внЖурналРегистрацииКлиент.ПриЗавершенииРаботыСистемы();

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

Модуль внешнего соединения должен выглядеть вот так:

Процедура ПриНачалеРаботыСистемы()

//<< вн

внЖурналРегистрацииКлиент.ПриНачалеРаботыСистемы();

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

Процедура ПриЗавершенииРаботыСистемы()

//<< вн

внЖурналРегистрацииКлиент.ПриЗавершенииРаботыСистемы();

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

Модуль сеанса (если процедуры УстановкаПараметровСеанса нет, то создать ее):

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)

//<< вн

внЖурналРегистрации.УстановкаПараметровСеанса(ТребуемыеПараметры);

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

В конфигурациях на основе БСП (Бухгалтерия предприятия 3.0, Управление торговлей 11.2 и т.п.) в последних версиях появилась необходимость в общий модуль ПользователиПереопределяемый в процедуру ПриОпределенииНазначенияРолей добавить:

… НазначениеРолей.ТолькоДляПользователейСистемы.Добавить(Метаданные.Роли.внАдминистраторЖурналаРегистрации.Имя); НазначениеРолей.ТолькоДляПользователейСистемы.Добавить(Метаданные.Роли.внПросмотрЖурналаРегистрации.Имя);
Это необходимо, делать только в конфигурациях на базе БСП, если в вашей конфигурации нет такого общего модуля и аналогичной процедуры в нем, то добавлять туда ничего не нужно.

Если указанные процедуры уже существуют, необходимо добавить в них все блоки, которые начинаются с //<< вн и заканчиваются //>>, если этих процедур нет, необходимо их создать.

Для обычного приложения (обычные формы)

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

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

13) Откройте в конфигураторе в меню: «Администрирование>Пользователи» и у текущего пользователя, под которым происходит интеграция подсистемы, добавьте права «(ВН) Администратор журнала регистрации», для того, чтобы в режиме предприятия после запуска этого пользователя можно было настроить наш журнал регистрации:

Важно! Если в конфигурации нет пользователей, то их необходимо их создать! Без пользователей подсистема не будет работать!

14) Последний пункт. Если ваша информационная база работает на основе библиотеки стандартных подсистем, она же БСП, то необходимо в параметрах запуска указать дополнительный параметр запуска:

«/С ЗапуститьОбновлениеИнформационнойБазы» (без кавычек). Это можно сделать как из конфигуратора (тогда первый запуск в режиме предприятия необходимо осуществить из конфигуратора), так и при запуске в режиме предприятия.

А) Запуск из конфигуратора.

В конфигураторе Меню > Сервис > Параметры вкладка Запуск 1С:Предприятие в поле «Параметры запуска» указать «/С ЗапуститьОбновлениеИнформационнойБазы». Пример:

Потом выполнить запуск конфигурации в режиме предприятия из конфигуратора нажав «Начать отладку» (или F5).

Б) Запуск в режиме предприятия без отладки.

Нажмите кнопку «Изменить», затем «Далее», «Далее» и на указанной как в скриншоте ниже странице измените дополнительные параметры запуска:

Настройка подсистемы в конфигураторе завершена. Запускайте конфигурацию в режиме предприятия.


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

ОбработкаПрерыванияПользователя()

Для прерывания выполнения программного кода, необходимо прописать вызов процедуры глобального контекста ОбработкаПрерыванияПользователя(). Эта процедура делает проверку нажатия сочетания клавиш Ctrl+Break. При нажатии пользователем этого сочетания клавиш, прерывается выполнение программного кода. Данная процедура не выводит окон для подтверждения прерывания. Процедура ОбработкаПрерыванияПользователя() может вызываться только в обработчиках, которые срабатывают при действиях пользователей. Таким образом, процедуру можно вызывать при нажатии на кнопку, но нельзя вызывать в таких событиях как ПриОткрытии() и т.д.

Обработка ожидания

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

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