Вызов обработки в фоновом режиме при начале работы системы

1. SSSSlim 30.06.20 15:49 Сейчас в теме
Добрый день.
Возникла необходимость при начале работы системы запускать фоном одну обработку и получать результат.
Как я знаю, ПриНачалеРаботыСистемы() вызывается строго на клиенте, поэтому доступа к Обработке Объекту нет, поэтому здесь просто получаю форму обработки и запускаю процедуру из модуля формы этой обработки:
&После("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
	
	ПарсингЧековСПочтыФорма = ПолучитьФорму("Обработка.ПарсингЧековСПочты.Форма");
	ПарсингЧековСПочтыФорма.НачатьПарсингНаКлиенте();
	
КонецПроцедуры
Показать

Далее в модуле формы этой обработки:
&НаКлиенте
Процедура НачатьПарсингНаКлиенте() Экспорт 
	
	ПарсингЧеков = НачатьПарсингЧековСПочты();
	ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультатПарсингаЧеков", ЭтотОбъект);
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	ДлительныеОперацииКлиент.ОжидатьЗавершение(ПарсингЧеков, ОповещениеОЗавершении, ПараметрыОжидания);
	
КонецПроцедуры

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

Как видно, запускается функция "ЗапуститьПарсинг()" из модуля объекта этой обработки в фоновом режиме. После отработки этой функции результат посылается в процедуру "ОбработатьРезультатПарсингаЧеков()", которая находится в модуле формы этой обработки.
Магия в том, что из 10 запусков, где то 7 происходят асинхронно, но вызов процедуры "ОбработатьРезультатПарсингаЧеков()" вызывается до окончания выполнения функции "ЗапуститьПарсинг()", соответственно Результат = Неопределено. В журнале регистрации это фоновое задание появляется и сразу завершается со статусом "Отмена", как будто его вручную завершили, при этом сразу идет завершение сеанса (1с не закрывается)

В остальных 3 случаях вызов функции происходит синхронно, т. е. интерфейс 1с виснет на все время её выполнения, но Результат в процедуре "ОбработатьРезультатПарсингаЧеков()" приходит верный.

------------------------------------------------
Пробовал 2 вариант - вызов из "ПриНачалеРаботыСистемы()" серверного модуля:
&После("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
	
	ПарсингЧеков = Серверный.НачатьПарсингЧековСПочты();
	ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультатПарсингаЧеков", Серверный);
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Неопределено);
	ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	ДлительныеОперацииКлиент.ОжидатьЗавершение(ПарсингЧеков, ОповещениеОЗавершении, ПараметрыОжидания);
	
КонецПроцедуры
Показать

Как видно, управление передается в общий модуль "Серверный", в функцию "НачатьПарсингЧековСПочты()", и процедура обработки результата - "ОбработатьРезультатПарсингаЧеков()" все в том же модуле:
Функция НачатьПарсингЧековСПочты() Экспорт
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(Новый УникальныйИдентификатор);
	Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, "Обработка.ПарсингЧековСПочты.МодульОбъекта.ЗапуститьПарсинг");
	
КонецФункции

Процедура ОбработатьРезультатПарсингаЧеков(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено ИЛИ НЕ Результат.Статус = "Выполнено" ИЛИ НЕ ЗначениеЗаполнено(Результат.АдресРезультата) Тогда
		Возврат;
	КонецЕсли;
		
КонецПроцедуры 
Показать

В этом случае всегда все отрабатывает корректно, в фоновом режиме и "Результат" всегда содержит данные, но такой способ мне не очень подходит, потому что:
1. не хочется создавать, по моему мнению, лишний общий модуль, хочется чтобы вся работа по этой задаче была в обработке "ПарсингЧековСПочты"
2. После получения результата, мне нужно задать вопрос пользователю, а это можно сделать только на клиенте, а в этом случае с сервера на клиент я уже не попаду.

Подскажите, почему такая странное поведение 1с при первом случае и как можно решить эту задачу?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. Xershi 1484 30.06.20 17:41 Сейчас в теме
(1) проще всего поместить обработку на рабочий стол и при открытии он запустит то что вам нужно.
Fox-trot; oleg-x; +2 Ответить
2. VictorRGB2 13 30.06.20 16:41 Сейчас в теме
вызовите с клиента серверный модуль, который вернет вам в клиента результат
вы на результат посмотрите и спросите пользователя (или не спросите)

обработку лучше поместить в дополнительные, тогда можно через адресное хранилище будет вызвать для каждого нового сеанса свой экземпляр обработки, а не одну и туже форму дергать для всех
тогда каждый пользователь, открыв 1С увидит свой независимый результат
3. SSSSlim 30.06.20 17:31 Сейчас в теме
Во втором варианте я так и делаю, с разницей что результат возвращаю в серверный модуль через ОписаниеОповещения, а не в клиента. Как вернуть в клиента, какие параметры нужны вместо "Серверный" и "Неопределено"?
ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультатПарсингаЧеков", Серверный);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Неопределено);


Работает только если создавать еще один общий модуль - клиентский. И делать так:
ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультатПарсингаЧеков", Клиентский);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Неопределено);


Что я делаю не так? Или тут по другому нельзя (без создания этих не нужных общих модулей и т.д.)?
5. oleg-x 26 02.07.20 09:51 Сейчас в теме
Сделайте как посоветовали выше. Не вызывайте ни каких процедур из обработки. Просто откройте её, а уже в самой форме обработке ПриСозданиеНаСрвере и ПриОткрытие сделайте все необходимые манипуляции.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот