Имя: Пароль:
1C
1C 7.7
v7: ОстановитьВыполнение() по нажатию ESC - как поймать прерывание?
0 FoundMarket
 
21.06.12
15:13
Собственно выполняется обработка, из себя вызывает  еще одну обработку иа та еще и т.д , жмешь ESC и иногда удается ее прибить, но не всегда. Надо поймать прерывание.
1 FoundMarket
 
21.06.12
15:15
Подскажите чем можно изящнее его отловить
2 Рэйв
 
21.06.12
15:19
В процессе запроса к базе - никак. А в остальное время по Ctrl+Break обработка прерывается.
3 Рэйв
 
21.06.12
15:19
если это действительно 7.7 конечно
4 Рэйв
 
21.06.12
15:20
и по ескэепй тоже кажется
5 Fragster
 
гуру
21.06.12
15:20
обновление отображения в В8, в 7.7 - формула у надписи
6 Fragster
 
гуру
21.06.12
15:20
в начале обработки выставляешь флаг в глобальную переменную модуля, в обновлении - смотришь его
7 Эльниньо
 
21.06.12
15:21
В васике было:

if inkey$=chr(27) goto 1000

в 7.7 не знаю.
8 FoundMarket
 
21.06.12
16:01
Ctrl+Break не катит в терминальном режиме
да если и прокатит тупо Break , то "каскад" не даст прерваться - у меня пишет : Прервать выполнение обработки - говорю ДА и она продолжается...
9 FoundMarket
 
21.06.12
16:02
(5) "обновление отображения в В8, в 7.7 - формула у надписи"


ничего не понял
10 1dvd
 
21.06.12
16:03
(8) тебе нужно при вызове другой обработки проверять удачное завершение. И если она не удачная, то прерывать текущую
11 FoundMarket
 
21.06.12
16:05
(10) Это понятно - что определяет УДАЧНОЕ ЗАВЕРШЕНИЕ - вернее мне надо поймать, правильно сказал Эльниньо, нужно знать переменную в которую пишется прерывание по Break
12 FoundMarket
 
21.06.12
16:07
как то же система выводит сообщение - ПрерватьВыполнениеОбработки
13 FoundMarket
 
21.06.12
16:07
14 FoundMarket
 
21.06.12
16:09
т.е. нет ни какого события :))


перем Ок; // флаг успешного завершения

процедура долгая(перем)
  Ок=0; // по умолчанию предполагаем, что произошло прерывание
  /// длительная обработка
  Ок=1; // процедура завершена корректно
конецПроцедуры // долгая

процедура Сформировать()
  пока ....
        долгая(...);
        если Ок=0 тогда прервать; конецЕсли; // если долгая()  не завершилась успешна, то выходим из цикла
  конецЦикла; // пока ....
конецПроцедуры // Сформировать()
15 Ёпрст
 
21.06.12
16:16
16 FoundMarket
 
21.06.12
16:51
(15) Так прокатывает только на линейных алгоритмах обработок - если из обработки каскадно вызывается другая , то не работает
17 FoundMarket
 
21.06.12
16:52
Правильнее в (14)
18 Ёпрст
 
21.06.12
16:53
(17) правильнее, это перехват Esc своей кнопкой с хоткеем или формексом.
19 FoundMarket
 
21.06.12
16:54
(18) не найду нигде примера как из обработки вынуть переданный в нее параметр - можешь в меня кинуть примером?
20 FoundMarket
 
21.06.12
16:55
Собственно:

       Параметр = СоздатьОбъект("СписокЗначений");
       Параметр.Установить("КонтекстФормы",    Контекст);
       Параметр.Установить("Контрагент",Т.Док.Контрагент.КонтрагентОбщ);
       ОткрытьФормуМодально("Обработка.ДебиторскаяЗадолженность_Обр", Параметр,КаталогИБ()+"Extforms\ДебиторскаяЗадолженность_Обр.ert");
21 FoundMarket
 
21.06.12
16:55
а вот как обратно забрать?
22 Ёпрст
 
21.06.12
16:55
+18 и в том же формексе есть ОстановитьВыполнение()
23 FoundMarket
 
21.06.12
16:56
т.е. счас на форму повешу флажок и буду им рулить из Обработка.ДебиторскаяЗадолженность_Обр
24 FoundMarket
 
21.06.12
16:56
у меня алиаса формекскового нету - и времени осталось полчаса до конца раб дня
25 Ёпрст
 
21.06.12
16:57
(21) дык при модальном закрытии у тебя всё будет в Параметр...
что в процедура ПриЗакрытии() или еще где положишь в Форма.Параметр в Обработка.ДебиторскаяЗадолженность_Обр, то и прилетит тебе в Параметр
26 FoundMarket
 
21.06.12
16:57
формекс кстати загружен при начале работы системы и
27 Ёпрст
 
21.06.12
16:58
+25



ОткрытьФормуМодально("Обработка.ДебиторскаяЗадолженность_Обр", Параметр,КаталогИБ()+"Extforms\ДебиторскаяЗадолженность_Обр.ert");

//в обработке Процедура ПриЗакрытии() Форма.Параметр ="Вася"; КонецПроцедуры

Сообщить(Параметр);
28 FoundMarket
 
21.06.12
16:58
Процедура ПриОткрытии()
   
   КонтекстФормы    = Форма.Параметр.Получить("КонтекстФормы");
   КонтрагентВыб    = Форма.Параметр.Получить("Контрагент");
29 FoundMarket
 
21.06.12
16:58
понятно - спасибо
30 FoundMarket
 
21.06.12
16:59
давно пользовался - счас бы и не нашел где и когда :))
31 FoundMarket
 
21.06.12
17:18
При закрытии вроде бы как бэ интерактивная :)
32 FoundMarket
 
21.06.12
17:19
а у меня она туда даже не попадает в эту процедуру...
33 Ёпрст
 
21.06.12
17:21
ну, присваивай где-нибудь еще, в коде выполнения твоей обработки
34 FoundMarket
 
21.06.12
17:23
Так ? Форма.Параметр.КонтекстФормы.Прерывание = 1;
35 FoundMarket
 
21.06.12
17:30
туплю там же список значений ...
36 Ёпрст
 
21.06.12
17:33
(34) в Форма.Параметр можешь записать что хочешь.. при передаче - у тебя там СЗ, можешь использовать его, а можешь и просто, в другой тип переопределить:

Форма.Параметр="Вася"; //например
37 FoundMarket
 
21.06.12
18:19
не попадаю в нужное значение - так как эта обработка используется в куче отчетов ДебиторскаяЗадолженность_Обр.ert , то не могу вернуть на вызывающую форму значение флажка - буду курить формекс завтра...
38 FoundMarket
 
21.06.12
18:20
Форма.Параметр.Установить("КонтВызывающейФормы.ФлагПрерывания",1);  не катит - пишет ошибка выражения
39 FoundMarket
 
21.06.12
18:21
да и не получаеся из вызываемой обработки  управлять флажками на вызывающей... пример нужен
40 FoundMarket
 
21.06.12
18:22
тут очень простенький примерчик Книга знаний: Параметр и контекст формы
41 Ёпрст
 
21.06.12
18:25
(39)

при модально открытой форме это врят ли получится вообще
:))
42 Ёпрст
 
21.06.12
18:25
т.е эффект будет виден только при закрытии модальной формы
43 FoundMarket
 
21.06.12
18:26
у меня под форма то не открывается вообще - просто я ее использую как процедуру общего  модуля
44 FoundMarket
 
21.06.12
18:27
т.е. идет какая то морготня так как много раз в цикле вызываю ее с разными параметрами, но и только - обработка в данном отчете просто тупо что то вычисляет и пишет в документы результаты.
45 Ёпрст
 
21.06.12
18:28
(43) ну и толку то ? ты ж её модально "открываешь" - пока вся в ПриОткрытии  модальной формы не выполнится (даже со статусом возврата в 0) - управление не перейдет в вызывающую форму.
46 FoundMarket
 
21.06.12
18:28
просто работает она долго - минут пять и если  юзверь ошибси то хана - не избавится от нее и на пять минут будет смотреть  мое кыно
47 FoundMarket
 
21.06.12
18:32
понятно - зря поспешил все снести - надо было все ж таки параметр записать действительно вот такой Форма.Параметр ="Прерывание Таки было!!!"; а в начале такой поставить Форма.Параметр ="Прерывания Таки не було!!!"; а потом уже в  вызывающей  проверить параметр ПримерКонт = Парам; Если примерКонт="Прерывание Таки было!!!" Тогда Прервать; КонецЕсли;
48 FoundMarket
 
21.06.12
18:35
т.е. раз она в параметрах типы преобразует, правда не совсем понятно что с таблицей значений станет - Сообщить(Парам) показывает Таблица значений - значит ищи свищи куды она этот "Прерывание Таки было!!!" поместит И как его ваще туда помещать если в параметрах на первом месте сам контекст  вызывающей формы ?
49 FoundMarket
 
21.06.12
18:36
Че то она туда вообще ничего не помещает - ругается на все Форма.Параметр.Установить("трулялял",1);  не катит - пишет ошибка выражения
50 FoundMarket
 
21.06.12
18:36
и так вот Форма.Параметр.Установить("",1);  не катит - пишет ошибка выражения
51 FoundMarket
 
21.06.12
18:37
ладно , работали год  без прерываний и еще столько же проработают - влом копать...
52 FoundMarket
 
22.06.12
11:56
Кароче седня таки добил с утра с помощью Formexa

////**************************************************************
//// Formex.dll
////"    КодКлавиши - код нажатой кнопки клавиатуры.
////"    Alt - флаг нажатия кнопки <Alt>.
////"    Shift - флаг нажатия кнопки <Shift>.
////"    Ctrl - флаг нажатия кнопки <Ctrl>.
////"    Символ - символ нажатой кнопки в формате ASCII.
////"    ФСО - флаг стандартной обработки. Изначально равен 1. Если в теле процедуры сбросить значение в 0, то стандартная обработка события не вызывается.
////Описание: Предопределенная процедура вызывается при нажатии кнопки клавиатуры.
//
Процедура ПриНажатииКнопкиКлавиатуры(код, _а, _ш, _к,_симв,_фсо)
   
       Если код=27 Тогда
          Предупреждение("Нажата кнопка клавиатуры (ESC=27) Пробуйте пожалуйста еще несколько раз  нажать "+код);
          ПрерватьВыполнениеОбработки=1;
       КонецЕсли;  
         
КонецПроцедуры
////***************************************************************
53 FoundMarket
 
22.06.12
11:59
воткнул ее в вызываемую модально обработку, а при выходе из обработки по "вываливанию" из циклов модуля
       Если ПрерватьВыполнениеОбработки=1 Тогда
            Прервать;
       КонецЕсли;

пишу так:

   Если ПрерватьВыполнениеОбработки=1 Тогда
            Форма.Параметр="Прервано";
   КонецЕсли;

ну а на вызове просто тупо проверяю параметр

       //*** расчитать фактическую отсрочку по оплате документа
       //*** тут надо будет выполнить собственно расчет отсрочки фактической  и записать ее в сам документ
       //*** для этого я передам в обработку параметры расчетные и в ней все заполню
       //Сообщить("Расчет ведется по контрагенту:"+ЗапТЗ.КонтрагентОбщ);
       Параметр = СоздатьОбъект("СписокЗначений");
       Параметр.Установить("КонтекстФормы",    Контекст);
       Параметр.Установить("Контрагент",Т.Док.Контрагент.КонтрагентОбщ);
       ОткрытьФормуМодально("Обработка.ДебиторскаяЗадолженность_Обр", Параметр,КаталогИБ()+"Extforms\ДебиторскаяЗадолженность_Обр.ert");  

       Если Параметр = "Прервано" Тогда  
           
           Прервать;
           
       КонецЕсли;