Пробовал и обработки ожидания и другие варианты, такое себе, подскажите как лучше и правильнее организовать оповещения пользователя и прерывание процесса по желанию пользователя? Основная концепция в тек. варианте 1С какова будет?
Т.е. сейчас есть функция, которая передает управление на сервер, выполняет запрос и потом обходами и циклами обрабатывает всякие данные. Мне нужно всего лишь теперь иметь возможность оповещать пользователя и прервать выполнение если потребуется , но чет варианты какие я пробую - не дают нужного результата :-(
(1) ToTMoM, гы...
вылкам то зе world of управляемых приложений )))))
полноценно с прерываниями и оповещениями, придется заморачиваться с фоновыми заданиями, то бишь асинхронный метод.
Старые добрые методы, типа ОбработкаПрерыванияПользователя() - уже не проканают. )))
(2) Boneman, Гы, ну ок. Поставлю вопрос по-другому:
Есть гипотетический код:
Процедура ВыполнитьДействие()
ВыполнитьДействиеНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьДействиеНаСервере()
//Получаем все данные...
//...
//Обрабатываем данные
Для Индекс = 1 По КолвоОбрабатываемыхЭлементов Цикл
ОбрабатываемыйОбъект = МассивОбрабатываемыхЭлементов.Получить(Индекс);
ИзменитьДоНеузнаваемости(ОбрабатываемыйОбъект);
ОбрабатываемыйОбъект.Записать();
КонецЦикла;
КонецПроцедуры
Показать
Теперь хочу оповещать клиента о состоянии процесса. Состояние может содержать Факт обработки/Номер в массиве/Ссылку/Наименование объекта, который был обработан. Оповещение пользователя о состоянии может быть после каждого объекта, периодическая по времени проверка либо по желанию(нажатию) пользователя. Также иметь возможность прерывать обработку (=передать как-то и куда-то данные о желании прервать), и с возможностью продолжения с предыдущего места.
Вот как надо наш гипотетический код изменить, чтобы такие условия выполнялись?)
При этом надо учитывать, что миллиард вызовов с сервера на клиент - тоже ересь, надо как-то аккуратнее это делать, БезКонтекстов и т.п.
(3) ToTMoM, только фоновое задание.
Оповестить вот так вот просто, тоже не получится.
Процедура уйдет на сервер, и комп зависнет, пока оно там все не выполнится..и даже если там накапливать сообщения, или использовать регистры сведений...все равно не прокатит, ибо выплюнет оно все это пользователю в самом конце, когда уже все свершится.
Обрати внимание, что в типовых, все длительные операции, тоже именно так и выполняются, со всякими кошечками и т.д, там есть целый общий модуль для этого.
Тебе надо просто покопать общие модули, и их использовать в своих целях.
в (4) тебе посоветовали правильную публикацию, я с нее тоже начинал когда разбирался, там для УТ-шки кажется было сделано, и просто для понимания.
И тогда вызывается экспортная функция из модуля обработки, указанная в ИмяМетода. Но вот в чем проблема - у меня есть форма табличным документом, парой строково/символьных параметров и одной ТЧ. Все это является реквизитами не Формы, а самого Объекта. Но теперь в экспортную функцию, расположенную в модуле обработки мне нужно передать это все, по факту весь контекст формы. И че то не пойму как правильно это сделать? По большей части попыток пишет что значение не объектного типа(
(9) ToTMoM, в структуру заверни и передай. А там разверни и инициализируй.
Я так понимаю, тебе нужны всякие параметры которые пользователь навыбирал, перед тем как запустить, а там создается новый объект, с пустыми реквизитами.
Я неправильно заворачивал, теперь все передалось) ТЧ тоже разобрался и передал)
Но теперь остался последний странный прикол. Когда обработка внешняя - то через открыть все работает.
Но когда ее делаешь доп. обработкой в справочник доп.обработок и пытаешься открыть из системы - выдает такое.
Ошибка при вызове конструктора (ДвоичныеДанные)
Новый ДвоичныеДанные(МестонахождениеВнешнейОбработкиКлиент);
по причине:
Каталог не обнаружен 'e1cib\tempstorage\077a0bd8-33e1-4039-b4be-205d2456354d'
Вот код...
...
МестонахождениеВнешнейОбработкиКлиент = "";
Если ЭтоВнешняяОбработка(МестонахождениеВнешнейОбработкиКлиент) Тогда
АдресХранилищаВнешнейОбработки = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(МестонахождениеВнешнейОбработкиКлиент),УникальныйИдентификатор); //ВОТ ТУТ ОШИБКА!
КонецЕсли;
...
...
Функция ЭтоВнешняяОбработка(МестонахождениеВнешнейОбработки = "")
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ЭтоВнешняяОбработка = НЕ Метаданные.Обработки.Содержит(ОбработкаОбъект.Метаданные());
Если ЭтоВнешняяОбработка Тогда
МестонахождениеВнешнейОбработки = ОбработкаОбъект.ИспользуемоеИмяФайла;
КонецЕсли;
Возврат ЭтоВнешняяОбработка;
КонецФункции
Показать
В дальнейшем используется НаСервере так:
Если ЭтоВнешняяОбработка Тогда
Если ПустаяСтрока(ФоновоеЗаданиеДлительнойОперацииМестонахождениеВнешнейОбработкиСервер) Тогда
ФоновоеЗаданиеДлительнойОперацииМестонахождениеВнешнейОбработкиСервер = ПолучитьИмяВременногоФайла("epf");
КонецЕсли;
ДвоичныеДанныеВнешнейОбработки = ПолучитьИзВременногоХранилища(АдресХранилищаВнешнейОбработки);
ДвоичныеДанныеВнешнейОбработки.Записать(ФоновоеЗаданиеДлительнойОперацииМестонахождениеВнешнейОбработкиСервер);
ИмяОбработки = ФоновоеЗаданиеДлительнойОперацииМестонахождениеВнешнейОбработкиСервер;
Иначе
ЧастиИмениФормы = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяФормы, ".");
ИмяОбработки = ЧастиИмениФормы[1];
КонецЕсли;
(11) ToTMoM, Я как понимаю, когда она просто файл через Открыть - там путь на диске и он все находит и все норм. Когда же это доп. обработка, то он получает навигационную ссылку внутри базы, но как ее правильно обработать ума не приложу, вообще не работал с ними. А учится если честно сегодня поздно, надо через час исправить(
Господа, ну подскажите, по факту есть навигационная ссылка, полученная на клиенте, а мне из нее на сервере нужно сделать ИмяОбработки, по которой к этой обработке будут обращаться и по которой она будет вызваться. Эта навигационная ссылка как я понял - ссылка на объект во временном хранилище.
(13) ToTMoM, так ты в обработке, параметры регистрации корректно описал ?
Никогда не было никаких проблем, связанных с подключением.
В управляемых формах, в объекте обработки должны быть параметры регистрации.
(14) Boneman, Параметры Регистрации есть, все как обычно. Но дело в том, что он ошибку выдает именно во время получения ссылки. Когда это ссылка на файл - это просто путь файла - все норм. Когда это ссылка = путь во временном хранилище - все не норм( Вот и вся проблема.
(15) ToTMoM, мне непонятно,
прямо форма обработки не открывается, когда ты ее подключил.
Или, не работает уже в обработке, когда ты там кнопку выполнить нажимаешь ?