for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Вопросы по 1С
  

Отлов ошибки в фоновом задании
Аспид
Автор

Сообщений: 3293
Откуда: Москва
Дата: 15.08.16 10:57:31
Решил создать отдельный топик)
Я запускаю фоновое задание (ФЗ)
Знаю его ИдентификаторЗадания.
Хотелось бы в случае ошибки, выдать юзеру сообщение.
Сложность в том, что клиента (Форма например, инициирующего ФЗ, может уже не быть.

Что понял, в результате изучения и экспериментов.
Использовать следует, как подсказали - ПодключитьОбработчикОжидания
Из хелпа видим
Цитата:
Доступность:
Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение(клиент).
Примечание:
Вызов обработчика ожидания продолжается пока форма не будет закрыта или пока не будет вызван метод формы ОтключитьОбработчикОжидания.


Вот тут и начинается мой гимор, и не понимание)
Делаю обработку, которая в ФЗ запускает нужные методы общего модуля.

Но обратиться то к обработке, могу только с серверной части.
А серверная часть, не может работать с собственной формой.
Запустить сразу форму обработки? Через ОткрытьФорму?
Ну тогда открывается форма. Причем совершенно не понятная для юзера)))

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

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

Думаю весь ответ где то здесь
pasha_usue
Вешать глобальный обработчик ожидания в модуле управляемого приложения. В нем держать массив всех запущенных регламентных заданий. Периодически этот массив оббегать с МойМассив[Счетчик].ПолучитьСообщенияПользователю().
Лучше всего создать свой общий модуль. И в нём всё держать. А в модуле управляемого приложения добавить только одну строчку инициализации структур этого модуля.

Но я не до конца понимаю.
При запуске приложения, в методе ПриНачалеРаботыСистемы запускаю какой то свой общий модуль?

Ок. Предположим МодульФоновыхЗаданий

А в нем что, как?

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

В общем каша в голове)
Помогите, чем можете)))


------------------
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
ssa

Сообщений: 12248
Откуда: Москва
Дата: 15.08.16 12:28:03
Аспид
Хотелось бы в случае ошибки, выдать юзеру сообщение.
Какому? Где в ФЗ нашел юзера?
Цитата:
Сложность в том, что клиента (Форма например, инициирующего ФЗ, может уже не быть.
И даже вообще могло не быть. ФЗ не обязаны запускаться только из формы.
Цитата:

Что понял, в результате изучения и экспериментов.
Использовать следует, как подсказали - ПодключитьОбработчикОжидания
Из хелпа видим
Цитата:
Доступность:
Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение(клиент).
Примечание:
Вызов обработчика ожидания продолжается пока форма не будет закрыта или пока не будет вызван метод формы ОтключитьОбработчикОжидания.


Вот тут и начинается мой гимор, и не понимание)
Делаю обработку, которая в ФЗ запускает нужные методы общего модуля.
В ФЗ? Или само ФЗ? Из обработки обращаешься к ФЗ?
Цитата:

Но обратиться то к обработке, могу только с серверной части.
Так К обработке или ИЗ обработки?
Цитата:
А серверная часть, не может работать с собственной формой.
И с несобственно тоже. Ибо форм на сервере нет никаких, ни собственнных, ни несобственных.
Цитата:
Запустить сразу форму обработки? Через ОткрытьФорму?
Какую? Зачем?
Цитата:
Ну тогда открывается форма. Причем совершенно не понятная для юзера)))
Разумеется.
Цитата:

Наверное стоит пояснить как я понимаю.
С клиента можно запустить код на севере и на клиенте, с сервера только серверный.
Именно.
Цитата:

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

Думаю весь ответ где то здесь
pasha_usue
Вешать глобальный обработчик ожидания в модуле управляемого приложения. В нем держать массив всех запущенных регламентных заданий. Периодически этот массив оббегать с МойМассив[Счетчик].ПолучитьСообщенияПользователю().
Лучше всего создать свой общий модуль. И в нём всё держать. А в модуле управляемого приложения добавить только одну строчку инициализации структур этого модуля.

Но я не до конца понимаю.
При запуске приложения, в методе ПриНачалеРаботыСистемы запускаю какой то свой общий модуль?

Ок. Предположим МодульФоновыхЗаданий

А в нем что, как?

Вообще, как я вижу задачу.
Мне нужен какой то общий клиентский модуль, который могу с клиента создать, и пусть он себе крутится.
А он уже все сделает, и если надо, запустит форму сообщения об ошибке.
Ну вот же, сам же выделил ПриНачалеРаботыСистемы.
ФЗ кладет данные в общедоступное место, например какой-нить РегистрСведений, а запущенный из ПриНачалеРаботыСистемы твой обработчик их читает и показывает пользователю. Как и написали ранее. И не надо никаких извращений.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
Аспид
Автор

Сообщений: 3293
Откуда: Москва
Дата: 15.08.16 12:51:06
ssa
Ну вот же, сам же выделил ПриНачалеРаботыСистемы.
ФЗ кладет данные в общедоступное место, например какой-нить РегистрСведений, а запущенный из ПриНачалеРаботыСистемы твой обработчик их читает и показывает пользователю. Как и написали ранее. И не надо никаких извращений.

Но так и осталось непонятным.
Предположим _АсинхронныеОбработчики запускаю из ПриНачалеРаботыСистемы.
(Как это сделать отдельный вопрос , но надеюсь разберусь)

Так _АсинхронныеОбработчики это мой общий модуль?
В его свойствах ставлю галочки Клиент и сервер.
Для проверки, запускаю его из внешней обработки.

А тут у меня чудеса начинаются(((
  
  &НаКлиенте  
  Процедура ВызовФормы() Экспорт  
  	  
  	ИдентификаторЗадания = _АсинхронныеОбработчики.ВыполнитьНаСервере();  
  	ПодключитьОбработчикОжидания("ОжиданиеЗавершения",0.1,Истина);     	  
  	  
  КонецПроцедуры  
    
  &НаСервере  
  Функция ВыполнитьНаСервере() Экспорт  
    
      МПараметры = Новый Массив;  
      МПараметры.Добавить(100);  
        
      ФоновоеЗадание	=	ФоновыеЗадания.Выполнить("_АсинхронныеОбработчики.НашаДлительнаяОперация",   
          МПараметры, Новый УникальныйИдентификатор, "Мой Пример асинхронной концепции программирования");      
  		  
  	Возврат ФоновоеЗадание.УникальныйИдентификатор;  
    
  КонецФункции

Синтаксических ошибок нет. Но в рантайме, ругается

{ОбщийМодуль._АсинхронныеОбработчики.Модуль(25)}: Метод объекта не обнаружен (ВыполнитьНаСервере)
ИдентификаторЗадания = _АсинхронныеОбработчики.ВыполнитьНаСервере();

До ожидания и не доходит. Что не так?(


------------------
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
pasha_usue

Сообщений: 3115
Откуда: Е-бург
Дата: 15.08.16 13:01:15
Не надо делать клиент-серверные модули. Там очень много нюансов, которые надо знать. Отдельно клиентский модуль, отдельно серверный модуль. Клиентскому разрешать вызов сервера, раз уж есть такая необходимость.
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
ssa

Сообщений: 12248
Откуда: Москва
Дата: 15.08.16 13:03:18
Аспид
А тут у меня чудеса начинаются(((
  
  &НаКлиенте  
  Процедура ВызовФормы() Экспорт  
  	  
  	ИдентификаторЗадания = _АсинхронныеОбработчики.ВыполнитьНаСервере();  
  	ПодключитьОбработчикОжидания("ОжиданиеЗавершения",0.1,Истина);     	  
  	  
  КонецПроцедуры  
    
  &НаСервере  
  Функция ВыполнитьНаСервере() Экспорт  
    
      МПараметры = Новый Массив;  
      МПараметры.Добавить(100);  
        
      ФоновоеЗадание	=	ФоновыеЗадания.Выполнить("_АсинхронныеОбработчики.НашаДлительнаяОперация",   
          МПараметры, Новый УникальныйИдентификатор, "Мой Пример асинхронной концепции программирования");      
  		  
  	Возврат ФоновоеЗадание.УникальныйИдентификатор;  
    
  КонецФункции

Синтаксических ошибок нет. Но в рантайме, ругается

{ОбщийМодуль._АсинхронныеОбработчики.Модуль(25)}: Метод объекта не обнаружен (ВыполнитьНаСервере)
ИдентификаторЗадания = _АсинхронныеОбработчики.ВыполнитьНаСервере();

До ожидания и не доходит. Что не так?(
Всё не так. ФЗ - это ФЗ и ЗАПУСК его никакого отношения к твоим обработкам не имеет. Вообще! НИКАКОГО. ФЗ запускается неизвестно где, когда и кем и как.
Твой обработчик ожидания только читает записанные ФЗ данные и записанные их пользователю. НИКАКХ ФЗ она запускать не должна.
Это как с веб-сайтом. Для чтения данных с сайта ты же не запускаешь что-то создающее информацию на нужном тебе сайте?


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
Аспид
Автор

Сообщений: 3293
Откуда: Москва
Дата: 15.08.16 13:59:26
Некоторое просветление, по разделению кода появилось. Но только некоторое)))

По Подсказке Паши, воспроизвел пример с infostart.ru
Т.е. там есть
&НаКлиенте
Процедура ВыполнитьДлительнуюОперациюАсинхронно(Команда)
Объект.ИдентификаторЗадания = ВыполнитьДлительнуюОперациюАсинхронноНаСервере(); - запуск ФЗ
ПодключитьОбработчикОжидания("ОжиданиеЗавершения",0.1,Истина);

&НаСервере
Функция ВыполнитьДлительнуюОперациюАсинхронноНаСервере()

Добавил туда
&НаКлиенте
Процедура ОжиданиеЗавершения() Экспорт
и
&НаСервере
Функция ОжиданиеНаСервере(ИдентификаторЗадания)

Все работает.

Теперь хочу что бы ожидание, работало независимо от запустившей ФЗ формы.

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

В принципе понимаю, что модуль ожидания, может крутиться постоянно, и опрашивать ФЗ
Например:
  
  &НаСервере  
  Функция ОжиданиеНаСервере() Экспорт  
    
  	ИдентификаторЗадания	=	Неопределено;  
  	фз= ФоновыеЗадания.ПолучитьФоновыеЗадания();  
  	  
   	Для Каждого ЭлементМассива из фз Цикл  
  		Если ЭлементМассива.Наименование =  "Мой Пример асинхронной концепции программирования" Тогда  
  		    ИдентификаторЗадания =   ЭлементМассива.УникальныйИдентификатор ;  
  			  
  			Прервать;  
  		  
  		КонецЕсли;   
  			  
      КонецЦикла;	  
  	  
  	СостФЗ	=	Ложь;  
  	ФоновоеЗадание	=	ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);  
  ...

Это часть работает на сервере.
Но вызываться должна с клиента. Который и хочется создать.
  
  &НаКлиенте  
  Процедура ОжиданиеЗавершения() Экспорт  
  	ФоновоеЗадание	=	_АсинхронныеОбработчики.ОжиданиеНаСервере();  
  		  
  	Если ФоновоеЗадание Тогда  
  		ПодключитьОбработчикОжидания("ОжиданиеЗавершения",1,Истина);  
  		Сообщить("Расчет идет!");  
    
  	Иначе  
  	  
  		Сообщить("Расчет окончен!");  
    
  	КонецЕсли;  
  	  
  КонецПроцедуры

Сообщить там, для отладки.
Вот не могу такой модуль создать, что бы можно было его вызвать откуда хошь. (С клиента)


------------------




Исправлено: Аспид, 15.08.16 14:06
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
pasha_usue

Сообщений: 3115
Откуда: Е-бург
Дата: 15.08.16 14:49:49
Без комментариев разберётесь?

МодульУправляемогоПриложения, ОбщийМодуль.АсинхронныеОбработчикиСервер, Обработка.ЗапускПродолжительногоЗадания
Ratings: 0 negative/1 positive

Re: Отлов ошибки в фоновом задании
Аспид
Автор

Сообщений: 3293
Откуда: Москва
Дата: 15.08.16 15:05:04
Просто ОГРОМНОЕ СПАСИБО!
Разбераюсь!
Что классно, только нужное мне)


------------------
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
pasha_usue

Сообщений: 3115
Откуда: Е-бург
Дата: 15.08.16 15:18:10
Аспид
Просто ОГРОМНОЕ СПАСИБО!
Разбераюсь!
Что классно, только нужное мне)
Оно на уровне сеанса того пользователя, под которым запущено задание. Если сеанс закрыть, то всё уйдет в никуда. Поэтому, лучше логгировать ошибки в какой-нибудь дополнительный регистр сведений или в журнал регистрации.
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
Аспид
Автор

Сообщений: 3293
Откуда: Москва
Дата: 15.08.16 15:55:38
pasha_usue
Оно на уровне сеанса того пользователя, под которым запущено задание. Если сеанс закрыть, то всё уйдет в никуда. Поэтому, лучше логгировать ошибки в какой-нибудь дополнительный регистр сведений или в журнал регистрации.

Ну может когда и доберусь) Пока и с этим супер.
Сразу все ясно стало.

Задумался, а что же не получалось.
Ты сразу говорил, что в глобальном модуле ожидание делать.
Но я даж не знал, с какого боку к этому подлезть. И все пытался, в каких то своих, для отладки модулях сделать.
Теперь все встало. И Пашет)
даже и вопросов нет)
С меня пиво
(Уж скока я тебе задолжал...))))


------------------
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
spinz

Сообщений: 5263
Дата: 16.08.16 07:09:08
pasha_usue
Поэтому, лучше логгировать ошибки в какой-нибудь дополнительный регистр сведений или в журнал регистрации.
В ЖР предпочтительней - все же лучше не засирать БД лишний раз, если можно не засирать))
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
pasha_usue

Сообщений: 3115
Откуда: Е-бург
Дата: 16.08.16 07:30:24
spinz
pasha_usue
Поэтому, лучше логгировать ошибки в какой-нибудь дополнительный регистр сведений или в журнал регистрации.
В ЖР предпочтительней - все же лучше не засирать БД лишний раз, если можно не засирать))
У меня здесь прямо противоположная точка зрения. В ЖР срут все, искать там потом что-нибудь иногда заколебешься. А свой регистр болтается себе и не мешает особо. Не надо - грохнул.
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
spinz

Сообщений: 5263
Дата: 16.08.16 07:40:23
pasha_usue
В ЖР срут все, искать там потом что-нибудь иногда заколебешься.
Да, это минус, но терпимый.

Я частенько лог для каких-то отладочных нужд вообще пишу в текстовый файл.
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
Аспид
Автор

Сообщений: 3293
Откуда: Москва
Дата: 16.08.16 10:00:07
Я как то заглнул в ЖР. Там и вправду черт ногу сломит)

Но это пока опущу. Надо созреть. Да и проблем с этим не вижу)

Спасибо Паша, дал отличный проводник по пути)
Я убрал вызов ПодключитьОбработчикОжидания из глобального модуля.
Вызывается из обработки

ПодключитьОбработчикОжидания("ПроверкаВыводаФоновыхЗаданий", глИнтервал,Истина);

И в ПроверкаВыводаФоновыхЗаданий
  
  	Если мСписокФоновыхЗаданий.Количество()>0 Тогда  
  		ПодключитьОбработчикОжидания("ПроверкаВыводаФоновыхЗаданий", глИнтервал,Истина);	  
  	  
  	КонецЕсли;

Теперь как бы, все под моим управлением, и попусту не будет срабатывать.
Без подсказки, еще бы долго к этому шел (потому как с другой стороны заходил).

Я идеологически нигде ничего не... ? )))


------------------
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
pasha_usue

Сообщений: 3115
Откуда: Е-бург
Дата: 16.08.16 10:18:16
Ааа... Понял ход конём. Вообще, вызов обработчика ожидания из самого себя это чревато переполнением стека. Так что лучше третий параметр оставить ложь, а делать ОтключитьОбработчикОжидания. Зачем вам случайное падение серверного процесса?
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
spinz

Сообщений: 5263
Дата: 16.08.16 10:30:27
pasha_usue
Вообще, вызов обработчика ожидания из самого себя это чревато переполнением стека. Так что лучше третий параметр оставить ложь, а делать ОтключитьОбработчикОжидания.
Здесь же нет вызова самого себя, только повторное подключение обработчика. И третий параметр должен быть Истиной в любом случае, если интервал < 1
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
pasha_usue

Сообщений: 3115
Откуда: Е-бург
Дата: 16.08.16 10:38:24
spinz
pasha_usue
Вообще, вызов обработчика ожидания из самого себя это чревато переполнением стека. Так что лучше третий параметр оставить ложь, а делать ОтключитьОбработчикОжидания.
Здесь же нет вызова самого себя, только повторное подключение обработчика. И третий параметр должен быть Истиной в любом случае, если интервал < 1
В том то и дело, что третий параметр (истина) даёт разовый однократный вызов обработчика. А Владимир эмулирует периодический вызов обработчика тем, что повторно его вызывает в "ПроверкаВыводаФоновыхЗаданий" и тоже однократно. Эта ситуация много раз рассматривалась на ИТСах. Такая конструкция бомбит в стек с периодичностью в глИнтервал. Программных ограничений по размеру стека у платформы нет. Но 1С рекомендует ограничивать глубину таких алгоритмов на десятки, максимум сотни итераций.

В общем. Не надо так делать. Не рекомендуется. Работает, конечно. Но производитель не гарантирует устойчивой работы.
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
spinz

Сообщений: 5263
Дата: 16.08.16 10:43:53
pasha_usue
Владимир эмулирует периодический вызов обработчика тем, что повторно его вызывает в "ПроверкаВыводаФоновыхЗаданий" и тоже однократно.
Да? Ну я в тред не вчитывался, офк))
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
Аспид
Автор

Сообщений: 3293
Откуда: Москва
Дата: 16.08.16 12:34:23
pasha_usue
В том то и дело, что третий параметр (истина) даёт разовый однократный вызов обработчика. А Владимир эмулирует периодический вызов обработчика тем, что повторно его вызывает в "ПроверкаВыводаФоновыхЗаданий" и тоже однократно. Эта ситуация много раз рассматривалась на ИТСах. Такая конструкция бомбит в стек с периодичностью в глИнтервал. Программных ограничений по размеру стека у платформы нет. Но 1С рекомендует ограничивать глубину таких алгоритмов на десятки, максимум сотни итераций.

В общем. Не надо так делать. Не рекомендуется. Работает, конечно. Но производитель не гарантирует устойчивой работы.

Предупреждению внял, и сделаю так.
Но в теории не ясно.
Ведь засылаю в стек ПроверкаВыводаФоновыхЗаданий
Он сработав, выбрал себя из стека. И снова записал если надо. итого, в стеке всегда только один вызов.
Или тут что то другое. Какие то механизмы 1С... это уже чисто теоретически интересно)))

Сделаю конечно по совету Паши. разницы то в коде нет.
Вместо перезапуска, остановка.


------------------
Ratings: 0 negative/0 positive

Re: Отлов ошибки в фоновом задании
pasha_usue

Сообщений: 3115
Откуда: Е-бург
Дата: 16.08.16 13:10:24
В теории мне тоже до конца не ясно. Принял как данность. Может, там свой стек. Может еще что-то.
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 (Гостей: 23)

20.06.2019 10:43:07 exec: 0.17
Mem: 1.437 Mb

© 2000-2019 Fox Club 
Яндекс.Метрика