Многие путают событие отмены транзакции с событием не фиксации транзакции, хотя это совершенно разные состояния. Я обычно объясняю разницу так: я пообещал тебе 10 рублей и не дал - это незафиксированная транзакция, а вот если я пообещал тебе 10 рублей, дал их тебе в руки, а потом забрал - это отмененная транзакция. Ну а если ты с этими 10-ю рублями спокойно ушел домой - это транзакция зафиксировалась. )) Поэтому когда они говорят, что исключение "отменяет", они имеют ввиду "не фиксирует". Поскольку именно отменить транзакцию в 1С можно только явно, оператором ОтменитьТранзакцию(), а он используется редко, то у многих возникает в голове синонимичность не фиксации транзакции ее отмене, потому что любую незафиксированную явно или неявно транзакцию платформа "отменит". По поводу сообщения "в данной транзакции уже происходили ошибки". Многие начинающие программисты не знают о том, что транзакции бывают явные, начатые оператором НачатьТранзакцию() и неявные, которые вызываются на уровне объекта при операциях изменения данных в БД. В коде у автора ролика была сначала инициирована явная транзакция, потом при записи элемента справочника началась неявная и там же она вылетела в исключение. Соответственно, поскольку вызывающий код находится "выше" и не может знать о том что происходит в более нижестоящих слоях кода, он и не может сказать в какой еще такой "данной" транзакции произошли ошибки и какие, это нормально. Поскольку неявная транзакция не зафиксировалась (не отменилась!) то и явная зафиксироваться не может, т.к. счетчик в ноль не выходит (это хорошо объяснил автор ближе к концу ролика). За выводы в финале видео - аплодирую стоя! ))) З.Ы. Пока писал, задумался. Незафиксированные транзакции, не исчезают из реальности совсем, их видно в ЖР например, серым цветом. Висят ли они в журнале транзакций в БД увеличивая тем самым его размер?
Ура Ваша работа помогает миллионам программистов 1С в стране))) Я немного научился пойду стандарт учить. Кто если не я)))) Нас миллионы, но всегда нужны мы)))
Большое спасибо за видео. Всё это уже давно прошёл на своей шкуре, но как-то не отсуммировал для себя. А тут такое видео, после которого всё окончательно уложилось в голове.
Мне как начинающему программисту очень было интересно посмотреть данный ролик. Спасибо Вам большое. Не могли бы вы записать ролик про агрегаты - настройки, итоги, индексы, как и где лучше их применять, а где не стоит? Спасибо большое. Очень ясно и понятно объясняете.
Очень полезное видео, посмотрел несколько раз, поэкспериментировал, и вроде все сошлось в голове) Прекрасно объясняете! Только я бы еще заметил что не любая ошибка портит транзакции, а только ошибки базы данных (стандарт "Ошибки базы данных и транзакции") А какие ошибки к ним относятся - стандарты не объясняют, приходится узнавать на опыте.
В попытке желательно писать только тот метод, который может вызвать исключение. То есть, в ДАННОЙ ситуации код, создающий элемент и заполняющий этот элемент нужно выносить за пределы попытки, и только метод Записать() оставить в попытке.
Здравствуйте! Не совсем понял фразу из документации. П. 1: не поддерживаются вложенные транзакции (см. подробнее Вложенность транзакций). Потом п. 1.3: при использовании вложенных транзакций... Так поддерживаются вложенные или нет?
как всегда познавательно. Я вот узнал что ВызватьИсключение без параметров перебрасывает исключение дальше.. А по транзакциям, есть у меня один гигантский модуль который содержит большое количество записи в БД разных обьектов, это все обильно сдобрено бизнес логикой и разнесено по функциям и получается что в этих функциях какие то свои транзакции существуют, у меня в модуле свои и фишка в том что как ни крути либо попадаешь на переработку куска кода в 5000 строк примерно, с бизнес логикой продаж, которая вообще нигде не описана и автотестов нет.. либо надо начинать транзакцию в одной процедуре, а фиксировать или отменять в других.. и это очень плохо. В итоге все собираюсь с этим что то делать, но никто время на переработку этого не даст что бы все было по стандартам.
Вы когда в гараж приходите поработать и видите там хлам и беспорядок - тоже продолжаете увеличивать энтропию или сначала уборкой займётесь? Если первое - вы не профессионал, а шабашник. Главное деньги урвал а там хоть потоп, у таких клиент дурак который не хочет платить за переделывание работы. На эту тему даже анекдот есть: - Кто тебе дом строил? Здорово получилось... - Да пидорасы! - ?? - Нанял рабочих залить фундамент. Выкопали, залили, ушли. Нанял каменщиков, те пришли спрашивают: Какие пидорасы фундамент заливали? Стены выложили, ушли. Нанял штукатуров, те тоже - что за пидорасы кладку делали? Ну, и так далее. Вот и получается, что дом строили одни пидорасы...
@@kuzyara555 проблема в том что я на предприятии работаю, не франч.. у нас нет клиентов никаких. Вот и получается что я понимаю что переделать это надо, знаю как.. но время, кто даст время? Там минимум на 2 месяца можно зависнуть из за сложной бизнес логики кода. Даже больше, бизнес аналитики (именно бизнес, так как они к ДИТ отношения не имеют) будут резко против переработки того куска, ибо он критичен для компании, а мы с ними обязаны все свои работы согласовать. Вот и ничего с этим не сделать получается и не от нас все зависит увы
@@alexeibelousov3279 мыши плакали, кололись, но продолжали жрать кактус Вы же там не в рабстве, будьте выше этого. Сейчас работу легко найти, пусть сами своë говно разгребают
@@kuzyara555 ну есть тут определенные плюсы в виде хорошей белой зп, проект интересный (полностью собственная разработка на бсп), отсюда задачи нестандартные интересные постоянно и большие (разработки собственных подсистем), прогрессивные (ну для 1с) технологии в виде гита, едт, сонара и всякого девопса, гибридный график, отправляют на всякие там инфостарт эвенты и веселухи/развлекухи...
кажется здесь был токсичный комментарий, который кто-то потёр) но я повторюсь! >все собираюсь с этим что то делать, но никто время на переработку этого не даст что бы все было по стандартам Нет время на тестирование, нет время на рефакторинг, нет времени на учёбу - этой мантрe сто лет в обед пс: Андрей, заходите в гости)
Стараюсь работать с транзакциями правильно, всегда закрываю или отменяю их, возможно излишне часто используя ТранзакцияАктивна(). Но недавно попал на "В данной транзакции уже происходили ощибки". И попал на нее когда в исключении использовал Сообщить(Док), где Док - ДокументОбъект который не записался в этой транзакции. И до сих пор не понимаю почему попытка сообщить в каком документе произошел сбой вызвала такую ошибку?
Нашёл! Интересная штука: я просто поставил Попытка...Конец Попытки на клиенте и поймал исключение на клиенте, а на клиенте "сломанная" транзакция уже отменена платформой
Хм... если исключение ломает транзакцию, то почему бы платформе её автоматически и не откатить. А в остальном фирме 1С нужно развивать свой язык, менеджеры контекста могли бы закрыть все проблемы с транзакциями.
@@Веселый1С Вот эта пометка и есть "ломает". Если бы транзакции и исключения действительно не были бы связанны, то транзакция не помечалась бы. Как раз откат транзакции и приводил бы к управляемости и предсказуемости т.к. это ожидаемое поведение, а не некое неопределённое состояние в котором с транзакцией ничего нельзя сделать.
Ха, я всегда подозревал, что разработчики типовых 1с (ERP) не умеют работать,... с транзакциями ))) Правда при упоминании таких ошибок, грамотно переводят стрелки...
Исключения бывают восстановимыми (не вызвано записью в БД) и не восстановимыми(в процессе записи в БД). В первом случае при обработке исключения транзакция завершится. В втором случае при работе с записью в БД после исключения возникает ошибка: В данной транзакции уже происходили ошибки
Так 12:40 вызвано ручное исключение без записи в БД. И дальше по видео показано, что она не завершилась(транзакция) Итог не записалась организация в БД.
@@kuzyara555, я в скобках попытался указать пример. Для себя их отличаю так: если исключение не связано с ошибкой записи и не присвоен Отказ в транзакции, то при обработке исключения можно зафиксировать транзакцию без ошибок. Если исключение возникло в процессе записи в базу, то зафиксировать транзакцию не получится
Ваша статья на хабре в свое время мне очень помогла понять что делать с транзакциями.
Присединяюсь! Благодаря одной этой статье перестал бояться и полюбил транзакции)
++++
+1 Тоже на статью наталкивался, достаточно грамотно и лаконично написана, многие неочевидные моменты помогла понять)
Многие путают событие отмены транзакции с событием не фиксации транзакции, хотя это совершенно разные состояния. Я обычно объясняю разницу так: я пообещал тебе 10 рублей и не дал - это незафиксированная транзакция, а вот если я пообещал тебе 10 рублей, дал их тебе в руки, а потом забрал - это отмененная транзакция. Ну а если ты с этими 10-ю рублями спокойно ушел домой - это транзакция зафиксировалась. ))
Поэтому когда они говорят, что исключение "отменяет", они имеют ввиду "не фиксирует". Поскольку именно отменить транзакцию в 1С можно только явно, оператором ОтменитьТранзакцию(), а он используется редко, то у многих возникает в голове синонимичность не фиксации транзакции ее отмене, потому что любую незафиксированную явно или неявно транзакцию платформа "отменит".
По поводу сообщения "в данной транзакции уже происходили ошибки". Многие начинающие программисты не знают о том, что транзакции бывают явные, начатые оператором НачатьТранзакцию() и неявные, которые вызываются на уровне объекта при операциях изменения данных в БД. В коде у автора ролика была сначала инициирована явная транзакция, потом при записи элемента справочника началась неявная и там же она вылетела в исключение. Соответственно, поскольку вызывающий код находится "выше" и не может знать о том что происходит в более нижестоящих слоях кода, он и не может сказать в какой еще такой "данной" транзакции произошли ошибки и какие, это нормально. Поскольку неявная транзакция не зафиксировалась (не отменилась!) то и явная зафиксироваться не может, т.к. счетчик в ноль не выходит (это хорошо объяснил автор ближе к концу ролика).
За выводы в финале видео - аплодирую стоя! )))
З.Ы. Пока писал, задумался. Незафиксированные транзакции, не исчезают из реальности совсем, их видно в ЖР например, серым цветом. Висят ли они в журнале транзакций в БД увеличивая тем самым его размер?
Ура Ваша работа помогает миллионам программистов 1С в стране))) Я немного научился пойду стандарт учить. Кто если не я)))) Нас миллионы, но всегда нужны мы)))
Это действительно самое весёлое видео)))) Я так же ругаюсь когда получается не то, что ожидала. Андрей, ваше выражение глаз в этот момент бесценно)))
Большое спасибо за видео. Всё это уже давно прошёл на своей шкуре, но как-то не отсуммировал для себя. А тут такое видео, после которого всё окончательно уложилось в голове.
Прикольное видео. Коммент в благодарность и чтоб побольше программистов увидело это видео )))))
С возвращением!
Спасибо за Ваш труд! И статью читала, и видео - огонь!
У меня Ваша статья в закладках, как и стандарты разработки, всегда под рукой :)
Мне как начинающему программисту очень было интересно посмотреть данный ролик. Спасибо Вам большое. Не могли бы вы записать ролик про агрегаты - настройки, итоги, индексы, как и где лучше их применять, а где не стоит? Спасибо большое. Очень ясно и понятно объясняете.
На транзакцию нужно создать шаблон) Как в стандарте) Как всегда классное видео!
Спасибо большое, рад вас видеть. Да можно не переписывать оговорки, разберемся, здесь норм пацаны.
Очень полезное видео, посмотрел несколько раз, поэкспериментировал, и вроде все сошлось в голове) Прекрасно объясняете!
Только я бы еще заметил что не любая ошибка портит транзакции, а только ошибки базы данных (стандарт "Ошибки базы данных и транзакции")
А какие ошибки к ним относятся - стандарты не объясняют, приходится узнавать на опыте.
Мощно, стильно, современно!
В попытке желательно писать только тот метод, который может вызвать исключение.
То есть, в ДАННОЙ ситуации код, создающий элемент и заполняющий этот элемент нужно выносить за пределы попытки, и только метод Записать() оставить в попытке.
Ну да, но если плюс делать блокировку, то всё равно надо в попытку оборачивать создание и заполнение элемента
@@Crisis2424 Почему? Создание или заполнение может вызвать исключение?
Вы бы shorts снимали. А то ждешь по полгода. А там трансляция на 2,5часа.
А это неплохая идея.
Вот спасибо большое!
Спасибо
Классно все объяснили! Спасибо!
всегда актуально)))
Начало с 2:00
Ну когда же новое видео 😢
Здравствуйте! Не совсем понял фразу из документации. П. 1: не поддерживаются вложенные транзакции (см. подробнее Вложенность транзакций). Потом п. 1.3: при использовании вложенных транзакций... Так поддерживаются вложенные или нет?
В УТ 10 есть такая ошибка с транзакцией при проверке маркированных товаров когда дата запрета не позволяет записать документ
Интересно звучит клавиатура. Какая модель?
Я только неделю назад данную статью читал)
как всегда познавательно. Я вот узнал что ВызватьИсключение без параметров перебрасывает исключение дальше.. А по транзакциям, есть у меня один гигантский модуль который содержит большое количество записи в БД разных обьектов, это все обильно сдобрено бизнес логикой и разнесено по функциям и получается что в этих функциях какие то свои транзакции существуют, у меня в модуле свои и фишка в том что как ни крути либо попадаешь на переработку куска кода в 5000 строк примерно, с бизнес логикой продаж, которая вообще нигде не описана и автотестов нет.. либо надо начинать транзакцию в одной процедуре, а фиксировать или отменять в других.. и это очень плохо. В итоге все собираюсь с этим что то делать, но никто время на переработку этого не даст что бы все было по стандартам.
Вы когда в гараж приходите поработать и видите там хлам и беспорядок - тоже продолжаете увеличивать энтропию или сначала уборкой займётесь?
Если первое - вы не профессионал, а шабашник. Главное деньги урвал а там хоть потоп, у таких клиент дурак который не хочет платить за переделывание работы.
На эту тему даже анекдот есть:
- Кто тебе дом строил? Здорово получилось...
- Да пидорасы!
- ??
- Нанял рабочих залить фундамент. Выкопали, залили, ушли. Нанял каменщиков, те пришли спрашивают: Какие пидорасы фундамент заливали? Стены выложили, ушли. Нанял штукатуров, те тоже - что за пидорасы кладку делали? Ну, и так далее. Вот и получается, что дом строили одни пидорасы...
@@kuzyara555 проблема в том что я на предприятии работаю, не франч.. у нас нет клиентов никаких. Вот и получается что я понимаю что переделать это надо, знаю как.. но время, кто даст время? Там минимум на 2 месяца можно зависнуть из за сложной бизнес логики кода. Даже больше, бизнес аналитики (именно бизнес, так как они к ДИТ отношения не имеют) будут резко против переработки того куска, ибо он критичен для компании, а мы с ними обязаны все свои работы согласовать. Вот и ничего с этим не сделать получается и не от нас все зависит увы
@@alexeibelousov3279 мыши плакали, кололись, но продолжали жрать кактус Вы же там не в рабстве, будьте выше этого. Сейчас работу легко найти, пусть сами своë говно разгребают
@@kuzyara555 ну есть тут определенные плюсы в виде хорошей белой зп, проект интересный (полностью собственная разработка на бсп), отсюда задачи нестандартные интересные постоянно и большие (разработки собственных подсистем), прогрессивные (ну для 1с) технологии в виде гита, едт, сонара и всякого девопса, гибридный график, отправляют на всякие там инфостарт эвенты и веселухи/развлекухи...
кажется здесь был токсичный комментарий, который кто-то потёр)
но я повторюсь!
>все собираюсь с этим что то делать, но никто время на переработку этого не даст что бы все было по стандартам
Нет время на тестирование, нет время на рефакторинг, нет времени на учёбу - этой мантрe сто лет в обед
пс: Андрей, заходите в гости)
Стараюсь работать с транзакциями правильно, всегда закрываю или отменяю их, возможно излишне часто используя ТранзакцияАктивна(). Но недавно попал на "В данной транзакции уже происходили ощибки". И попал на нее когда в исключении использовал Сообщить(Док), где Док - ДокументОбъект который не записался в этой транзакции. И до сих пор не понимаю почему попытка сообщить в каком документе произошел сбой вызвала такую ошибку?
@user-zr4uw5ng3r Представление ... не сообразил. Спасибо.
хех, буквально пару месяцев назад изучал эту статью на хабре.
15:53 Андрей, на этом этапе у разработчиков появляются седые волосы)))
Проделал всё это в файловой базе. Но после того как исключение обработано в Попытка... КонецПопытки, то данные успешно записались в базу. Странно!
@Андрей Овсянкин в том то и дело, что исключение сделал в обработчике "При записи" ((
Нашёл! Интересная штука: я просто поставил Попытка...Конец Попытки на клиенте и поймал исключение на клиенте, а на клиенте "сломанная" транзакция уже отменена платформой
Так был же уже ролик на эту тему на этом канале.
Разве?
@@Веселый1С, в видео про блокировки вы вроде бы про транзакции тоже говорили.
@@Anton-ni8un в другом контексте же вроде как
Хм... если исключение ломает транзакцию, то почему бы платформе её автоматически и не откатить. А в остальном фирме 1С нужно развивать свой язык, менеджеры контекста могли бы закрыть все проблемы с транзакциями.
Оно её не ломает, а помечает, как испорченную. А 1С не откатывает её, чтобы была управляемость и предсказуемость
@@Веселый1С Вот эта пометка и есть "ломает". Если бы транзакции и исключения действительно не были бы связанны, то транзакция не помечалась бы. Как раз откат транзакции и приводил бы к управляемости и предсказуемости т.к. это ожидаемое поведение, а не некое неопределённое состояние в котором с транзакцией ничего нельзя сделать.
Ха, я всегда подозревал, что разработчики типовых 1с (ERP) не умеют работать,... с транзакциями ))) Правда при упоминании таких ошибок, грамотно переводят стрелки...
Исключения бывают восстановимыми (не вызвано записью в БД) и не восстановимыми(в процессе записи в БД). В первом случае при обработке исключения транзакция завершится. В втором случае при работе с записью в БД после исключения возникает ошибка: В данной транзакции уже происходили ошибки
Так 12:40 вызвано ручное исключение без записи в БД. И дальше по видео показано, что она не завершилась(транзакция) Итог не записалась организация в БД.
@@egovigor52 Так потому что не зафиксировали транзакцию.
Эта формулировка с ИТС просто ужасна. Кто там кого восстановить пытается, расскажите?
@@kuzyara555, я в скобках попытался указать пример. Для себя их отличаю так: если исключение не связано с ошибкой записи и не присвоен Отказ в транзакции, то при обработке исключения можно зафиксировать транзакцию без ошибок. Если исключение возникло в процессе записи в базу, то зафиксировать транзакцию не получится
Придумывают какието дибильные кейсы и кучу статей по из исправлению пишут 🤦♂️
А ясно кто эту хрень на хабре написал
Браво !