Наиболее правильный и удобный вариант организации оповещения о состоянии выполнения на сервере

1. ToTMoM 13.09.16 14:31 Сейчас в теме
Собственно сабж, подскажите пожалуйста как?

Пробовал и обработки ожидания и другие варианты, такое себе, подскажите как лучше и правильнее организовать оповещения пользователя и прерывание процесса по желанию пользователя? Основная концепция в тек. варианте 1С какова будет?

Т.е. сейчас есть функция, которая передает управление на сервер, выполняет запрос и потом обходами и циклами обрабатывает всякие данные. Мне нужно всего лишь теперь иметь возможность оповещать пользователя и прервать выполнение если потребуется , но чет варианты какие я пробую - не дают нужного результата :-(
EugeneSemyonov; +1 Ответить
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Boneman 298 13.09.16 14:42 Сейчас в теме
(1) ToTMoM, гы...
вылкам то зе world of управляемых приложений )))))
полноценно с прерываниями и оповещениями, придется заморачиваться с фоновыми заданиями, то бишь асинхронный метод.
Старые добрые методы, типа ОбработкаПрерыванияПользователя() - уже не проканают. )))
3. ToTMoM 13.09.16 15:15 Сейчас в теме
(2) Boneman, Гы, ну ок. Поставлю вопрос по-другому:
Есть гипотетический код:

Процедура ВыполнитьДействие()	
	ВыполнитьДействиеНаСервере();	
КонецПроцедуры

&НаСервере
Процедура ВыполнитьДействиеНаСервере()
	//Получаем все данные...
	//...
	//Обрабатываем данные
	
	Для Индекс = 1 По КолвоОбрабатываемыхЭлементов Цикл
		ОбрабатываемыйОбъект = МассивОбрабатываемыхЭлементов.Получить(Индекс);
		ИзменитьДоНеузнаваемости(ОбрабатываемыйОбъект);
		ОбрабатываемыйОбъект.Записать();
	КонецЦикла;
	
КонецПроцедуры

Показать


Теперь хочу оповещать клиента о состоянии процесса. Состояние может содержать Факт обработки/Номер в массиве/Ссылку/Наименование объекта, который был обработан. Оповещение пользователя о состоянии может быть после каждого объекта, периодическая по времени проверка либо по желанию(нажатию) пользователя. Также иметь возможность прерывать обработку (=передать как-то и куда-то данные о желании прервать), и с возможностью продолжения с предыдущего места.

Вот как надо наш гипотетический код изменить, чтобы такие условия выполнялись?)
При этом надо учитывать, что миллиард вызовов с сервера на клиент - тоже ересь, надо как-то аккуратнее это делать, БезКонтекстов и т.п.
EugeneSemyonov; +1 Ответить
6. alex-l19041 8 13.09.16 15:22 Сейчас в теме
7. Boneman 298 13.09.16 16:10 Сейчас в теме
(3) ToTMoM, только фоновое задание.
Оповестить вот так вот просто, тоже не получится.
Процедура уйдет на сервер, и комп зависнет, пока оно там все не выполнится..и даже если там накапливать сообщения, или использовать регистры сведений...все равно не прокатит, ибо выплюнет оно все это пользователю в самом конце, когда уже все свершится.

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

в (4) тебе посоветовали правильную публикацию, я с нее тоже начинал когда разбирался, там для УТ-шки кажется было сделано, и просто для понимания.

ну и плюсом к (6) тоже
http://infostart.ru/public/274721/
19. EugeneSemyonov 22 03.08.17 12:13 Сейчас в теме
(3) ToTMoM,
иметь возможность прерывать обработку (=передать как-то и куда-то данные о желании прервать), и с возможностью продолжения с предыдущего места.
А это нашли как реализовать?
4. sommid 13.09.16 15:21 Сейчас в теме
попробуйте поискать по инфостарту про прогресс бар на управляемых формах
8. ToTMoM 13.09.16 17:29 Сейчас в теме
(4) sommid, (5) DenisCh, (6) alex-l19041, (7) Boneman, Благодарю) Пойду пробовать)
5. DenisCh 13.09.16 15:22 Сейчас в теме
Фоновое задание И (сообщить ИЛИ регистр сведений) И обработка ожидания.
9. ToTMoM 15.09.16 10:05 Сейчас в теме
Сделал на основании этой фигни, все работает.
http://infostart.ru/public/274721/

Единственное теперь вопрос такой. В коде есть такие строчки
СтруктураПараметров.Вставить("ИмяМетода", 		"ВыполнитьДлительнуюОперацию");
СтруктураПараметров.Вставить("ПараметрыВыполнения", 	ПараметрыДлительнойОперации);

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


И тогда вызывается экспортная функция из модуля обработки, указанная в ИмяМетода. Но вот в чем проблема - у меня есть форма табличным документом, парой строково/символьных параметров и одной ТЧ. Все это является реквизитами не Формы, а самого Объекта. Но теперь в экспортную функцию, расположенную в модуле обработки мне нужно передать это все, по факту весь контекст формы. И че то не пойму как правильно это сделать? По большей части попыток пишет что значение не объектного типа(
10. Boneman 298 15.09.16 10:12 Сейчас в теме
(9) ToTMoM, в структуру заверни и передай. А там разверни и инициализируй.
Я так понимаю, тебе нужны всякие параметры которые пользователь навыбирал, перед тем как запустить, а там создается новый объект, с пустыми реквизитами.
11. ToTMoM 15.09.16 12:12 Сейчас в теме
Я неправильно заворачивал, теперь все передалось) ТЧ тоже разобрался и передал)

Но теперь остался последний странный прикол. Когда обработка внешняя - то через открыть все работает.
Но когда ее делаешь доп. обработкой в справочник доп.обработок и пытаешься открыть из системы - выдает такое.

Ошибка при вызове конструктора (ДвоичныеДанные)
Новый ДвоичныеДанные(МестонахождениеВнешнейОбработкиКлиент);
по причине:
Каталог не обнаружен 'e1cib\tempstorage\077a0bd8-33e1-4039-b4be-205d2456354d'

Вот код...
...
МестонахождениеВнешнейОбработкиКлиент = "";
Если ЭтоВнешняяОбработка(МестонахождениеВнешнейОбработкиКлиент) Тогда
	АдресХранилищаВнешнейОбработки = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(МестонахождениеВнешнейОбработкиКлиент),УникальныйИдентификатор); //ВОТ ТУТ ОШИБКА!
КонецЕсли;
...
...
Функция ЭтоВнешняяОбработка(МестонахождениеВнешнейОбработки = "")	
	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
	ЭтоВнешняяОбработка = НЕ Метаданные.Обработки.Содержит(ОбработкаОбъект.Метаданные());
	Если ЭтоВнешняяОбработка Тогда	
		МестонахождениеВнешнейОбработки = ОбработкаОбъект.ИспользуемоеИмяФайла;	
	КонецЕсли;
	Возврат ЭтоВнешняяОбработка;
КонецФункции

Показать

В дальнейшем используется НаСервере так:
Если ЭтоВнешняяОбработка Тогда
	Если ПустаяСтрока(ФоновоеЗаданиеДлительнойОперацииМестонахождениеВнешнейОбрабо­ткиСервер) Тогда
		ФоновоеЗаданиеДлительнойОперацииМестонахождениеВнешнейОбрабо­ткиСервер = ПолучитьИмяВременногоФайла("epf");
	КонецЕсли;	
	ДвоичныеДанныеВнешнейОбработки = ПолучитьИзВременногоХранилища(АдресХранилищаВнешнейОбработки);
	ДвоичныеДанныеВнешнейОбработки.Записать(ФоновоеЗаданиеДлительнойОперацииМестонахождениеВнешнейОбрабо­ткиСервер);
	ИмяОбработки = ФоновоеЗаданиеДлительнойОперацииМестонахождениеВнешнейОбрабо­ткиСервер;
Иначе
	ЧастиИмениФормы = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяФормы, ".");
	ИмяОбработки = ЧастиИмениФормы[1];
КонецЕсли;
Показать
12. ToTMoM 15.09.16 12:15 Сейчас в теме
(11) ToTMoM, Я как понимаю, когда она просто файл через Открыть - там путь на диске и он все находит и все норм. Когда же это доп. обработка, то он получает навигационную ссылку внутри базы, но как ее правильно обработать ума не приложу, вообще не работал с ними. А учится если честно сегодня поздно, надо через час исправить(
13. ToTMoM 15.09.16 12:50 Сейчас в теме
Господа, ну подскажите, по факту есть навигационная ссылка, полученная на клиенте, а мне из нее на сервере нужно сделать ИмяОбработки, по которой к этой обработке будут обращаться и по которой она будет вызваться. Эта навигационная ссылка как я понял - ссылка на объект во временном хранилище.
14. Boneman 298 15.09.16 13:55 Сейчас в теме
(13) ToTMoM, так ты в обработке, параметры регистрации корректно описал ?
Никогда не было никаких проблем, связанных с подключением.
В управляемых формах, в объекте обработки должны быть параметры регистрации.
15. ToTMoM 15.09.16 14:25 Сейчас в теме
(14) Boneman, Параметры Регистрации есть, все как обычно. Но дело в том, что он ошибку выдает именно во время получения ссылки. Когда это ссылка на файл - это просто путь файла - все норм. Когда это ссылка = путь во временном хранилище - все не норм( Вот и вся проблема.
16. Boneman 298 15.09.16 14:29 Сейчас в теме
(15) ToTMoM, мне непонятно,
прямо форма обработки не открывается, когда ты ее подключил.
Или, не работает уже в обработке, когда ты там кнопку выполнить нажимаешь ?
17. white-mount 15.09.16 15:00 Сейчас в теме
(15) ToTMoM,
Когда это ссылка = путь во временном хранилище - все не норм( Вот и вся проблема.
К нему есть доступ? Или только после обращения получить()? Хранилище ведь вначале распаковать нужно, найти нужный файл.
18. starik-2005 3039 15.09.16 15:22 Сейчас в теме
Оставьте свое сообщение

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