Имя: Пароль:
1C
1C 7.7
v7: Как определить успешность выполнения внешнего отчета...?
0 Злопчинский
 
28.02.17
12:07
допустим что-то типа
.
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(..);
ОткрытьФормуМодально("Отчет", Параметры, ИмяФормы);
.
допустим даже форма открывается и начинается выполнение, но, например, ломается по синтаксической ошибке или алгоритмической ошибке.

вопрос 1: можно как-то красиво и просто отловить что вызванный отчет "сломался"?
вопрос 2: можно ну на крайняк подавить вывод сообщения об ошибке в окно сообщений?
1 VladZ
 
28.02.17
12:10
Отчет в случае успеха должен "отсчитаться" об успехе. Т.е. вернуть результат выполнения.
2 Builder
 
28.02.17
12:11
Попытка
ОткрытьФормуМодально()
Исключение
не работает?
3 Это_mike
 
28.02.17
12:11
1. возвратом результата
2. зачем?
4 Азазель
 
28.02.17
12:23
Вывод сообщения об ошибке полезен для разраба, поскольку сразу показывает сбойное место в коде.

Или тебе нужно замаскировать ошибку? зачем подавлять вывод?
5 Ёпрст
 
28.02.17
12:30
(0) можно. Ставь блокировку на элемент. Будешь в любой сессии видеть результат работы обработки
Ну и обработка должна вернуть флаг успешной работы куда-то.
6 Злопчинский
 
28.02.17
12:31
(1) это я и сам умею, более красиво нннада!
7 Это_mike
 
28.02.17
12:32
(5) не понял
8 Ёпрст
 
28.02.17
12:32
(6) в поделке своей

Попытка
  ВыполнитьПоделку();
Исключение
  ЗаписатьФлагНеудачиКудаТо();
КонецПопытки

полечит всё, вплоть до любых ошибок исполненния
9 Злопчинский
 
28.02.17
12:33
(3) 2. Потому что. есть печатные формы, которые получают контекст формы документа. При вызове из формы журнала отчет ломается. Переписать отчеты - я и сам могу и вернуть что надо тоже могу. но это надож программить лезть
10 Злопчинский
 
28.02.17
12:34
(4) потому что это не влияет на стабильность системы/работы.
11 Ёпрст
 
28.02.17
12:34
(7)
ну, я так обычно делаю, что в клюшках, что в снеговике, чтоб поделку мог запускать кто-то один на выполнение - блокируешь определенный элемент любого справочника и привет. Если заблокировать не можешь, значит, эту поделку кто-то еще выполняет, смог. значит ты.
12 Ёпрст
 
28.02.17
12:36
(9) ну, не хочешь кодить - перехватчиком перехватывай и "следи"
:)
13 Это_mike
 
28.02.17
12:37
(11) хм. ну, в принципе, легко реализуемо..
14 Это_mike
 
28.02.17
12:38
(12) эх, как жалею, что во времена клюшек перехватчик не осилил...
15 Злопчинский
 
28.02.17
12:43
(8) вот вам фиг, обрамлять попыткой ОткрытьФорму не приносит нужного результата.
16 Злопчинский
 
28.02.17
12:43
(12) это как?
17 Ёпрст
 
28.02.17
12:48
(15) зачем форму ? Это надо писать унутри открываемой обработки
18 Злопчинский
 
28.02.17
12:49
опять же - ладно, допустим я возверну результат выполнения флаг успешности, нет флага - значит бяка.
но как подавить вывод сообщения про слом в табло?
19 Ёпрст
 
28.02.17
12:49
У тебя чего, внешние печатные формы не могут отличить унутри себя ссылку на документ от контекста открытой формы или что ?
20 Злопчинский
 
28.02.17
12:50
(17) не, так неинтересно
21 Ёпрст
 
28.02.17
12:50
(18) как в (8) не будет сообщений
22 Злопчинский
 
28.02.17
12:52
(21) не, так неинтересно, хочу снаружи
23 Злопчинский
 
28.02.17
12:52
(19) могу я все отличить, но мну лениво. хочу тупо вызвать впф, если сломалась то просто сказать "не, так низя, вызывай не отсюда, а из документа"
24 varelchik
 
28.02.17
12:54
А зачем такие сложности?
Берем 1spy.dll и ловим все что надо об ошибках.
25 Ёпрст
 
28.02.17
12:55
(23)хрень какая-то.
Пиши впф так, чтоб пофигу было, откуда они вызваны - из контекста открытой формы или в них ссылку на документ передали, например, из групповой обработки печати или из журнала документов или из формы списка справочника.

У нас так было.
26 Злопчинский
 
28.02.17
12:56
(25) ну, так неинтересно...
27 Это_mike
 
28.02.17
12:58
(25) это философский вопрос -
1.использовать ли печформу, которая примет документ в параметре в любой форме, либо
2.использовать документ, которому говоришь "напкечатай себя вот так вот и вон туда"
28 Вафель
 
28.02.17
13:07
может проще глобальну функцию запилить
ПолучитьКонтекст(СсылкаИлиКонтекст)
29 Вафель
 
28.02.17
13:07
и в начале каждой формы добавлять
30 Злопчинский
 
28.02.17
13:16
сделать так чтобы не ломалось - не проблема. а вот не переделыавая на ВПФ ничего - понять сломалась она или нет...
31 Это_mike
 
28.02.17
13:32
(30) а что значит "сломалась"?
32 vcv
 
28.02.17
14:14
А если в глобальнике описать Событие_НеобработаннаяОшибка и/или Событие_ЗаписьСобытияЖурналаРегистрации (1С++) ?
При возникновении ошибки сохраняем кудыть-нибудь признак того, что она произошла, текст ошибки и прочее нужное. После ОткрытьФормуМодально проверяем чего и как она отработала.
33 Злопчинский
 
28.02.17
14:24
(32) "проверяем чего и как она отработала."
- что именно проверяем?
34 Злопчинский
 
28.02.17
14:31
(31) например вывалилась по ошибке времени исполнения
35 vcv
 
28.02.17
14:41
(33) Ну где-то так

В глобальнике

Перем глТрассировкаОшибок, глСписокНеобработанныхОшибок;

Процедура ПриНачалеРаботыСистемы()
  ЗагрузитьВнешнююКомпоненту("1cpp.dll");
  Перехватчик = СоздатьОбъект("Перехватчик");
  Перехватчик.ПодключитьСобытие_НеобработаннаяОшибка();
  глСписокНеобработанныхОшибок = СоздатьОбъект("СписокЗначений");
  глТрассировкаОшибок = 0;
КонецПроцедуры

Функция Событие_НеобработаннаяОшибка(СообщениеОбОшибке, Маркер, ИмяФайла, Парам4, НомерСтрокиОшибки, Парам6)
  Если глТрассировкаОшибок = 1 Тогда
    глСписокНеобработанныхОшибок.ДобавитьЗначение(СообщениеОбОшибке);
  КонецЕсли;
КонецФункции

Вызов внешнего отчета

глСписокНеобработанныхОшибок = СоздатьОбъект("СписокЗначений");
глТрассировкаОшибок = 1;
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.ДобавитьЗначение(..);
ОткрытьФормуМодально("Отчет", Параметры, ИмяФормы);
глТрассировкаОшибок = 0;
Если глСписокНеобработанныхОшибок.РазмерСписка() > 0 Тогда
  ... тут делаешь всё, что надо, когда есть ошибки во внешней обработке
КонецЕсли;


Или я всё совсем не так понял?
36 vcv
 
28.02.17
14:42
(34) А если совсем-совсем вывалилась и выполнение после ОткрытьФормуМодально не попало, то взведи ОбработкаОжидания. Можно из FormEx, там время в миллисекундах задать можно.
37 Злопчинский
 
28.02.17
20:29
(35) не, правильно все понял, примерно так.. попробую...
38 Злопчинский
 
28.02.17
22:02
(35) а где почитать подробнее про параметры функции Событие_НеобработаннаяОшибка
?
39 Злопчинский
 
28.02.17
22:04
(35) не катит, ругается:
Необходимо включить перехват событий с помощью встроенного класса 1С++ - УправлениеНастройками
40 Злопчинский
 
28.02.17
22:13
(39) написал так (вроде не ругается)
        оНастр = СоздатьОбъект("УправлениеНастройками");
           оНастр.Включить("TurboBL");
           оНастр.Включить("ПерехватитьСобытияГК");
           
          Перехватчик = СоздатьОбъект("Перехватчик"); Перехватчик.ПодключитьСобытие_НеобработаннаяОшибка();
        глСписокНеобработанныхОшибок = СоздатьОбъект("СписокЗначений"); глТрассировкаОшибок = 0;
41 Злопчинский
 
28.02.17
22:41
(35) Получилось как представлялось! https://www.screencast.com/t/hZ0PkEl41gJJ

этот перехватчик отлавливает ошибки и подавляет вывод в табло
42 Злопчинский
 
28.02.17
22:47
однако...
43 Злопчинский
 
28.02.17
23:11
теперь непонятно как отключить событие нобработанной ошибки...
44 Злопчинский
 
28.02.17
23:19
Почитал про перехватчик, понял мало :-(
45 vcv
 
01.03.17
05:41
(43) Попробуй оНастр.Сбросить("ПерехватитьСобытияГК");
или Возврат 1; в функции Событие_НеобработаннаяОшибка, тогда должна работать штатная обработка ошибок.
46 Злопчинский
 
01.03.17
10:42
(45) угу, спсб.
переписал все отчеты на анализ передаваемого параметра (благо отчетов немного).

но обработка ошибок перехват - пригодится.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.