|
Как победить ошибку "В данной транзакции уже происходили ошибки" | ☑ | ||
---|---|---|---|---|
0
ildary
20.11.18
✎
14:33
|
Уважаемые специалисты, посоветуйте пожалуйста, как правильно в КА2 исправить появление вот такой ошибки:
Добавленный в КА2 2.4.5.86 документ при проведении делает следующее (документ не мой, делали до меня): Вызывается процедура в которой происходит запись в РС примерно так: НачатьТранзакцию(); Попытка НаборЗаписей.Записать(Ложь); Исключение ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ДанныеФизическогоЛица.ФизическоеЛицо + "уже существует ЛС по зарплатному проекту " + ДанныеФизическогоЛица.ЗарплатныйПроект); КонецПопытки; ЗафиксироватьТранзакцию(); При выполнении ОбщегоНазначенияКлиентСервер.СообщитьПользователю() появляется ошибка. Я погуглил и решил отказать от транзакции вообще (т.к. проведение уже вызывает транзакцию) - не помогло. Попробовал делать транзакцию как советует ИТС: НачатьТранзакцию(); Попытка НаборЗаписей.Записать(Ложь); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ДанныеФизическогоЛица.ФизическоеЛицо + "уже существует ЛС по зарплатному проекту " + ДанныеФизическогоЛица.ЗарплатныйПроект); КонецПопытки; тоже не помогло. Увидел в интернете, что корень зла в том, что во всём виновата обработка исключения сделал вот так: ЕстьОшибка = Истина; Попытка НаборЗаписей.Записать(Ложь); ЕстьОшибка = Ложь; Исключение КонецПопытки; Если ЕстьОшибка Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ДанныеФизическогоЛица.ФизическоеЛицо + "уже существует ЛС по зарплатному проекту " + ДанныеФизическогоЛица.ЗарплатныйПроект); КонецЕсли; тоже не помогло. Сижу, чешу репу. Наверное самое правильное - вообще убрать попытку, но тогда как ловить ошибку записи в РС? |
|||
1
laeg
20.11.18
✎
14:35
|
Ловить ошибку программно, написать запрос с проверкой на существование данных записей.
|
|||
2
H A D G E H O G s
20.11.18
✎
14:36
|
ЕстьОшибка = Истина;
Попытка ПредставлениеСотрудника=Строка(ДанныеФизическогоЛица.ФизическоеЛицо); ПредставлениеЗарплатныйПроект=Строка(ДанныеФизическогоЛица.ЗарплатныйПроект); Если ЕстьОшибка Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ПредставлениеСотрудника + "уже существует ЛС по зарплатному проекту " + ПредставлениеЗарплатныйПроект); КонецЕсли; |
|||
3
youalex
20.11.18
✎
14:47
|
(0) немного не в тему..
>>при проведении // 1-я транзакция >>..Вызывается...: НачатьТранзакцию(); //- 2-я транзакция Вот интересно, учитывая что во вложенные транзакции 1С не умеет, какую транзакцию фиксирует вот этот код: НаборЗаписей.Записать(Ложь); ЗафиксироватьТранзакцию(); По идее, нужно в процедуре объявлять переменную ТранзакцияАктивна = ТранзакцияАктивна() и фиксировать/отменять с условием по ней. |
|||
4
mexanik_96
20.11.18
✎
14:52
|
баги нужно исправлять, а не гасить ексепшены. писать код в попытке(в контексте 1с) говорит о не уверенности что код будет работать
|
|||
5
ildary
20.11.18
✎
14:54
|
(3) в этом месте всегда будет транзакция - т.к эта процедура вызывается только из проведения.
(4) я вообще не понимаю, зачем надо было так делать, но не могу связаться с разработчиком и вынужден придумывать сам. |
|||
6
mexanik_96
20.11.18
✎
14:57
|
(5) дак у тебя несколько одинаковых записей пытается записать
|
|||
7
mexanik_96
20.11.18
✎
14:58
|
+(6) нужно либо добавить уникальности, либо потрассировать код и посмотреть почему откуда и зачем одинаковые записи приходят
|
|||
8
ildary
20.11.18
✎
15:24
|
(6) идея интересная, но в наборе только 1 запись - проверил в отладчике. Может ли быть проблема, если при этом одно из измерений - пустое? При этом в его свойствах нет требования заполненности.
|
|||
9
Eiffil123
20.11.18
✎
15:39
|
(3) Проблем в этом нет. Просто вложенная транзакция не открывается.
|
|||
10
Малыш Джон
20.11.18
✎
15:42
|
(0) что такое ДанныеФизическогоЛица? ссылка?
тогда конечно будет ошибка, ты после генерации исключения пытаешься разыменовать ссылку. |
|||
11
youalex
20.11.18
✎
15:42
|
(9) да, получается, каждое НачатьТранзакцию() увеличивает счетчик транзакций на 1, а ЗафиксироватьТранзакцию() - уменьшает на 1, и реальная фиксация происходит когда счетчик = 1. Отбой, короче)
|
|||
12
Малыш Джон
20.11.18
✎
15:43
|
(11) именно так
|
|||
13
Вафель
20.11.18
✎
15:45
|
при проведении никак нельзя записывать с ошибкой, а потом что-то делать еще
|
|||
14
Cyberhawk
20.11.18
✎
15:47
|
Сколько платят за решение вопроса?
|
|||
15
Вафель
20.11.18
✎
15:48
|
(14) уже решили же
|
|||
16
palsergeich
20.11.18
✎
15:49
|
С волженными транзакциями надо аккуратно.
+ Пихать везде попытка Исключение - ведет ладно к таким ошибкам. Тут хоть сообщение есть. А могут быть и более интересные штуки... |
|||
17
ildary
20.11.18
✎
15:57
|
(16) если я правильно понял, то вложенные транзакции лучше не делать вообще. Для случая в (0) - я её (транзакцию) убрал и сделал вместо НаборЗаписей.Записать(Ложь) так: сначала проверяю - есть запись или нет, и если есть, то делаю НаборЗаписей.Записать(Истина)
|
|||
18
vi0
20.11.18
✎
17:21
|
(17) делай вложенные транзакции скок хошь
главное грамотно всё делай |
|||
19
vi0
20.11.18
✎
17:23
|
(17) см пункт 3.6
https://its.1c.ru/db/v8std#content:-2145783148:hdoc |
|||
20
1Сергей
20.11.18
✎
17:27
|
(18) +1
Описания исключений сделай внятные |
|||
21
lamina
20.11.18
✎
17:40
|
попробуй после исключение, следующей строкой добавить:
Пока ТранзакцияАктивна() Цикл ОтменитьТранзакцию(); КонецЦикла; |
|||
22
palsergeich
20.11.18
✎
17:44
|
(21) И вот тут большой костыль)
Транзакция уже в откате из-за ошибки. А транзакция активна вернет ИСТИНА. Это мега грабли. |
|||
23
palsergeich
20.11.18
✎
17:50
|
Вопрос из билета 1сЭксперт
Вопрос 2 Код конфигурации содержит следующий фрагмент: НачатьТранзакцию(); Процедура1(); НачатьТранзакцию(); Процедура2(); НачатьТранзакцию(); Процедура3(); ОтменитьТранзакцию(); Какие действия будут отменены в результате выполнения функции ОтменитьТранзакцию() в 7 строке. Ответ на вопрос 2: Так как система 1С предприятия не учитывает вложенность транзакций, метод «ОтменитьТранзакцию» отменит все транзакции. (21) и этот код вернет: Ошибка использования транзакции - Транзакция не активна |
|||
24
palsergeich
20.11.18
✎
17:52
|
Но особенность реализации: то что НачатьТранзакцию() и ТранзакцияАктивна() - это всего лишь работа со значениями некого счетчика транзакций, а не реальное состояние транзакции.
|
|||
25
palsergeich
20.11.18
✎
17:58
|
У меня так один обмен изза такой штуки пару дней выполнялся без ошибок, но никаких данных в БД не было, а все потому что в один справочник в событие ПриЗаписи человек воткнул Попытка Исключение. А это была последняя строчка в коде -> больше никаких операций с БД не было, соответственно пресловутого В данной транзакции уже происходили ошибки тоже. Просто тихий RollBack. Регламентное УСПЕШНО завершалось, никаких диагностических или других каких либо сообщений не было. Просто тупо не писались данные.
|
|||
26
mexanik_96
20.11.18
✎
17:59
|
зачем вообще писать как в (23)
|
|||
27
Cyberhawk
20.11.18
✎
18:00
|
(23) Из ответа на этот вопрос с экзамена ты неправильный вывод сделал. Конечно же отменять транзакции надо столько же раз, сколько раз их было начато.
|
|||
28
palsergeich
20.11.18
✎
18:00
|
(23) Когда ты в транзакции создаешь элемент справочника - неявно такая структура вызовов и происходит
|
|||
29
Cyberhawk
20.11.18
✎
18:01
|
(26) Это утрированный пример. На самом деле транзакции внутри вложенных процедур могут располагаться. Главное при любом исключении не забывать не только отменять транзакцию, но и вызывать исключение (передавать выше по стеку вызовов), чтобы оно там выше тоже не пыталось зафиксироваться
|
|||
30
mexanik_96
20.11.18
✎
18:02
|
зачем использовать попытки в контексте 1с? чтобы что? не раз приходилось код как в (23), (29) дак нет он в продакшене вполне себе ходит
|
|||
31
palsergeich
20.11.18
✎
18:02
|
(27) А если транзакция уже отменена платформой? Но счетчик в +?
|
|||
32
palsergeich
20.11.18
✎
18:02
|
(30) Некоторые не заморачиваются
|
|||
33
mexanik_96
20.11.18
✎
18:03
|
+(31) еще сверху попытка и пустое исключение.
|
|||
34
Cyberhawk
20.11.18
✎
18:04
|
(31) Оно в любом случае все будет отменено, что в этот пирог попало, но _не при первом минусовании счетчика_
|
|||
35
palsergeich
20.11.18
✎
18:05
|
(27) я не делал никаких выводов, я знаю как правильно.
Но поправлять такое приходится за другими постоянно. |
|||
36
Cyberhawk
20.11.18
✎
18:05
|
(33) Пустое исключение - это у кого писюны вместо пальцев )
Ну в общем случае так, ибо иногда без нескольких вложенных попыток слишком емко получается. |
|||
37
Cyberhawk
20.11.18
✎
18:06
|
(35) А почему на (21) наезжаешь? Из-за нарушения парности "плюс" и "минус"?
|
|||
38
palsergeich
20.11.18
✎
18:07
|
(37) Потому что ТранзакцияАктивна() нельзя верить
|
|||
39
mexanik_96
20.11.18
✎
18:08
|
(36) писюны не то слово, ну да ладно
|
|||
40
palsergeich
20.11.18
✎
18:08
|
Ибо если в своем коде ты уверен что там четко, то то что ошибок, допущенных другими людьми там нет - нет.
|
|||
41
Cyberhawk
20.11.18
✎
18:08
|
(38) Ну она же возвращает "положительность" счетчика. Почему нельзя верить? Никто вроде и не рассчитывает что этот метод говорит о том, будет ли она успешной
|
|||
42
palsergeich
20.11.18
✎
18:10
|
(41) Потому что при (40) ты получишь: Исключительная ситуация — Транзакция не активна.
|
|||
43
palsergeich
20.11.18
✎
18:10
|
А я вот никому не доверяю, ибо случаи были)
|
|||
44
Cyberhawk
20.11.18
✎
18:11
|
(42) Это получит тот кто выше по стеку попытается зафиксировать/откатить, когда счетчик уже выведен в ноль кодом товарища из (21) - Я в этом только косяк вижу того цикла.
|
|||
45
palsergeich
20.11.18
✎
18:11
|
(44) Забей.
|
|||
46
Dzenn
гуру
20.11.18
✎
18:14
|
Разбирайся с транзакциями и убирай лишние вложенные
|
|||
47
palsergeich
20.11.18
✎
18:21
|
(44) Я просто год назад наткнулся на то, что это работало не совсем так как должно, кейс уже не помню, но горело знатно.
По этому я больше не верю ТранзакцияАктивна() ) |
|||
48
palsergeich
20.11.18
✎
18:49
|
Попробовал воспроизвести - сейчас все работает как надо.
Возможно была какая то ошибка платформы. |
|||
49
lamina
20.11.18
✎
18:50
|
(22) друзья, но ведь мы уже в исключении, не имеет уже значения сколько было тразнакций до нас, и сколько выкинуто других исключений, ничего уже зафиксировать не получится, поэтому если нам нужно гарантировано в коде продолжить успешное выполнение операции - нужно всё откатить, и если нужно - опять начать транзакцию заново. Да, есть стандарт 1с, который гласит - заворачивайте всё всё в попытку с откатом, но если раззуть глаза - то становится понятно, это хорошо до тех пор, пока кто-то забыл так сделать и вот тогда - опять "ошибки в транзакции"
|
|||
50
palsergeich
20.11.18
✎
18:54
|
(49) +1. И полностью согласен.
Но я точно помню что этот кусок кода не работал как надо((( Возможно я не очень везучий( Пока ТранзакцияАктивна() Цикл ОтменитьТранзакцию(); КонецЦикла; |
|||
51
nicxxx
20.11.18
✎
19:15
|
(0) для начала читаем здесь:
https://habr.com/post/419715/ а в продолжение - реализуем корректную обработку на всех уровнях вложенности транзакций |
|||
52
Cyberhawk
21.11.18
✎
08:48
|
(49) Отменять в цикле все уровни вложенности можно только если ты уверен, что выше по стеку код не пойдет, в том числе и через год, когда метод, вызвавший ошибку, обрататываемую твоим кодом, не попытается вызвать кто-нибудь другой, кто тоже обернет свой вызов в транзакцию.
Походу защититься от такого "цикличного опустошения" на более верхнем уровне можно, если перед парной "отменой" проверять, активна ли транзакция. |
|||
53
lamina
21.11.18
✎
18:56
|
(52) так мы уже в исключении, даже если код по стеку и пойдет, это уже бесполезно, ни одна транзакция не будет зафиксирована (вложенность транзакций не поддерживается, поэтому их парность - просто счетчик-иллюзия). Кстати в ссылке из 51 в комментарии один чувак ровно об этом и пишет - нечего городить огород из попыток, кроме тех мест, где гарантированно нужно продолжить выполнение операции.
|
|||
54
vi0
21.11.18
✎
20:35
|
(49) "пока кто-то забыл так сделать"
кто-то это кто? |
|||
55
vi0
21.11.18
✎
20:36
|
(53) "даже если код по стеку и пойдет, это уже бесполезно, ни одна транзакция не будет зафиксирована"
По стеку не обязательно нужно идти чтобы зафиксировать транзакцию. |
|||
56
Cyberhawk
21.11.18
✎
21:48
|
(53) Парность надо соблюсти чтобы тот код, что по стеку выше и соблюдающий парность, не споткнулся из-за того, что ты всю парность убил в предлагаемом цикле. Хз с чего ты взял о каком-то успешном завершении транзакции.
|
|||
57
lamina
21.11.18
✎
23:11
|
(56) Опять 25. У вас есть код, который начинает транзакцию и фиксирует ее, парность сохранена, все счастливы? Далее, возникает исключение между начать/зафиксировать, так вот, если что-то по стеку ниже перехватывает исключения, то уже не нужно извините "дрочиться" с парностью, все, поздно, пока не размотаем транзакции, ничего более сделать не получится. Ведь начать (и не отменить/зафиксировать) транзакцию могли сто раз в коде функций между первым начать/зафиксировать. И стандарт спешит на помощь: предлагает там, где есть начать/зафиксировать используйте попытку, чтобы сделать откат. Вот я и говорю - работать такое будет до тех пор, пока кто-то забудет так сделать...и вот ради чего, парности? Если ваш код обрабатывает объекты в транзакции, и вам нужно продолжать выполнение этого кода, если возникает исключение, то вы не можете полагаться на то, что до вас, все транзакции отменили в правильной последовательности. Вы же не считаете, что соблюдая супер- парность, транзакция3 позволит вам зафиксировать изменения, в случае возникновения исключения во вложенной в неё транзакции4? Давайте пример кода и хватит демагогии.
|
|||
58
vi0
22.11.18
✎
04:33
|
(57)
> пока не размотаем транзакции, ничего более сделать не получится. Стандарт не предлагает здесь и сейчас размотать транзакции и продолжить работу, а предлагает эскалировать исключение на верхние вызовы путем выполнения ВызватьИсключение. Т.к. часть записей в БД на верних вызовах уже не будет закомичена, и эти верхние уровни должны об этом знать. > Давайте пример кода и хватит демагогии Примера кода есть в типовых, в частности я привел в (19) А вот что предлагаешь ты разматывая транзакции здесь и сейчас и продолжая работу? |
|||
59
lamina
22.11.18
✎
07:01
|
(58) "Стандарт не предлагает здесь и сейчас размотать транзакции и продолжить работу"
И я этого про стандарт не говорил, читай внимательно: "предлагает там, где есть начать/зафиксировать используйте попытку, чтобы сделать откат". А выброс исключения - это уже дело здравой логики, суть стандарта не в том, чтобы выбросить исключение, а чтобы его перехватить с откатом. "А вот что предлагаешь ты разматывая транзакции здесь и сейчас и продолжая работу?" Я утверждаю, что все белиберда с п.3.6. Почему? 1) Да потому что достаточно в 1 из 100500 мест не сделать так, как велит стандарт (коих тьма тьмущая в типовых), и мы получаем проблему, с которой начался этот топик. 2) Никого не смущает, что в попытку нужно завернуть порядочное количество кода, что уже противоречит другому стандарту? И не завернуть его нельзя, по стандарту 3.6 Ну и самое главное, снова повторю, единственно правильным считаю класть в попытку не все подряд, что начинается с НачатьТранзакцию (твой 3.6 так говорит), а использовать попытку только там, где это нужно с точки зрения прикладной задачи, а в исключении этой попытки - не надеяться, что все другие начать/отменить/зафиксировать были сделаны в порядке вызовов, а самому всё откатить и продолжить работу, начав новую транзакцию или что там по задаче требуется. И не нужно думать ни о какой парности при возникновении ислючения, что за параноя на этот счет, если в 999999ой НачатьТранзакцию выбросилось исключение, вы уже никакими ОткатитьТранзакцию/ЗафиксироватьТранзакцию данные не сохраните в 999998 и т.д. транзакции. "Примера кода есть в типовых, в частности я привел в (19)" Вроде не тебе задавал вопрос, но если ты внимательно посмотришь на типовые, то 3.6 там применяется совсем не чаще чем не применятся. Другими словами, от такого совета ТС ни холодно ни жарко. А если есть претензии к подходу, ответь кодом, а не очередными рассуждениями со ссылками. Пока я вижу что все советы ТС заключаются в том, чтобы он проанализировал 100500 вызовов НачатьТранзакцию типовой конфы и завернул их в 3.6 |
|||
60
Darych
22.11.18
✎
07:36
|
(59) "единственно правильным считаю класть в попытку не все подряд, что начинается с НачатьТранзакцию (твой 3.6 так говорит), а использовать попытку только там, где это нужно с точки зрения прикладной задачи, а в исключении этой попытки - не надеяться..." Ну это еще больше наплодит ошибок. Не понимаю.. Да и вы как-бы сами ТС, в отличие от других, ни одного совета не дали.
|
|||
61
vi0
22.11.18
✎
07:37
|
Так ты приведи свой код, а не очередные рассуждения.
|
|||
62
vi0
22.11.18
✎
07:38
|
Это к (59)
|
|||
63
Cyberhawk
22.11.18
✎
09:18
|
(57) "У вас есть код, который начинает транзакцию и фиксирует ее, парность сохранена, все счастливы? Далее" // Конечно же неправильно. У меня есть код, который фиксацию транзакции и значимую часть оной делает внутри попытки, а откат - в искючении.
|
|||
64
Cyberhawk
22.11.18
✎
09:19
|
Я так понял ты топишь за то, что (63) не поможет там, где исключение возникло в подчиненных методах и не было проброшено назад
|
|||
65
Сияющий в темноте
22.11.18
✎
11:44
|
Вызывать исключения наверх тоже не всегда хорошо-в 1с нет возможности указания возврата исключений функцией.
Возвращать нужно код ошибки,чтобы при использовании функции в программе было ясно,где и какая ошибка произошла,а не плодить лишние Попытка-Исключение |
|||
66
xaozai
22.11.18
✎
12:06
|
(0) Проблема в том, что слишком часто используется Попытка Исключение КонецПопытки;
В большинстве случаев проверки на корректность и т.п. можно и нужно делать другими способами. А Попытку-Исключение можно использовать в тех случаях, когда выполняются какие-то действия, где проверку средствами платформы проблематично сделать. Например, при записи/чтении файла, когда нет уверенности в наличие прав, или при создании COM-объекта и т.п. |
|||
67
Сияющий в темноте
22.11.18
✎
12:13
|
Проблема в том,что даже запись обьекта в базе бросает исключение,хотя можно было бы возвращать код ошибки.
|
|||
68
vi0
23.11.18
✎
13:55
|
(59) так будет пример кода с разматыванием транзакций, например, для такого случая:
1 НачатьТранзакцию() 2 Объект1.Записать() 3 НачатьТранзакцию() 5 Объект2.Записать() 4 Объект3.Записать() - случилась ошибка при записи Как нужно поступить после строки 4? |
|||
69
Cyberhawk
23.11.18
✎
21:49
|
(68) Один раз вызвать исключение
|
|||
70
lamina
23.11.18
✎
22:01
|
(68) в твоем примере нет перехвата исключения, поэтому ошибки "в этой транзакции уже были ошибки" не будет, поэтому вопрос я не понял.
Но попробую. Какую проблему мы обсуждаем? Мы обсуждаем вот что: как правильно перехватывать ошибки любого рода, хоть деление на 0, которые происходят в транзакции. Верно? То есть мы говорим не о НачатьТранзакцию в принципе, а тех, совершенно конкретных участках кода, где нам очень-очень нужно что-то обрабатывать (в цикле проводить доки, например) и делать это в транзакции. Так? Не знаю как тебе, но я говорю именно о таких случаях. Ну и вот, в этих участках кода, на следующей строке после "Попытка" мы запускаем какой-то код, который понаоткрывает транзакций, и который в общем случае их за собой не закроет (и не должен!). И в этом конкретном участке кода, следующей строкой по "Исключение", учитывая тот факт, что транзакции вложенными быть не могут, нужно отмотать все, и заново начать транзакцию, если это что-то в цикле, или отменить, в зависимости от задачи. Возвращаясь к вопросу "Как нужно поступить после строки 4?" - никак, будет исключение, все отменится и все будет хорошо. А теперь вишинка: если мы четвертую строку обернем в попытку и там будет исключение, то что бы мы не делали, Обеъект2.Записать () - в базе не появится! При том, что метод ЗафиксироватьТранзакцию () в какой-нибудь 5 или 6 строке отработает. Поэтому я в очередной раз утверждаю, что цикл размотки транзакций (см. 21) самый практичный подход. |
|||
71
youalex
23.11.18
✎
22:19
|
(68) После строки 4 уже никак не поступить. Ибо выполнение кода прервано по ошибке. ЗафиксироватьТранзакцию() не сыграло
|
|||
72
vi0
24.11.18
✎
07:03
|
(70) > Мы обсуждаем вот что: как правильно перехватывать ошибки любого рода, хоть деление на 0, которые происходят в транзакции. Верно?
Нет не верно. Перехват деления на ноль не будет провоцировать ошибку "В транзакции уже происходили.." и можно будет зафиксировать транзакцию. не понятны твои рассуждения что код не должен закрывать свои транзакции и причем здесь проведение документов в цикле? не вижу, что об этом был разговор ты так и не привел пример программного кода покажи кодом что ты будешь делать в примере (68) |
|||
73
Cyberhawk
24.11.18
✎
10:35
|
Я понял автора (70) - он про случаи, когда надо "и рыбку съесть, и костями не подавиться" :) Т.е. когда идет пакетная транзакция и из-за ошибки записи одного из объектов не хочется отлуп всем остальным в пакете делать.
|
|||
74
vde69
24.11.18
✎
11:15
|
если код не в глобальной транзакции то делать надо так
Попытка НачатьТранзакцию(); НаборЗаписей.Записать(Ложь); ЗафиксироватьТранзакцию(); Исключение если транзакцияактивна() тогда отменитьтранзакцию() конецесли; ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ДанныеФизическогоЛица.ФизическоеЛицо + "уже существует ЛС по зарплатному проекту " + ДанныеФизическогоЛица.ЗарплатныйПроект); КонецПопытки; |
|||
75
vi0
24.11.18
✎
11:43
|
(73) > и костями не подавиться
это в лучшем случае |
|||
76
vi0
24.11.18
✎
11:44
|
(65) > Вызывать исключения наверх тоже не всегда хорошо
кстати не обязательно вызывать исключение можно просто протаскивать флаг ошибки через функции тот же пресловутый "Отказ" |
|||
77
Остап Сулейманович
24.11.18
✎
11:49
|
(76) "можно просто протаскивать флаг ошибки через функции"
Знать бы еще сколько таких флагов на каждом уровне вложенности иметь нужно... |
|||
78
Остап Сулейманович
24.11.18
✎
11:51
|
+ (77) В "классике" ошибка должна быть обработана на том уровне, где она возникла. А на верх должен передаваться результат выполнения.
|
|||
79
vi0
24.11.18
✎
11:53
|
(78) а если ошибка критичная, которая прервала транзакцию?
|
|||
80
Рэйв
24.11.18
✎
11:53
|
(0)Не делать вложенности попыток
.Эти заразы самый нижний кетч считают себе исключением...ВСЕ высшие Попытка будут закрыты одним нижним Исключене.. |
|||
81
Остап Сулейманович
24.11.18
✎
11:58
|
(78) Я конечно понимаю, что у 1С свое понятие об инкапсуляции. Но все же. Вызывая функцию из вашей библиотеки я не должен знать что и как у вас там внутри устроено. Я должен знать только за успешное/не успешное выполнение. Описалово проблемы в случае неуспешного вызова вложенной функции должно идти бонусом. И все исключения вложенного уровня должны быть там же и обработаны. Поскольку в общем случае я могу и не знать как обрабатывать ваши исключения.
|
|||
82
Рэйв
24.11.18
✎
12:00
|
(81)>>что у 1С свое понятие об инкапсуляции
Поподробнее об инкапсуляции в 1с можно?:) |
|||
83
Рэйв
24.11.18
✎
12:01
|
(81)Жаль конечно, но 1С тебе ничего не должна:-)
|
|||
84
Рэйв
24.11.18
✎
12:02
|
(81)Ну так что там у нас инкапсулируется в 1С? Или ты просто пи@бол?
|
|||
85
Остап Сулейманович
24.11.18
✎
12:03
|
(82) Ну... Допустим объекты ИнтернетПочта.
|
|||
86
Рэйв
24.11.18
✎
12:03
|
(85) ХА. Три раза
|
|||
87
Остап Сулейманович
24.11.18
✎
12:04
|
(84) Ой... Ты не знал за инкапсулированные объекты в 1с? Ну типа ИнтернетСоединение или там... DOM?
|
|||
88
Рэйв
24.11.18
✎
12:06
|
(87)Это хрень, которую интерфейсами 1С дает :
-)) |
|||
89
Остап Сулейманович
24.11.18
✎
12:06
|
(86) Ага. Кроме таких аргументов нет?
"Или ты просто пи@бол?" ЦЫ из (64)? |
|||
90
Рэйв
24.11.18
✎
12:07
|
Это точно не инкапсуляция:-)
|
|||
91
Остап Сулейманович
24.11.18
✎
12:07
|
(88) Ага. То есть за инкапсуляцию понятие = "0"... Пичаль.
|
|||
92
Рэйв
24.11.18
✎
12:08
|
(89)Инкапсуляция, это если я могу сделать свой класс...
|
|||
93
Рэйв
24.11.18
✎
12:08
|
Как минимум
|
|||
94
Рэйв
24.11.18
✎
12:08
|
И в этот класс инкапсулировать свои процедуры
|
|||
95
Рэйв
24.11.18
✎
12:09
|
твк что я как одинесник хотел бы этого, но...
|
|||
96
Рэйв
24.11.18
✎
12:10
|
Не судьба
|
|||
97
Остап Сулейманович
24.11.18
✎
12:10
|
(92) "если я могу сделать свой класс."
А если ты пользуешься чужими классами с закрытой реализацией то это что? |
|||
98
Рэйв
24.11.18
✎
12:11
|
(97)Чужая реализация - это чужие команды. Учить можно но не очень приятно
|
|||
99
Остап Сулейманович
24.11.18
✎
12:11
|
(94) "И в этот класс инкапсулировать свои процедуры"
Я не знаю как это называется в ваших этих интернетах... Но как только я могу модифицировать класс своими свойствами и/или методами - в наших интернетах это называется полиморфимзм. |
|||
100
Рэйв
24.11.18
✎
12:14
|
(99)ну ка дай определение Полиморфизм?
|
|||
101
Остап Сулейманович
24.11.18
✎
12:14
|
(98) ГЫ. "Учить можно но не очень приятно"
Реализация класса в большинстве случаев закрыта. И "Учить" ты можешь только вызов публичных методов. И не можешь "учить" вызовы приватных. Ну да бог с ним... |
|||
102
Рэйв
24.11.18
✎
12:15
|
не гугли..Быстродавай:-)
|
|||
103
Остап Сулейманович
24.11.18
✎
12:15
|
(100) Поищи в своих интернетах. Там должно было быть.
|
|||
104
Рэйв
24.11.18
✎
12:17
|
(103)конечно должно быть. я и так знаю.
Только ты нуб в программировании и не надо тут из себя строить |
|||
105
Darych
24.11.18
✎
12:17
|
Пиписки одинаковые... можно убирать
|
|||
106
Рэйв
24.11.18
✎
12:17
|
:-)
|
|||
107
Рэйв
24.11.18
✎
12:18
|
(105)У него в программинге вообще пипски нет.
|
|||
108
Остап Сулейманович
24.11.18
✎
12:19
|
(107) Ну все. Ты конечно первый переТц. Хоть и не в курсе за инкапсуляцию. Ну то такое...
|
|||
109
Рэйв
24.11.18
✎
12:21
|
(108)Я даже знаю что такое инкапсуляция. Но тебе не скажу.Сам учись:-)
|
|||
110
Остап Сулейманович
24.11.18
✎
12:25
|
(109) Когда для объекта ДокументDOM выкатишь реализацию метода ВставитьПеред() - продолжим. А пока (с учетом (98)) - ты то что прописано в (84).
|
|||
111
Рэйв
24.11.18
✎
12:32
|
>>реализацию метода ВставитьПеред()
Это как раз наследование:-) |
|||
112
Рэйв
24.11.18
✎
12:32
|
Ну продолжай...
|
|||
113
Остап Сулейманович
24.11.18
✎
12:37
|
(111) Реализация = наследование? Такого я еще не слышал...
Впечатление такое, что на форуме бот с произвольной генерацией текста... |
|||
114
Рэйв
24.11.18
✎
12:39
|
(113)>> Реализация = наследование
Да запросто. |
|||
115
Рэйв
24.11.18
✎
12:39
|
Мне интересны твои доводы против:-)
|
|||
116
Остап Сулейманович
24.11.18
✎
12:40
|
(114) Я уже не удивляюсь.
|
|||
117
Рэйв
24.11.18
✎
12:40
|
(116)Естественно.Ты идешь паситсь:-))
|
|||
118
Рэйв
24.11.18
✎
12:40
|
Пастись и есть траву:-))
|
|||
119
Остап Сулейманович
24.11.18
✎
12:41
|
(117) А кроме хамства еще какие-нибудь аргументы есть?
|
|||
120
Рэйв
24.11.18
✎
12:42
|
(119)У меня тоесть.А у тебя нет.
|
|||
121
vi0
24.11.18
✎
12:42
|
кто пустил детей в интернеты
|
|||
122
Рэйв
24.11.18
✎
12:43
|
(121)Они там живут(дети),сволочи..
|
|||
123
lamina
24.11.18
✎
18:31
|
(74) Ты пишешь: "если код не в глобальной транзакции то делать надо так". Можно получить объяснения, зачем? Не словами, а примером кода, который не будет работать, если это правило не соблюсти.
Все что я смог по этому поводу, уже написал, повторяю: пример кода был в 21, а твой случай 68 - ничего там делать не нужно, поэтому примера кода нет. |
|||
124
Конструктор1С
24.11.18
✎
18:41
|
Учись юзать ВызватьИсключение
|
|||
125
vde69
24.11.18
✎
20:30
|
(123) понимаешь в чем дело, в 1с нет стека транзакций и флаг отката транзакции он глобальный, то есть без разнице на каком уровне произошла ошибка ты не сможешь откатить или зафиксировать одну транзакию внутри другой.
по этому код в (21) это банально мусор... теперь объясняю почему 74 правильно: запись документа - это не явная транзакция и если в ней происходит ошибка то она взводит глобальный флаг ошибкитранзакции, и по этому если в ней произошла ошибка надо явным образом откатить транзакцию верхнего уровня, или вообще не надо делать верхнюю транзакцию |
|||
126
vi0
25.11.18
✎
13:19
|
кстати, кто там говорил что в типовых не ипользуется эскалация исключения (ВызватьИсключение;)
посмотрите ут11 - на каждом шагу |
|||
127
Остап Сулейманович
25.11.18
✎
14:00
|
(126) Всему должно быть место и время.
То, что исключение должно быть обработано на своем уровне изоляции - это да. Но вот такой пример. Из моей практики. Обращение к ВЕБ-Сервису с передачей некорректных параметров. Теоретически возможно проанализировать параметры, обработать и вернуть допустим код ошибки. Вроде все правильно. НО. В таком варианте ошибка самого ВЕБ-сервиса будет неотличима от ошибки на вызывающей стороне. Потому в модуле ВЕБ-сервиса вызывается такая вот фигня : ВызватьИсключение "Трам пам пам"; И тогда ошибка вызывающей стороны диагностированная в ВЕБ-сервиса вызовет исключение не у себя в модуле, а передаст выше по стеку вызовов. |
|||
128
Остап Сулейманович
25.11.18
✎
14:01
|
+ (127) А по поводу транзакций - вот здесь https://its.1c.ru/db/metod8dev#content:2313:hdoc все от "создателя".
|
|||
129
vi0
25.11.18
✎
14:30
|
(128) тут вопросов нет
|
|||
130
vi0
25.11.18
✎
14:30
|
(127) чет не понял, что ты сказать хотел
|
|||
131
Остап Сулейманович
25.11.18
✎
15:00
|
(130) Насчет кидать исключения наверх или нет.
1. Стараться не кидать. 2. Смотреть по обстоятельствам. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |