|
Неявные транзакции в 1с 8.2 вообще и в коде БСП в частности - как работает? | ☑ | ||
---|---|---|---|---|
0
Humandra
13.03.12
✎
20:13
|
Господа, а кто мне скажет, как работают неявные транзакции в 1с 8.2 вообще и в Библиотеке стандартных подсистемь в частности?
Согласно документации, вложенных транзакций 1С не поддерживает. Но как тогда можно объяснить такое: 1) Создаем элемент справочника (штатный "Пользователь" БСП) 2) В событии ПередЗаписьюНаСервере там одновременно создается ПользовательИБ (штатно, согласно коду БСП) 3) В событии ПриЗаписиНаСервере добавляю код записи некоей связанной с пользователем информации в свой регистр. 4) В коде записи в регистр на ПриЗаписи при определенных условиях присваиваю Отказ = Истина, т.е. вызывается исключение, и записи в регистр не происходит. Ожидаю, что также откатится запись пользователя и - внимание - запись пользователя ИБ. Что имеем в форме справочника? Ошибка записи в регистр, форма Пользователя не закрывается - и это правильно. Но после этого мы исправляем причину ошибки, и снова жмем Записать. И - получаем ошибку снова, только уже из-за того, что в базе уже есть пользователь ИБ. В результате пользователя в справочник мы записать уже не сможем. Но пользователь ИБ - уже есть! Как так? Я что-то в недоумении - а где же неявная транзакция тогда начинается и заканчивается? |
|||
1
Armando
13.03.12
✎
20:18
|
Читаем СП:
Синтаксис: ПередЗаписьюНаСервере(<Отказ>, <ТекущийОбъект>, <ПараметрыЗаписи>) Описание: Вызывается перед записью объекта на сервере. Можно отменить запись. ВЫПОЛНЯЕТСЯ ВНЕ ТРАНЗАКЦИИ. |
|||
2
Feanor
13.03.12
✎
20:25
|
эх, не вышло интриги ((
|
|||
3
Humandra
13.03.12
✎
20:32
|
(2) Сейчас будет интрига :)))
(1) Тут накладывается моя 5-летняя привычка работы с Oracle. Мое понимание транзакции пришло оттуда, и может быть не совсем соответствует 1С-кому, и в этом моя проблема? Вот мое понимание: 1) транзакция - это понятие работы с данными, и базами данных 2) она есть всегда, но может в частном случае быть равна одному единственному действию с базой данных. Т.е. - "update одну запись" = одна транзакция, "update другую запись" - другая транзакция. Или же - транзакцию начинают явно, указывая какие операторы входят в транзакцию. Что же тогда есть - выполняется вне транзакции, при условии, что: 1) вложенных транзакций в 1с не бывает 2) &НаКлиенте Процедура ПередЗаписью(Отказ) написано - Процедура-обработчик вызывается после начала транзакции записи, но до начала записи элемента справочника. Т.е. на момент клиентской ПередЗаписью - транзакция стартует! 3) ПередЗаписьюНаСервере идет после клиентского события (не ошибаюсь? по логике вроде так, но доки под рукой нет) 4) В ПередЗаписьюНаСервере уже нет транзакции (точнее, получается, что каждое действие - отдельная транзация) Получается, что ли, что транзакция в ПередЗаписью начинаяется, и сразу же заканчивается? Бред какой-то... |
|||
4
Humandra
13.03.12
✎
20:34
|
(3) Или подождите, может и не бред. Но так ли это? ПриЗаписи - отдельная транзация, заканчивается при окончании события?
|
|||
5
Humandra
13.03.12
✎
20:35
|
(4) читать как "ПЕРЕДЗаписью" - отдельная транзация...
|
|||
6
Humandra
13.03.12
✎
20:37
|
Я почему-то думала, что ВСЯ цепочка событий записи = одна транзация... Кажется доходит, что это не так... В задумчивости.
|
|||
7
Feanor
13.03.12
✎
20:37
|
(3) "написано - Процедура-обработчик вызывается после начала транзакции записи" не знаю, где это написано, но у меня написано другое:
"Описание: Возникает на клиенте перед выполнением записи объекта из формы. Процедура-обработчик данного события вызывается перед вызовом процедуры-обработчика события ПередЗаписью объекта. " |
|||
8
Humandra
13.03.12
✎
20:39
|
(7) А! Все верно, вы правы. У меня СП подменили :)))) А если серьезно - не туда посмотрела, спутала с событием объекта.
Все, тогда срастается. |
|||
9
Feanor
13.03.12
✎
20:39
|
(6) "о сколько нам открытий чудных готовит просвещенья дух" ))))
|
|||
10
Humandra
13.03.12
✎
20:40
|
(9) Ну, конечно серверных событий только. Это я сгоряча туда клиентские события записала :)
|
|||
11
Humandra
13.03.12
✎
20:40
|
Все, разобралась, спасибо.
|
|||
12
Feanor
13.03.12
✎
20:47
|
+1 караоке, не иначе ))
|
|||
13
Armando
13.03.12
✎
20:54
|
(6) Запись - это одна транзакция. И все серверные транзакционные события возникают в рамках этой одной транзакции.
|
|||
14
Humandra
13.03.12
✎
20:59
|
(13) Ага, поняла. Просто получается, что первое серверное событие - еще не транзакционное, вот тут и собака порылась с проблемой из (0).
Я теперь только одного не понимаю. Какого черта разработчики БСП создают пользователя ИБ вне транзакции? Это как-то объяснимо, или просто косяк? |
|||
15
Armando
13.03.12
✎
21:12
|
Трудно сказать чем они руководствовались
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |