Как сделать выполнение процедуры через время 1с
Перейти к содержимому

Как сделать выполнение процедуры через время 1с

  • автор:

Как сделать выполнение процедуры через время 1с

Интересный вопрос, собственно.
К примеру мне надо запустить завершение работы системы, для всех пользователей в 12.00?
ОбработкаОжидания запускает данную процедуру с заданным интервалом, а как не с интервалом, а на заданное время?

Проверить в обработке ожидания текущее время.
___
Искренне Ваш, Львенок.

ОбработкаОжидания во втором параметре стоит время в секундах, а не проверка, хотя может что нить недокументированного?

//——-ГлобальныйМодуль начало
Перем глСделано;

//——-ГлобальныйМодуль серидина, где все процедуры
Процедура глСделатьТогдаТо()
Ч=0;М=0;С=0;
ТекущееВремя(Ч,М,С);
Время=Ч+М*60+С*3600;
Если (Время>=Константа.ВремяХ) И (Время <=Константа.ВремяХ+300) И (Сделано=0) Тогда
Сделано=1;
глСделатоТоТо();//Здесь делаем то, что нужно сделать
КонецЕсли;
КонецПроцедуры

//——-ГлобальныйМодуль самый конец, после всех процедур
ОбработкаОжидания(«глСделатьТогдаТо()»,5);
глСделано=0;//Еще ничего не сделано

Есть константа ВремяХ, которая задает то значение времени (в секундах прошедших с начала суток) в которое надо что-то сделать. Процедура глСделатьТогдаТо() выполняется каждые пять секунд и проверяет не настало ли ВремяХ, если время уже настало то делает то, что нужно. Если в течении пяти минут после наступления времени «Х» 1С будет сильно занята (формировать какой-то сложный отчет), то «Что-то» может и не выполнится. Если в течении пяти минут после наступления времени «Х» пользователь выйдет из 1С и снова зайдет в нее «Что-то» может выполниться более одного раза.
Примерно так.
___
Искренне Ваш, Львенок.

Ошибочка: «Если (Время>=Константа.ВремяХ) И (Время <=Константа.ВремяХ+300) И (Сделано=0) Тогда
Сделано=1; »
Заменить Сделано на глСделано;
___
Искренне ваш, Львенок.

1С 8.x : Периодическое выполнение кода с заданным интервалом времени — ОбработкаОжидания()

Распечатать

Параметры:
(обязательный) Тип: Строка. Имя процедуры, подключаемой в качестве обработчика ожидания.
(обязательный) Тип: Число. Интервал времени в секундах с точностью до 1/10 секунды, через который будет осуществляться вызов процедуры (положительное число).Если указано значение меньше 1, то значение третьего параметра должно быть равно Истина.
(необязательный) Тип: Булево. Признак однократного выполнения обработчика ожидания.
Истина — указанный обработчик ожидания будет выполнен один раз. Значение по умолчанию: Ложь
Описание: Подключает указанную процедуру в качестве обработчика ожидания. Процедура будет вызываться в период ожидания системы каждый раз по истечению указанного интервала времени.

Доступность:
Тонкий клиент, веб-клиент, толстый клиент.

Примечание:
Вызов обработчика ожидания продолжается пока форма не будет закрыта или пока не будет вызван метод формы ОтключитьОбработчикОжидания. Код 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) 

для прекращения обработки ожидания (естественно, после выполнения нужных условий).
Источник lessons1c
:

Разместил: E_Migachev Версии: | 7.x | 8.x | 8.2 УП | Дата: 30.10.2012 Прочитано: 148383

Распечатать

Возможно, вас также заинтересует

Похожие FAQ

10060 (0x0000274C): Попытка установить соединение была безуспешной 24
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает 🙂 И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1C медленно работает по сети с базой на SQL Server 22
Данное обстоятельство может быть обусловлено многими причинами. Одна из них — неоптимальная настройка MS SQL . Перечислим неоптимальности в настройке: 1) Неправильно указанный сетевой протокол, используемый для взаимодействия 1С с SQL Server. П 1С Предприятие что это? 12
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » — конкретный продукт, который выпускает компания 1С . Что такое Посмотреть все результаты поиска похожих

Еще в этой же категории

Полнотекстовый поиск в 1С (что это и пример использования) 27
Полнотекстовый поиск — позволит найти текстовую информацию, размещенную практически в любом месте используемой конфигурации. При этом искать нужные данные можно либо по всей конфигурации в целом, либо сузив область поиска до нескольких объектов Формат, функция форматирования значений 21
//Функция формирует удобное для чтения представление значений. // Примеры форматирования чисел ЗначФормат = Формат(123456.789, » ЧЦ=10; ЧДЦ=2″ ); // ЗначФормат = » 123 456,79″ ЗначФормат = Формат(123456.789, » ЧГ=0; ЧДЦ=2″ ); // Знач Обработчики событий при записи объектов. Зачем и что за чем? 19
Программисту, имеющего немного опыта на платформе 1С 8.2, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта, а-а-а-а-аааа. Именно такое сложное чувство непонимания МоментВремени, получение остатков до и после проведения 12
» Момент времени» — виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ССЫЛКУ НА ДОКУМЕНТ) В 7.7 было понятие ПозицияДокумента, а в 8.x Момент времени Для получения Остатков, Движений: М УстановитьСсылкуНового 12
Установить ссылку нового это специальный механизм программиста, который позволяет присваивать новому объекту нужную ссылку. В основном это задача обмена, во многих типовых обменах используется синхронизация по UID объекта. Рассмотрим этот метод на к Посмотреть все в категории Встроенные Функции

Длительные операции на сервере

Область применения: управляемое приложение.

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

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

В противном случае такие вызовы могут привести к потере работоспособности приложения или затруднению работы с ним:

  • браузер может предложить прекратить длительно выполняющийся сценарий, после чего приложение станет неработоспособным;
  • веб сервер может прервать длительное обращение к серверу 1С:Предприятия и вернуть ошибку 504 (шлюз не отвечает);
  • в случае длительного выполнения операции, у пользователя нет возможности отменить ее.

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


    Код, выполняющий длительную обработку данных, располагается в модуле менеджера объекта* или в общем модуле. Результат своей работы он помещает во временное хранилище;

а для прочих мест – выводится блокирующая форма ( РежимОткрытияОкна = БлокироватьОкноВладельца ), на которой размещена декорация с анимированной картинкой и кнопка «Отмена» :

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

    • разработаны без использования СКД или с использованием СКД, но с переопределенной процедурой формирования отчета (переопределен обработчик кнопки «Сформировать» или в обработчике модуля отчета ПриКомпоновкеРезультата устанавливается СтандартнаяОбработка = Ложь ).
    • и формирование которых, как правило, занимает длительное время.

    Поведение таких отчетов должно быть максимально похожим на поведение отчетов на базе СКД, а именно:

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

    3. При использовании в конфигурации Библиотеки стандартных подсистем в распоряжении разработчика имеются вспомогательные функции и процедуры общих модулей ДлительныеОперации , ДлительныеОперацииКлиент , а также процедура УстановитьСостояниеПоляТабличногоДокумента общего модуля ОбщегоНазначенияКлиентСервер .

    Пример выполнения функции в фоновом задании при использовании в конфигурации Библиотеки стандартных подсистем. В модуле менеджера объекта размещена функция, которая выполняет поиск настроек и возвращает их:

    Функция ОпределитьНастройкиУчетнойЗаписи(АдресЭлектроннойПочты, Пароль) Экспорт
    .
    Возврат Настройки;
    КонецФункции

    В форме объекта выполняется вызов этой функции в фоновом задании в три этапа:
    1) запуск фонового задания на сервере,
    2) подключение обработчика завершения фонового задания на клиенте,
    3) обработка результата выполнения фонового задания.

    // 2. Подключение обработчика завершения фонового задания.
    ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
    Оповещение = Новый ОписаниеОповещения(«ПриЗавершенииПоискаНастроек», ЭтотОбъект);
    ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания);
    КонецПроцедуры

    // 3. Обработка результата выполнения фонового задания.
    &НаКлиенте
    Процедура ПриЗавершенииПоискаНастроек(Результат, ДополнительныеПараметры) Экспорт

    Если Результат = Неопределено Тогда // Пользователь отменил задание.
    Возврат;
    КонецЕсли;

    Если Результат.Статус = «Ошибка» Тогда
    ВызватьИсключение Результат.КраткоеПредставлениеОшибки;
    КонецЕсли;

    Настройки = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
    УдалитьИзВременногоХранилища(Результат.АдресРезультата);
    УстановитьНастройкиУчетнойЗаписи(Настройки);

    Методическая рекомендация (полезный совет)

    3.1. При каждом выполнении фонового задания его результат помещается во временное хранилище на время жизни формы:

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

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

    Настройки = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
    УдалитьИзВременногоХранилища(Результат.АдресРезультата); // Данные во временном хранилище больше не требуются.

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

    Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения,
    «Справочники.УчетныеЗаписиЭлектроннойПочты.ОпределитьНастройкиУчетнойЗаписи»,
    АдресЭлектроннойПочты, Пароль);
    КонецФункции

    4. Если в конфигурации реализуются алгоритмы, инициирующие запуск фоновых заданий или запись данных информационной базы без участия пользователя (например, регулярное обновление информации в открытой форме), то в них следует проверять, что в текущем сеансе не установлен монопольный режим. В противном случае, следует блокировать попытки выполнения таких действий. Например:

    Если МонопольныйРежим() Тогда
    Возврат;
    КонецЕсли;

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

    Обновление данных ИБ при первом интерактивном запуске программы после обновления конфигурации;
    Удаление объектов, помеченных на удаление;
    Выгрузка данных информационной базы в файл для перехода в сервис;

    Использования монопольного режима для снижения времени выполнения массовых операций по изменению данных;

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

    На время выполнения этого фонового задания следует блокировать весь интерфейс приложения, открывая форму ожидания завершения операции в режиме РежимОткрытияОкна = БлокироватьВесьИнтерфейс. Блокировать интерфейс приложения требуется потому, что на время выполнения задания полноценная работа пользователя с приложением уже невозможна:

    • Если пользователь(*) попытается записать какой-либо объект, это приведет к ошибке (из-за установленного монопольного режима);
    • В ряде случаев могут запускаться фоновые задания в качестве реакции на действия пользователя случае (при поиске в динамическом списке, при вводе по строке, формировании отчетов и пр.), которые также завершатся с ошибкой.
      Кроме того, на самой форме ожидания длительной операции не следует размещать элементы управления, которые могут приводить к запуску таких фоновых заданий. Например: поля ввода, динамические списки и отчеты.

    * Примечание: ошибки записи также возникают в тех случаях, когда объекты записываются программно, например, из обработчиков ожидания. В них также следует проверять монопольный режим согласно п.5.

    Запуск регламентных заданий

    Область применения: управляемое приложение, обычное приложение.

    Методическая рекомендация (полезный совет)

    1. Рекомендуется предоставлять пользователям альтернативную возможность по выполнению регламентных заданий вручную. Например, предлагать «по кнопке» выполнить обработку данных, обычно выполняемую регламентным заданием в фоне. Это вызвано тем соображением, что работа системы не должна зависеть от автоматического выполнения регламентных заданий. В частности:

    • выполнение регламентных заданий может быть осознанно выключено на кластере серверов 1С:Предприятия;
    • в отличие от клиент-серверного режима работы 1С:Предприятия версии 8.2 и ранее, в котором регламентные и фоновые задания выполняются на сервере, в файловом режиме отсутствовала возможность по их автоматическому выполнению.

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

    1.1. В случае если регламентное задание изменяет в системе некоторые данные , которые необходимы определенному бизнес-процессу или выводятся в конкретном «рабочем месте» (форме), то в таких «рабочих местах» дополнительно рекомендуется размещать команду для выполнения этого действия. Например:

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

    Такие рабочие места должны информировать пользователя о дате актуальности представленных данных и команду для их обновления или обработки (которая выполняет то же действие, что и регламентное задание). Команда должна быть доступна только пользователям с необходимыми для ее выполнения правами.

    Пример ручного запуска задания по очистке устаревших версий объектов:

    // Проверка, выполняется ли фоновое задание по очистке устаревших версий.
    Отбор = Новый Структура;
    Отбор.Вставить(«ИмяМетода», ИмяМетода);
    Отбор.Вставить(«Состояние», СостояниеФоновогоЗадания.Активно);
    ФоновыеЗаданияОчистки = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
    Если ФоновыеЗаданияОчистки.Количество() = 0 Тогда
    НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр(«ru = ‘Запуск вручную: %1′»), РегламентноеЗаданиеМетаданные.Синоним);
    ФоновыеЗадания.Выполнить(ИмяМетода. НаименованиеФоновогоЗадания);
    КонецЕсли;
    КонецПроцедуры

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

    • обновление и перестроение агрегатов;
    • установка периода рассчитанных итогов.

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

    В этом случае рекомендуется заводить отдельное рабочее место для выполнения таких регламентных заданий. При использовании в конфигурации Библиотеки стандартных подсистем такое рабочее место уже входит в состав подсистемы «Регламентные задания» (форма «Регламентные и фоновые задания»).

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

    Примеры регламентных заданий, которые не меняют данные в базе:

    • рассылка по почтовым адресатам информации об ошибках в журнале регистрации;
    • рассылка информации о новых/просроченных задачах;
    • периодический запуск внешних обработок для рассылки отчетов.

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

    2. Для администраторов информационных баз действует рекомендация: на период выполнения обновления ИБ блокировать работу регламентных заданий. Однако если обновление выполняет неподготовленный пользователь, в особенности, в файловом режиме работы, то рекомендуется дополнительно предусмотреть следующие меры:

    • в файловом режиме работы, при неудачной попытке установки монопольного режима для обновления данных ИБ предлагать автоматически блокировать работу регламентных заданий (перезапуск программы с ключом командной строки /AllowExecuteScheduledJobs -Off );
    • в начале кода обработчиков регламентных заданий проверять режим работы и прерывать работу регламентного задания с помощью вызова исключения, если обновление ИБ еще не завершено.

    При использовании в конфигурации Библиотеки стандартных подсистем первая рекомендация реализована в подсистеме «Обновление версии ИБ», а для выполнения второй предусмотрена процедура ПриНачалеВыполненияРегламентногоЗадания общего модуля ОбщегоНазначения , вызов которой необходимо размещать в начале кода обработчиков регламентных заданий.

    См. также

    • Настройка расписания регламентных заданий
    • Предопределенные регламентные задания
    • Ограничения на регламентные задания при работе в режиме сервиса

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

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