Имя: Пароль:
1C
1С v8
Неявные транзакции в 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
Трудно сказать чем они руководствовались
Программист всегда исправляет последнюю ошибку.