1. SSSSlim 30.06.20 15:49 Сейчас в теме

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

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

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

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

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

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

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

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

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

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

Подскажите, почему такая странное поведение 1с при первом случае и как можно решить эту задачу?
Ответы
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
4. Xershi 977 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 14 02.07.20 09:51 Сейчас в теме
Сделайте как посоветовали выше. Не вызывайте ни каких процедур из обработки. Просто откройте её, а уже в самой форме обработке ПриСозданиеНаСрвере и ПриОткрытие сделайте все необходимые манипуляции.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Программист 1С
Санкт-Петербург
зарплата до 150 000 руб.
Полный день

Программист 1С
Екатеринбург
зарплата от 80 000 руб. до 130 000 руб.
Полный день

Ведущий программист 1С
Москва
зарплата от 150 000 руб.
Полный день

Ведущий программист 1С (УТ 11)
Москва
зарплата до 200 000 руб.
Полный день