Вызов обработки в фоновом режиме при начале работы системы
Добрый день.
Возникла необходимость при начале работы системы запускать фоном одну обработку и получать результат.
Как я знаю, ПриНачалеРаботыСистемы() вызывается строго на клиенте, поэтому доступа к Обработке Объекту нет, поэтому здесь просто получаю форму обработки и запускаю процедуру из модуля формы этой обработки:
Далее в модуле формы этой обработки:
Как видно, запускается функция "ЗапуститьПарсинг()" из модуля объекта этой обработки в фоновом режиме. После отработки этой функции результат посылается в процедуру "ОбработатьРезультатПарсингаЧеков()", которая находится в модуле формы этой обработки.
Магия в том, что из 10 запусков, где то 7 происходят асинхронно, но вызов процедуры "ОбработатьРезультатПарсингаЧеков()" вызывается до окончания выполнения функции "ЗапуститьПарсинг()", соответственно Результат = Неопределено. В журнале регистрации это фоновое задание появляется и сразу завершается со статусом "Отмена", как будто его вручную завершили, при этом сразу идет завершение сеанса (1с не закрывается)
В остальных 3 случаях вызов функции происходит синхронно, т. е. интерфейс 1с виснет на все время её выполнения, но Результат в процедуре "ОбработатьРезультатПарсингаЧеков()" приходит верный.
------------------------------------------------
Пробовал 2 вариант - вызов из "ПриНачалеРаботыСистемы()" серверного модуля:
Как видно, управление передается в общий модуль "Серверный", в функцию "НачатьПарсингЧековСПочты()", и процедура обработки результата - "ОбработатьРезультатПарсингаЧеков()" все в том же модуле:
В этом случае всегда все отрабатывает корректно, в фоновом режиме и "Результат" всегда содержит данные, но такой способ мне не очень подходит, потому что:
1. не хочется создавать, по моему мнению, лишний общий модуль, хочется чтобы вся работа по этой задаче была в обработке "ПарсингЧековСПочты"
2. После получения результата, мне нужно задать вопрос пользователю, а это можно сделать только на клиенте, а в этом случае с сервера на клиент я уже не попаду.
Подскажите, почему такая странное поведение 1с при первом случае и как можно решить эту задачу?
Возникла необходимость при начале работы системы запускать фоном одну обработку и получать результат.
Как я знаю, ПриНачалеРаботыСистемы() вызывается строго на клиенте, поэтому доступа к Обработке Объекту нет, поэтому здесь просто получаю форму обработки и запускаю процедуру из модуля формы этой обработки:
&После("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
ПарсингЧековСПочтыФорма = ПолучитьФорму("Обработка.ПарсингЧековСПочты.Форма");
ПарсингЧековСПочтыФорма.НачатьПарсингНаКлиенте();
КонецПроцедуры
ПоказатьДалее в модуле формы этой обработки:
&НаКлиенте
Процедура НачатьПарсингНаКлиенте() Экспорт
ПарсингЧеков = НачатьПарсингЧековСПочты();
ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультатПарсингаЧеков", ЭтотОбъект);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
ДлительныеОперацииКлиент.ОжидатьЗавершение(ПарсингЧеков, ОповещениеОЗавершении, ПараметрыОжидания);
КонецПроцедуры
&НаСервере
Функция НачатьПарсингЧековСПочты() Экспорт
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор);
Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, "Обработка.ПарсингЧековСПочты.МодульОбъекта.ЗапуститьПарсинг");
КонецФункции
ПоказатьКак видно, запускается функция "ЗапуститьПарсинг()" из модуля объекта этой обработки в фоновом режиме. После отработки этой функции результат посылается в процедуру "ОбработатьРезультатПарсингаЧеков()", которая находится в модуле формы этой обработки.
Магия в том, что из 10 запусков, где то 7 происходят асинхронно, но вызов процедуры "ОбработатьРезультатПарсингаЧеков()" вызывается до окончания выполнения функции "ЗапуститьПарсинг()", соответственно Результат = Неопределено. В журнале регистрации это фоновое задание появляется и сразу завершается со статусом "Отмена", как будто его вручную завершили, при этом сразу идет завершение сеанса (1с не закрывается)
В остальных 3 случаях вызов функции происходит синхронно, т. е. интерфейс 1с виснет на все время её выполнения, но Результат в процедуре "ОбработатьРезультатПарсингаЧеков()" приходит верный.
------------------------------------------------
Пробовал 2 вариант - вызов из "ПриНачалеРаботыСистемы()" серверного модуля:
&После("ПриНачалеРаботыСистемы")
Процедура Расш1_ПриНачалеРаботыСистемы()
ПарсингЧеков = Серверный.НачатьПарсингЧековСПочты();
ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультатПарсингаЧеков", Серверный);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Неопределено);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
ДлительныеОперацииКлиент.ОжидатьЗавершение(ПарсингЧеков, ОповещениеОЗавершении, ПараметрыОжидания);
КонецПроцедуры
ПоказатьКак видно, управление передается в общий модуль "Серверный", в функцию "НачатьПарсингЧековСПочты()", и процедура обработки результата - "ОбработатьРезультатПарсингаЧеков()" все в том же модуле:
Функция НачатьПарсингЧековСПочты() Экспорт
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(Новый УникальныйИдентификатор);
Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, "Обработка.ПарсингЧековСПочты.МодульОбъекта.ЗапуститьПарсинг");
КонецФункции
Процедура ОбработатьРезультатПарсингаЧеков(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено ИЛИ НЕ Результат.Статус = "Выполнено" ИЛИ НЕ ЗначениеЗаполнено(Результат.АдресРезультата) Тогда
Возврат;
КонецЕсли;
КонецПроцедуры
ПоказатьВ этом случае всегда все отрабатывает корректно, в фоновом режиме и "Результат" всегда содержит данные, но такой способ мне не очень подходит, потому что:
1. не хочется создавать, по моему мнению, лишний общий модуль, хочется чтобы вся работа по этой задаче была в обработке "ПарсингЧековСПочты"
2. После получения результата, мне нужно задать вопрос пользователю, а это можно сделать только на клиенте, а в этом случае с сервера на клиент я уже не попаду.
Подскажите, почему такая странное поведение 1с при первом случае и как можно решить эту задачу?
По теме из базы знаний
- Опыт разработки скриптов для автоматизации работы в конфигураторе
- Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов
- Пара советов по поиску работы
- Тонкости и подводные камни работы типового модуля интеграции Битрикс24 и 1С
- Эффективное управление фоновыми заданиями и коммуникация сеансов сервера с Фоном с помощью Структуры обмена (ноу-хау) + Бонус: Альтернативный вариант через Хранилище настроек
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
вызовите с клиента серверный модуль, который вернет вам в клиента результат
вы на результат посмотрите и спросите пользователя (или не спросите)
обработку лучше поместить в дополнительные, тогда можно через адресное хранилище будет вызвать для каждого нового сеанса свой экземпляр обработки, а не одну и туже форму дергать для всех
тогда каждый пользователь, открыв 1С увидит свой независимый результат
вы на результат посмотрите и спросите пользователя (или не спросите)
обработку лучше поместить в дополнительные, тогда можно через адресное хранилище будет вызвать для каждого нового сеанса свой экземпляр обработки, а не одну и туже форму дергать для всех
тогда каждый пользователь, открыв 1С увидит свой независимый результат
Во втором варианте я так и делаю, с разницей что результат возвращаю в серверный модуль через ОписаниеОповещения, а не в клиента. Как вернуть в клиента, какие параметры нужны вместо "Серверный" и "Неопределено"?
Работает только если создавать еще один общий модуль - клиентский. И делать так:
Что я делаю не так? Или тут по другому нельзя (без создания этих не нужных общих модулей и т.д.)?
ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультатПарсингаЧеков", Серверный);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Неопределено);
Работает только если создавать еще один общий модуль - клиентский. И делать так:
ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьРезультатПарсингаЧеков", Клиентский);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(Неопределено);
Что я делаю не так? Или тут по другому нельзя (без создания этих не нужных общих модулей и т.д.)?
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)