Имя: Пароль:
1C
1С v8
re Обработка прерывания пользователя
0 zakidonoff
 
17.04.12
21:33
BeaViS
Напоролся тут на тему:
v8: Обработка прерывания пользователя
11.01.08 - 14:30
Хочется организовать такую обработку прерывания пользователем выполнения кода, чтобы прервано было не все выполние кода, а только текущий цикл.

Сам не придумал, м.б. кто изобретал подобное?

Делать один фиг неча - поделюсь своей извращенной фантазией =)

В глобальном модуле:

Перем мВЦикле; Экспорт

Процедура ПриВыводеСтроки(ТекущиеДанные, ОформлениеСтроки)

Если ТекущиеДанные.СтроковаяКолонка <> Справочники.НекийОбъект.ПустаяСсылка() Тогда
ТекущиеДанные.СтроковаяКолонка = Справочники.НекийОбъект.ПустаяСсылка();
КонецЕсли;

Если мВЦикле Тогда
ВыполнитьЧтоТамНадоПриПрерывании();
Иначе
ВыполнитьЦикл();
КонецЕсли;

КонецПроцедуры

Процедура ВыполнитьЦикл()

мВЦикле = Истина;
Пока Цикл
ОбработкаПрерыванияПользователя();
КонецЦикла;
мВЦикле = Ложь;

КонецПроцедуры

ПроцедураИнициаторАлгоритма()

СтрокаВызывающаяБесконечноеЦиклическоеСрабатываниеСобытияПриВыводеСтроки = СкрытоеТабличноеПоле.Добавить();
СтрокаВызывающаяБесконечноеЦиклическоеСрабатываниеСобытияПриВыводеСтроки.СтроковаяКолонка = Справочники.НекийОбъект.ПустаяСсылка();

КонецПроцедуры

мВЦикле = Ложь;
1 DrShad
 
17.04.12
21:50
и это хрень работает?
2 zakidonoff
 
17.04.12
21:51
ХЗ.
Не проверял. По идее - должна.
Всяко лучше, чем флаги в реестр операционки вешать =)
3 Maxus43
 
17.04.12
21:54
нихрена не понял, обработка прерывания не отменяет действий сделанных до её срабатывания
4 DrShad
 
17.04.12
21:55
так ты проверь сначала, особенно в серверном варианте
5 Maxus43
 
17.04.12
21:56
з.ы. заверни ОбработкаПрерыванияПользователя в попытку, отработает?
6 zakidonoff
 
17.04.12
21:59
Это будет работать. Проверять ломает.
По-крайней мере, сама идея точно рабочая. Разве что кое-какие места видоизменить, дописать придется
зы: например, добавить куда-нить очистку скрытого табличного поля, дабы без надобности программу не вешало =)
7 mikecool
 
17.04.12
22:01
(6) бгг, я изобрел вечный двигатель, идея рабочая, а проверить - ломает
8 zakidonoff
 
17.04.12
22:02
На тонком клиенте - тоже, коль скоро там также идет проверка вывода строки каждый раз, как происходит изменение данных в ней.
На сервере - точно именно так и есть.

Весь казус в том, что глюк зацикливания процедуры привыводестроки оставляет промежутки для действий пользователя, а уход в бесконечный цикл в теле процедуры - нет =)
9 zakidonoff
 
17.04.12
22:03
v8: re Обработка прерывания пользователя

Для моих 32х см это не вечный двигатель, а способ расслабиться
гг ))
10 zakidonoff
 
17.04.12
22:04
пля. Как вы ссылки на сообщения делаете? (9)
11 zakidonoff
 
17.04.12
22:05
(10) Ясно =)
12 zak555
 
17.04.12
22:06
> Хочется организовать такую обработку прерывания пользователем выполнения кода, чтобы прервано было не все выполние кода, а только текущий цикл.


пример такого цикла озвучь
13 zakidonoff
 
17.04.12
22:12
(12) Де юре будет прерван весь код.
Но внешне будет выглядеть так, будто быд прерван лишь цикл.
Со стороны пользователя условие соблюдено.
Со стороны программиста... Программисту по определению должно быть ровно как сделано то, что работает. Главное - работает.
14 DrShad
 
17.04.12
22:12
(11) да где же у тебя выход из процедуры?
15 zakidonoff
 
17.04.12
22:14
(14) Какой код тебе нужен? И из какой процедуры? Я привел набросок принципиальной схемы - не более того.
16 DrShad
 
17.04.12
22:20
(15) так он нерабочий нифига
17 zakidonoff
 
17.04.12
22:21
(14) Догнал о чём речь... Писал выше (6)
Выход делаем так:

Процедура ВыполнитьЦикл()

мВЦикле = Истина;
Пока Цикл
 ОбработкаПрерыванияПользователя();
КонецЦикла;

мВЦикле = Ложь;
СкрытоеТабличноеПоле.Очистить();

КонецПроцедуры
18 zakidonoff
 
17.04.12
22:22
(16) Спорим?
=)
19 DrShad
 
17.04.12
22:24
спорим, только конец процедуры или возврат вернут управление назад
20 zakidonoff
 
17.04.12
23:00
(19) На что спорим? )
Понимаю, что уже не интересно - я только что проверил и реализовал свой алгоритм...
Но а вдруг не поверишь? =)
21 DrShad
 
17.04.12
23:08
а что у тебя есть?
22 zakidonoff
 
17.04.12
23:14
(21) Давай так:
Я сейчас скидываю сюда обработку, которая при нажатии на кнопку запускает бесконечный цикл. Если нажать ctrl + брык - выдается стандартное сообщение о прерывании, после которого появляется предупреждение о том, что усё прекрасно работает. Смысл ясен - в процедуру с этим предупреждением можно запихать всё что угодно. Условие соблюдено - процесс продолжится.

Если она действительно работает именно так, то ты скидываешь мне на сотовый условную сумму (пусть 100р). Если нет - то ты мне.
Больше смысла нет - это всё так - на честность )
Идет?
23 zakidonoff
 
17.04.12
23:16
(22) *Если нет - то Я тебе
24 DrShad
 
17.04.12
23:42
давай
25 zakidonoff
 
17.04.12
23:48
26 DrShad
 
17.04.12
23:52
белый экран смерти 1С
27 DrShad
 
17.04.12
23:55
с тебя сотка
28 DrShad
 
18.04.12
00:02
можешь пожертвовать по кнопке справа внизу
29 zakidonoff
 
18.04.12
00:04
(26) На чём запускал?
30 zakidonoff
 
18.04.12
00:05
На старой платформе потребуется небольшая перестановка мест слагаемых.
Типа такого:
http://disk.tom.ru/1juwzab
31 DrShad
 
18.04.12
00:06
платформа свежая
32 zakidonoff
 
18.04.12
00:07
(30) пардоньте - ссылка битая )
http://disk.tom.ru/qqgt6d4
33 zakidonoff
 
18.04.12
00:10
(31) Первую тестил на 8.2 (8.2.13.205)
Вторую - на этой и предыдущих.
Крайняя работает на всех 8.х
34 zak555
 
18.04.12
00:12
метки это жесть
35 DrShad
 
18.04.12
00:13
(33) работает, говори номер телефона
36 zakidonoff
 
18.04.12
00:14
(34) Метки там - не главное. Их легко можно обойти. Вставил уж для полной имитации того, что тело процедуры продолжается после прерывания цикла
37 zak555
 
18.04.12
00:15
подтверждаю - ничего не работает 15.301
38 zakidonoff
 
18.04.12
00:15
(35)
+7-960-971-37-64.
И на что ты надеялся? =)
39 zakidonoff
 
18.04.12
00:16
(37) Смотри эту:
http://disk.tom.ru/qqgt6d4
40 DrShad
 
18.04.12
00:16
оно не продолжается а запускается заново
41 DrShad
 
18.04.12
00:18
лови свою сотку
42 zak555
 
18.04.12
00:20
хотя в редиме отладки не запустилось
43 zakidonoff
 
18.04.12
00:20
(40) По факту - да. Визуально - нет.
Но я это оговаривал.
Поставленная задача выполнена.
Надо же - не обманул )
Мерси.
44 DrShad
 
18.04.12
00:21
(43) сотка не деньги
45 zak555
 
18.04.12
00:23
только каково применение ?
46 Никола_
Питерский
 
18.04.12
00:26
(45) Как минимум выйграть сотку ! )))
47 zakidonoff
 
18.04.12
00:26
(44) Приятна не сотка, а честность ;)
(45) Я ХЗ. Автору надо было зачем-то...
Но лично я уже знаю, куда такую приблуду можно вставить.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.