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

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

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


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

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

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

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

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

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

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

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

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

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


------------------
Ratings: 0 negative/0 positive
Re: Отлов ошибки в фоновом задании
ssa

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

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


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

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

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

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

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

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

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

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

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


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Отлов ошибки в фоновом задании
Аспид
Автор

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

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

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

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

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

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

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


------------------
Ratings: 0 negative/0 positive
Re: Отлов ошибки в фоновом задании
pasha_usue

Сообщений: 3647
Откуда: Е-бург
Дата регистрации: 06.10.2006
Не надо делать клиент-серверные модули. Там очень много нюансов, которые надо знать. Отдельно клиентский модуль, отдельно серверный модуль. Клиентскому разрешать вызов сервера, раз уж есть такая необходимость.
Ratings: 0 negative/0 positive
Re: Отлов ошибки в фоновом задании
ssa

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

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

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

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


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Отлов ошибки в фоновом задании
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Некоторое просветление, по разделению кода появилось. Но только некоторое)))

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

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

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

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

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

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

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

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

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


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




Исправлено 2 раз(а). Последнее : Аспид, 15.08.16 14:06
Ratings: 0 negative/0 positive
Re: Отлов ошибки в фоновом задании
pasha_usue

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

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

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


------------------
Ratings: 0 negative/0 positive
Re: Отлов ошибки в фоновом задании
pasha_usue

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

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

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

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


------------------
Ratings: 0 negative/0 positive
Re: Отлов ошибки в фоновом задании
spinz

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

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

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

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

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

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

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

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

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

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

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


------------------
Ratings: 0 negative/0 positive
Re: Отлов ошибки в фоновом задании
pasha_usue

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

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

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

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

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

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

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

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

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


------------------
Ratings: 0 negative/0 positive
Re: Отлов ошибки в фоновом задании
pasha_usue

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


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

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

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