Вход | Регистрация

  1  2   
1С:Предприятие :: 1С:Предприятие 8 общая

Как победить ошибку "В данной транзакции уже происходили ошибки"

Как победить ошибку "В данной транзакции уже происходили ошибки"
Я
   ildary
 
20.11.18 - 14:33
Уважаемые специалисты, посоветуйте пожалуйста, как правильно в КА2 исправить появление вот такой ошибки:

Добавленный в КА2 2.4.5.86 документ при проведении делает следующее (документ не мой, делали до меня):

Вызывается процедура в которой происходит запись в РС примерно так:

    НачатьТранзакцию();
    
    Попытка
        НаборЗаписей.Записать(Ложь);
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ДанныеФизическогоЛица.ФизическоеЛицо + "уже существует ЛС по зарплатному проекту " + ДанныеФизическогоЛица.ЗарплатныйПроект);
    КонецПопытки;

    ЗафиксироватьТранзакцию(); 

При выполнении ОбщегоНазначенияКлиентСервер.СообщитьПользователю() появляется ошибка. Я погуглил и решил отказать от транзакции вообще (т.к. проведение уже вызывает транзакцию) - не помогло. Попробовал делать транзакцию как советует ИТС:

        НачатьТранзакцию();
        
        Попытка
            
            НаборЗаписей.Записать(Ложь);
            ЗафиксироватьТранзакцию(); 
            
        Исключение
            
            ОтменитьТранзакцию();
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ДанныеФизическогоЛица.ФизическоеЛицо + "уже существует ЛС по зарплатному проекту " + ДанныеФизическогоЛица.ЗарплатныйПроект);
            
        КонецПопытки;


тоже не помогло.

Увидел в интернете, что корень зла в том, что во всём виновата обработка исключения сделал вот так:

        ЕстьОшибка = Истина;
        Попытка
            
            НаборЗаписей.Записать(Ложь);
            ЕстьОшибка = Ложь;
            
        Исключение
        КонецПопытки;
        
        Если ЕстьОшибка Тогда
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ДанныеФизическогоЛица.ФизическоеЛицо + "уже существует ЛС по зарплатному проекту " + ДанныеФизическогоЛица.ЗарплатныйПроект);
        КонецЕсли;


тоже не помогло. Сижу, чешу репу. Наверное самое правильное - вообще убрать попытку, но тогда как ловить ошибку записи в РС?
 
 
   laeg
 
1 - 20.11.18 - 14:35
Ловить ошибку программно, написать запрос с проверкой на существование данных записей.
   H A D G E H O G s
 
2 - 20.11.18 - 14:36
ЕстьОшибка = Истина;
        Попытка

ПредставлениеСотрудника=Строка(ДанныеФизическогоЛица.ФизическоеЛицо);
ПредставлениеЗарплатныйПроект=Строка(ДанныеФизическогоЛица.ЗарплатныйПроект);


Если ЕстьОшибка Тогда
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ПредставлениеСотрудника + "уже существует ЛС по зарплатному проекту " + ПредставлениеЗарплатныйПроект);
        КонецЕсли;
   youalex
 
3 - 20.11.18 - 14:47
(0) немного не в тему..

>>при проведении// 1-я транзакция


>>..Вызывается...: НачатьТранзакцию();//- 2-я транзакция


Вот интересно, учитывая что во вложенные транзакции 1С не умеет, какую транзакцию фиксирует вот этот код: 
 НаборЗаписей.Записать(Ложь);
 ЗафиксироватьТранзакцию(); 

По идее,  нужно в процедуре объявлять переменную ТранзакцияАктивна = ТранзакцияАктивна() и фиксировать/отменять с условием по ней.
   mexanik_96
 
4 - 20.11.18 - 14:52
баги нужно исправлять, а не гасить ексепшены. писать код в попытке(в контексте 1с) говорит о не уверенности что код будет работать
   ildary
 
5 - 20.11.18 - 14:54
(3) в этом месте всегда будет транзакция - т.к эта процедура вызывается только из проведения.

(4) я вообще не понимаю, зачем надо было так делать, но не могу связаться с разработчиком и вынужден придумывать сам.
   mexanik_96
 
6 - 20.11.18 - 14:57
(5) дак у тебя несколько одинаковых записей пытается записать
   mexanik_96
 
7 - 20.11.18 - 14:58
+(6) нужно либо добавить уникальности, либо потрассировать код и посмотреть почему откуда и зачем одинаковые записи приходят
   ildary
 
8 - 20.11.18 - 15:24
(6) идея интересная, но в наборе только 1 запись - проверил в отладчике. Может ли быть проблема, если при этом одно из измерений - пустое? При этом в его свойствах нет требования заполненности.
   Eiffil123
 
9 - 20.11.18 - 15:39
(3) Проблем в этом нет. Просто вложенная транзакция не открывается.
   Малыш Джон
 
10 - 20.11.18 - 15:42
(0) что такое ДанныеФизическогоЛица? ссылка?
тогда конечно будет ошибка, ты после генерации исключения пытаешься разыменовать ссылку.
 
 Рекламное место пустует
   youalex
 
11 - 20.11.18 - 15:42
(9) да, получается, каждое НачатьТранзакцию() увеличивает счетчик транзакций на 1, а ЗафиксироватьТранзакцию() - уменьшает на 1, и реальная фиксация происходит когда счетчик = 1. Отбой, короче)
   Малыш Джон
 
12 - 20.11.18 - 15:43
(11) именно так
   Вафель
 
13 - 20.11.18 - 15:45
при проведении никак нельзя записывать с ошибкой, а потом что-то делать еще
   Cyberhawk
 
14 - 20.11.18 - 15:47
Сколько платят за решение вопроса?
   Вафель
 
15 - 20.11.18 - 15:48
(14) уже решили же
   palsergeich
 
16 - 20.11.18 - 15:49
С волженными транзакциями надо аккуратно.
+ Пихать везде попытка Исключение - ведет ладно к таким ошибкам. Тут хоть сообщение есть. А могут быть и более интересные штуки...
   ildary
 
17 - 20.11.18 - 15:57
(16) если я правильно понял, то вложенные транзакции лучше не делать вообще. Для случая в (0) - я её (транзакцию) убрал и сделал вместо НаборЗаписей.Записать(Ложь) так: сначала проверяю - есть запись или нет, и если есть, то делаю НаборЗаписей.Записать(Истина)
   vi0
 
18 - 20.11.18 - 17:21
(17) делай вложенные транзакции скок хошь
главное грамотно всё делай
   vi0
 
19 - 20.11.18 - 17:23
   1Сергей
 
20 - 20.11.18 - 17:27
(18) +1
Описания исключений сделай внятные
   lamina
 
21 - 20.11.18 - 17:40
попробуй после исключение, следующей строкой добавить:
Пока ТранзакцияАктивна() Цикл
  ОтменитьТранзакцию();
КонецЦикла;
   palsergeich
 
22 - 20.11.18 - 17:44
(21) И вот тут большой костыль)
Транзакция уже в откате из-за ошибки. А транзакция активна вернет ИСТИНА.
Это мега грабли.
   palsergeich
 
23 - 20.11.18 - 17:50
Вопрос из билета 1сЭксперт 
Вопрос 2

Код конфигурации содержит следующий фрагмент:

НачатьТранзакцию();

            Процедура1();

            НачатьТранзакцию();

                        Процедура2();

                        НачатьТранзакцию();

                        Процедура3();

                        ОтменитьТранзакцию();

Какие действия будут отменены в результате выполнения функции ОтменитьТранзакцию() в 7 строке.
Ответ на вопрос 2:

Так как система 1С предприятия не учитывает вложенность транзакций, метод «ОтменитьТранзакцию» отменит все транзакции.
(21) и этот код вернет: Ошибка использования транзакции - Транзакция не активна
   palsergeich
 
24 - 20.11.18 - 17:52
Но особенность реализации: то что НачатьТранзакцию() и ТранзакцияАктивна() - это всего лишь работа со значениями некого счетчика транзакций, а не реальное состояние транзакции.
   palsergeich
 
25 - 20.11.18 - 17:58
У меня так один обмен изза такой штуки пару дней выполнялся без ошибок, но никаких данных в БД не было, а все потому что в один справочник в событие ПриЗаписи человек воткнул Попытка Исключение. А это была последняя строчка в коде -> больше никаких операций с БД не было, соответственно пресловутого В данной транзакции уже происходили ошибки тоже. Просто тихий RollBack. Регламентное УСПЕШНО завершалось, никаких диагностических или других каких либо сообщений не было. Просто тупо не писались данные.
   mexanik_96
 
26 - 20.11.18 - 17:59
зачем вообще писать как в (23)
   Cyberhawk
 
27 - 20.11.18 - 18:00
(23) Из ответа на этот вопрос с экзамена ты неправильный вывод сделал. Конечно же отменять транзакции надо столько же раз, сколько раз их было начато.
   palsergeich
 
28 - 20.11.18 - 18:00
(23) Когда ты в транзакции создаешь элемент справочника - неявно такая структура вызовов и происходит
   Cyberhawk
 
29 - 20.11.18 - 18:01
(26) Это утрированный пример. На самом деле транзакции внутри вложенных процедур могут располагаться. Главное при любом исключении не забывать не только отменять транзакцию, но и вызывать исключение (передавать выше по стеку вызовов), чтобы оно там выше тоже не пыталось зафиксироваться
   mexanik_96
 
30 - 20.11.18 - 18:02
зачем использовать попытки в контексте 1с? чтобы что? не раз приходилось код как в (23), (29) дак нет он в продакшене вполне себе ходит
   palsergeich
 
31 - 20.11.18 - 18:02
(27) А если транзакция уже отменена платформой? Но счетчик в +?
   palsergeich
 
32 - 20.11.18 - 18:02
(30) Некоторые не заморачиваются
   mexanik_96
 
33 - 20.11.18 - 18:03
+(31) еще сверху попытка и пустое исключение.
 
 
   Cyberhawk
 
34 - 20.11.18 - 18:04
(31) Оно в любом случае все будет отменено, что в этот пирог попало, но _не при первом минусовании счетчика_
   palsergeich
 
35 - 20.11.18 - 18:05
(27) я не делал никаких выводов, я знаю как правильно.
Но поправлять такое приходится за другими постоянно.
   Cyberhawk
 
36 - 20.11.18 - 18:05
(33) Пустое исключение - это у кого писюны вместо пальцев )
Ну в общем случае так, ибо иногда без нескольких вложенных попыток слишком емко получается.
   Cyberhawk
 
37 - 20.11.18 - 18:06
(35) А почему на (21) наезжаешь? Из-за нарушения парности "плюс" и "минус"?
   palsergeich
 
38 - 20.11.18 - 18:07
(37) Потому что ТранзакцияАктивна() нельзя верить
   mexanik_96
 
39 - 20.11.18 - 18:08
(36) писюны не то слово, ну да ладно
   palsergeich
 
40 - 20.11.18 - 18:08
Ибо если в своем коде ты уверен что там четко, то то что ошибок, допущенных другими людьми там нет - нет.
   Cyberhawk
 
41 - 20.11.18 - 18:08
(38) Ну она же возвращает "положительность" счетчика. Почему нельзя верить? Никто вроде и не рассчитывает что этот метод говорит о том, будет ли она успешной
   palsergeich
 
42 - 20.11.18 - 18:10
(41) Потому что при (40) ты получишь: Исключительная ситуация — Транзакция не активна.
   palsergeich
 
43 - 20.11.18 - 18:10
А я вот никому не доверяю, ибо случаи были)
   Cyberhawk
 
44 - 20.11.18 - 18:11
(42) Это получит тот кто выше по стеку попытается зафиксировать/откатить, когда счетчик уже выведен в ноль кодом товарища из (21) - Я в этом только косяк вижу того цикла.
   palsergeich
 
45 - 20.11.18 - 18:11
(44) Забей.
   Dzenn
 
46 - 20.11.18 - 18:14
Разбирайся с транзакциями и убирай лишние вложенные
   palsergeich
 
47 - 20.11.18 - 18:21
(44) Я просто год назад наткнулся на то, что это работало не совсем так как должно, кейс уже не помню, но горело знатно.
По этому я больше не верю ТранзакцияАктивна() )
   palsergeich
 
48 - 20.11.18 - 18:49
Попробовал воспроизвести - сейчас все работает как надо.
Возможно была какая то ошибка платформы.
   lamina
 
49 - 20.11.18 - 18:50
(22) друзья, но ведь мы уже в исключении, не имеет уже значения сколько было тразнакций до нас, и сколько выкинуто других исключений, ничего уже зафиксировать не получится, поэтому если нам нужно гарантировано в коде продолжить успешное выполнение операции - нужно всё откатить, и если нужно - опять начать транзакцию заново. Да, есть стандарт 1с, который гласит - заворачивайте всё всё в попытку с откатом, но если раззуть глаза - то становится понятно, это хорошо до тех пор, пока кто-то забыл так сделать и вот тогда - опять "ошибки в транзакции"
 
 Рекламное место пустует
   palsergeich
 
50 - 20.11.18 - 18:54
(49) +1. И полностью согласен.
Но я точно помню что этот кусок кода не работал как надо((( Возможно я не очень везучий(
Пока ТранзакцияАктивна() Цикл
  ОтменитьТранзакцию();
КонецЦикла;
   nicxxx
 
51 - 20.11.18 - 19:15
(0) для начала читаем здесь:
https://habr.com/post/419715/
а в продолжение - реализуем корректную обработку на всех уровнях вложенности транзакций
   Cyberhawk
 
52 - 21.11.18 - 08:48
(49) Отменять в цикле все уровни вложенности можно только если ты уверен, что выше по стеку код не пойдет, в том числе и через год, когда метод, вызвавший ошибку, обрататываемую твоим кодом, не попытается вызвать кто-нибудь другой, кто тоже обернет свой вызов в транзакцию.
Походу защититься от такого "цикличного опустошения" на более верхнем уровне можно, если перед парной "отменой" проверять, активна ли транзакция.
   lamina
 
53 - 21.11.18 - 18:56
(52) так мы уже в исключении, даже если код по стеку и пойдет, это уже бесполезно, ни одна транзакция не будет зафиксирована (вложенность транзакций не поддерживается, поэтому их парность - просто счетчик-иллюзия). Кстати в ссылке из 51 в комментарии один чувак ровно об этом и пишет - нечего городить огород из попыток, кроме тех мест, где гарантированно нужно продолжить выполнение операции.
   vi0
 
54 - 21.11.18 - 20:35
(49) "пока кто-то забыл так сделать"
кто-то это кто?
   vi0
 
55 - 21.11.18 - 20:36
(53) "даже если код по стеку и пойдет, это уже бесполезно, ни одна транзакция не будет зафиксирована"
По стеку не обязательно нужно идти чтобы зафиксировать транзакцию.
   Cyberhawk
 
56 - 21.11.18 - 21:48
(53) Парность надо соблюсти чтобы тот код, что по стеку выше и соблюдающий парность, не споткнулся из-за того, что ты всю парность убил в предлагаемом цикле. Хз с чего ты взял о каком-то успешном завершении транзакции.
   lamina
 
57 - 21.11.18 - 23:11
(56) Опять 25. У вас есть код, который начинает транзакцию и фиксирует ее, парность сохранена, все счастливы? Далее, возникает исключение между начать/зафиксировать, так вот, если что-то по стеку ниже перехватывает исключения, то уже не нужно извините "дрочиться" с парностью, все, поздно, пока не размотаем транзакции, ничего более сделать не получится. Ведь начать (и не отменить/зафиксировать) транзакцию могли сто раз в коде функций между первым начать/зафиксировать. И стандарт спешит на помощь: предлагает там, где есть начать/зафиксировать используйте попытку, чтобы сделать откат. Вот я и говорю - работать такое будет до тех пор, пока кто-то забудет так сделать...и вот ради чего, парности? Если ваш код обрабатывает объекты в транзакции, и вам нужно продолжать выполнение этого кода, если возникает исключение, то вы не можете полагаться на то, что до вас, все транзакции отменили в правильной последовательности. Вы же не считаете, что соблюдая супер- парность, транзакция3 позволит вам зафиксировать изменения, в случае возникновения исключения во вложенной в неё транзакции4? Давайте пример кода и хватит демагогии.
   vi0
 
58 - 22.11.18 - 04:33
(57)
> пока не размотаем транзакции, ничего более сделать не получится.
Стандарт не предлагает здесь и сейчас размотать транзакции и продолжить работу, а предлагает эскалировать исключение на верхние вызовы путем выполнения ВызватьИсключение. Т.к. часть записей в БД на верних вызовах уже не будет закомичена, и эти верхние уровни должны об этом знать.

> Давайте пример кода и хватит демагогии
Примера кода есть в типовых, в частности я привел в (19)
А вот что предлагаешь ты разматывая транзакции здесь и сейчас и продолжая работу?
   lamina
 
59 - 22.11.18 - 07:01
(58) "Стандарт не предлагает здесь и сейчас размотать транзакции и продолжить работу"

И я этого про стандарт не говорил, читай внимательно: "предлагает там, где есть начать/зафиксировать используйте попытку, чтобы сделать откат". А выброс исключения - это уже дело здравой логики, суть стандарта не в том, чтобы выбросить исключение, а чтобы его перехватить с откатом.

"А вот что предлагаешь ты разматывая транзакции здесь и сейчас и продолжая работу?"
Я утверждаю, что все белиберда с п.3.6. Почему?
1) Да потому что достаточно в 1 из 100500 мест не сделать так, как велит стандарт (коих тьма тьмущая в типовых), и мы получаем проблему, с которой начался этот топик.
2) Никого не смущает, что в попытку нужно завернуть порядочное количество кода, что уже противоречит другому стандарту? И не завернуть его нельзя, по стандарту 3.6
Ну и самое главное, снова повторю, единственно правильным считаю класть в попытку не все подряд, что начинается с НачатьТранзакцию (твой 3.6 так говорит), а использовать попытку только там, где это нужно с точки зрения прикладной задачи, а в исключении этой попытки - не надеяться, что все другие начать/отменить/зафиксировать были сделаны в порядке вызовов, а самому всё откатить и продолжить работу, начав новую транзакцию или что там по задаче требуется. И не нужно думать ни о какой парности при возникновении ислючения, что за параноя на этот счет, если в 999999ой НачатьТранзакцию выбросилось исключение, вы уже никакими ОткатитьТранзакцию/ЗафиксироватьТранзакцию данные не сохраните в 999998 и т.д. транзакции.

"Примера кода есть в типовых, в частности я привел в (19)"
Вроде не тебе задавал вопрос, но если ты внимательно посмотришь на типовые, то 3.6 там применяется совсем не чаще чем не применятся. Другими словами, от такого совета ТС ни холодно ни жарко.
А если есть претензии к подходу, ответь кодом, а не очередными рассуждениями со ссылками. Пока я вижу что все советы ТС заключаются в том, чтобы он проанализировал 100500 вызовов НачатьТранзакцию типовой конфы и завернул их в 3.6
   Darych
 
60 - 22.11.18 - 07:36
(59) "единственно правильным считаю класть в попытку не все подряд, что начинается с НачатьТранзакцию (твой 3.6 так говорит), а использовать попытку только там, где это нужно с точки зрения прикладной задачи, а в исключении этой попытки - не надеяться..." Ну это еще больше наплодит ошибок. Не понимаю.. Да и вы как-бы сами ТС, в отличие от других, ни одного совета не дали.
   vi0
 
61 - 22.11.18 - 07:37
Так ты приведи свой код, а не очередные рассуждения.
   vi0
 
62 - 22.11.18 - 07:38
Это к (59)
   Cyberhawk
 
63 - 22.11.18 - 09:18
(57) "У вас есть код, который начинает транзакцию и фиксирует ее, парность сохранена, все счастливы? Далее" // Конечно же неправильно. У меня есть код, который фиксацию транзакции и значимую часть оной делает внутри попытки, а откат - в искючении.
   Cyberhawk
 
64 - 22.11.18 - 09:19
Я так понял ты топишь за то, что (63) не поможет там, где исключение возникло в подчиненных методах и не было проброшено назад
   Сияющий в темноте
 
65 - 22.11.18 - 11:44
Вызывать исключения наверх тоже не всегда хорошо-в 1с нет возможности указания возврата исключений функцией.
Возвращать нужно код ошибки,чтобы при использовании функции в программе было ясно,где и какая ошибка произошла,а не плодить лишние Попытка-Исключение
   xaozai
 
66 - 22.11.18 - 12:06
(0) Проблема в том, что слишком часто используется Попытка Исключение КонецПопытки;
В большинстве случаев проверки на корректность и т.п. можно и нужно делать другими способами.
А Попытку-Исключение можно использовать в тех случаях, когда выполняются какие-то действия, где проверку средствами платформы проблематично сделать. Например, при записи/чтении файла, когда нет уверенности в наличие прав, или при создании COM-объекта и т.п.
   Сияющий в темноте
 
67 - 22.11.18 - 12:13
Проблема в том,что даже запись обьекта в базе бросает исключение,хотя можно было бы возвращать код ошибки.
   vi0
 
68 - 23.11.18 - 13:55
(59) так будет пример кода с разматыванием транзакций, например, для такого случая:

1 НачатьТранзакцию()
2 Объект1.Записать()
3    НачатьТранзакцию()
5    Объект2.Записать() 
4    Объект3.Записать() - случилась ошибка при записи

Как нужно поступить после строки 4?
   Cyberhawk
 
69 - 23.11.18 - 21:49
(68) Один раз вызвать исключение
   lamina
 
70 - 23.11.18 - 22:01
(68) в твоем примере нет перехвата исключения, поэтому ошибки "в этой транзакции уже были ошибки" не будет, поэтому вопрос я не понял.
Но попробую. Какую проблему мы обсуждаем? Мы обсуждаем вот что: как правильно перехватывать ошибки любого рода, хоть деление на 0, которые происходят в транзакции. Верно?
То есть мы говорим не о НачатьТранзакцию в принципе, а тех, совершенно конкретных участках кода, где нам очень-очень нужно что-то обрабатывать (в цикле проводить доки, например) и делать это в транзакции. Так? Не знаю как тебе, но я говорю именно о таких случаях. Ну и вот, в этих участках кода, на следующей строке после "Попытка" мы запускаем какой-то код, который понаоткрывает транзакций, и который в общем случае их за собой не закроет (и не должен!). И в этом конкретном участке кода, следующей строкой по "Исключение", учитывая тот факт, что транзакции вложенными быть не могут, нужно отмотать все, и заново начать транзакцию, если это что-то в цикле, или отменить, в зависимости от задачи.
Возвращаясь к вопросу "Как нужно поступить после строки 4?" - никак, будет исключение, все отменится и все будет хорошо.

А теперь вишинка: если мы четвертую строку обернем в попытку и там будет исключение, то что бы мы не делали, Обеъект2.Записать () - в базе не появится! При том, что метод ЗафиксироватьТранзакцию () в какой-нибудь 5 или 6 строке отработает. Поэтому я в очередной раз утверждаю, что цикл размотки транзакций (см. 21) самый практичный подход.
   youalex
 
71 - 23.11.18 - 22:19
(68) После строки 4 уже никак не поступить. Ибо выполнение кода прервано по ошибке. ЗафиксироватьТранзакцию() не сыграло
   vi0
 
72 - 24.11.18 - 07:03
(70) > Мы обсуждаем вот что: как правильно перехватывать ошибки любого рода, хоть деление на 0, которые происходят в транзакции. Верно?
Нет не верно. Перехват деления на ноль не будет провоцировать ошибку "В транзакции уже происходили.." и можно будет зафиксировать транзакцию.

не понятны твои рассуждения что код не должен закрывать свои транзакции

и причем здесь проведение документов в цикле? не вижу, что об этом был разговор

ты так и не привел пример программного кода
покажи кодом что ты будешь делать в примере (68)
   Cyberhawk
 
73 - 24.11.18 - 10:35
Я понял автора (70) - он про случаи, когда надо "и рыбку съесть, и костями не подавиться" :) Т.е. когда идет пакетная транзакция и из-за ошибки записи одного из объектов не хочется отлуп всем остальным в пакете делать.
   vde69
 
74 - 24.11.18 - 11:15
если код не в глобальной транзакции то делать надо так
   Попытка
   НачатьТранзакцию();
    
        НаборЗаписей.Записать(Ложь);

    ЗафиксироватьТранзакцию(); 

    Исключение
если транзакцияактивна() тогда отменитьтранзакцию() конецесли;
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("У сотрудника " + ДанныеФизическогоЛица.ФизическоеЛицо + "уже существует ЛС по зарплатному проекту " + ДанныеФизическогоЛица.ЗарплатныйПроект);
    КонецПопытки;
   vi0
 
75 - 24.11.18 - 11:43
(73) > и костями не подавиться
это в лучшем случае
   vi0
 
76 - 24.11.18 - 11:44
(65) > Вызывать исключения наверх тоже не всегда хорошо
кстати не обязательно вызывать исключение
можно просто протаскивать флаг ошибки через функции
тот же пресловутый "Отказ"
   Остап Сулейманович
 
77 - 24.11.18 - 11:49
(76) "можно просто протаскивать флаг ошибки через функции"
Знать бы еще сколько таких флагов на каждом уровне вложенности иметь нужно...
   Остап Сулейманович
 
78 - 24.11.18 - 11:51
+ (77) В "классике" ошибка должна быть обработана на том уровне, где она возникла. А на верх должен передаваться результат выполнения.
   vi0
 
79 - 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)ну ка дай определение Полиморфизм?
  1  2   

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует