|
Для чего ПередЗаписью выполняется в транзакции? | ☑ | ||
---|---|---|---|---|
0
vi0
23.06.17
✎
06:46
|
У объектов есть событие ПриЗаписи. И выполняется оно уже в транзакции.
Для чего это делать в транзакции, какие выгоды мы получаем от этого? |
|||
1
Lama12
23.06.17
✎
06:52
|
(0) Когда движения документа записываются?
|
|||
2
vi0
23.06.17
✎
07:01
|
я опечатался
Имел ввиду перед записью |
|||
3
1dvd
23.06.17
✎
07:08
|
очевидно, чтобы можно было откатить все сделанные изменения. Не?
|
|||
4
vi0
23.06.17
✎
09:04
|
(3) а если транзакцию начать после ПередЗаписью, разве изменения не откатятся?
|
|||
5
mehfk
23.06.17
✎
09:11
|
(4) В таком случае изменения, которые сделал в ПередЗаписью не откатятся.
|
|||
6
vi0
23.06.17
✎
09:19
|
(5) об изменениях какого рода ты говоришь? приведи пример кода
|
|||
7
1dvd
23.06.17
✎
09:21
|
(6) перед записью документа изменяешь какой-либо реквизит справочника, записываешь. ПриЗаписи произошла ошибка, изменения откатываются включая справочник
|
|||
8
Рэйв
23.06.17
✎
09:21
|
(6)Например проверояешь правильность заполнения документа и если чтото не сошлось со звездами - шлешь пользователя в сад и Отказ=Истина.
|
|||
9
vi0
23.06.17
✎
09:22
|
(7) если ты хочешь делать такие изменения то их нужно делать ПриЗаписи
|
|||
10
vi0
23.06.17
✎
09:23
|
(8) но что должно откатиться с помощью транзакции? там про это речь была
ты не написал про это |
|||
11
Рэйв
23.06.17
✎
09:23
|
(9)А я хочу перед записью.Что мне помешает?
|
|||
12
h-sp
23.06.17
✎
09:24
|
(6) обычно перед записью какие-то реквизиты меняем. Например СуммаДокумента всегда считается в типовых.
|
|||
13
mehfk
23.06.17
✎
09:24
|
(9) Да ну?
|
|||
14
Рэйв
23.06.17
✎
09:24
|
(10)Все. Документ просто не будет записан. И останется в редактируемом состоянии.или просто не запишется если програмно пишешь
|
|||
15
vi0
23.06.17
✎
09:25
|
(12) в таком случае ты меняешь реквизиты у объекта, который находится в памяти, а не в БД
транзакция откатывает изменения в БД |
|||
16
h-sp
23.06.17
✎
09:25
|
(9) Смешно. это ты мощно протупил. ПриЗаписи уже всё записано, вся фишка в том, что ПриЗаписи вызывается фактически уже после записи. Непонятно, почему-то назвали ПриЗаписи.
|
|||
17
Рэйв
23.06.17
✎
09:26
|
(15)Если попростому останется то, что лежит в .Ссылка.
|
|||
18
Рэйв
23.06.17
✎
09:27
|
(15)Сам попробуй сначала, а потом будешь писать уствердительные предлоэжения
|
|||
19
vi0
23.06.17
✎
09:28
|
(18) а что именно пробовать? я знаю что следующий код не меняет БД:
Процедура ПередЗаписью(Отказ) Реквизит1 = 1; КонецПроцедуры |
|||
20
Рэйв
23.06.17
✎
09:29
|
(19)Ну и что? Ты в документе поменяй реквизиты, они тоже пока не записаны в БД. Если будет отказ в ПередЗаписью, то и не будут записаны. Транзакция записи откатится, .Ссылка останется такой же как до записи
|
|||
21
vi0
23.06.17
✎
09:31
|
(20) что именно ты предлагаешь мне попробовать сделать в (18) того что я не сделал в (19)
? |
|||
22
Рэйв
23.06.17
✎
09:31
|
(21)Ну и в чем вопрос тогда?
|
|||
23
Рэйв
23.06.17
✎
09:32
|
воду варишь.
|
|||
24
vi0
23.06.17
✎
09:33
|
(23) ответь на вопрос
|
|||
25
Рэйв
23.06.17
✎
09:33
|
(24)Сформулиру его
|
|||
26
Buster007
23.06.17
✎
09:36
|
(24) мне тоже интересно, что же он ответит )
(25) вопрос в (21) |
|||
27
vi0
23.06.17
✎
09:37
|
Транзакция откатывает изменения сделанные в базе данных (запись, удаление итд)
когда я меняю реквизит объекта, как в (19) то я не меняю базу данных, ничего не записываю, не удаляю так зачем здесь нужна транзация? |
|||
28
Cyberhawk
23.06.17
✎
09:38
|
Автор, видимо, хочет до записи объекта в БД создавать связанные объекты с самостоятельной обработкой исключений и самостоятельным принятием решения о том, комиттить или откатить.
Если бы ПередЗаписью выполнялось не в транзакции, то это было бы возможно. А сейчас любое исключение (перехваченное кодом) приведет к последующему откату транзакции записи. |
|||
29
Рэйв
23.06.17
✎
09:41
|
(27)Транзакция нужна для возможности отказа от записи.А что ты делаешь с реквитами -это твое дело, твой реквизит никуда не денется, просто не запишется в базу.
|
|||
30
Рэйв
23.06.17
✎
09:43
|
+(29)Но на форме он останется
|
|||
31
Feunoir
23.06.17
✎
09:43
|
(27) http://catalog.mista.ru/public/153748/
ПередЗаписью - ты можешь изменить реквизиты объекта и они запишутся в базу ПриЗаписи - ты можешь изменить реквизиты объекта, но они уже не запишутся в базу, так как запись уже прошла. |
|||
32
vi0
23.06.17
✎
09:50
|
(31 зачем создавать связанные объекты ПередЗаписью если это можно сделать при записи?
|
|||
33
vi0
23.06.17
✎
09:52
|
(29) отказаться от записи можно и до транзакции
|
|||
34
vi0
23.06.17
✎
09:53
|
+(32) точнее так: зачем создавать связанные объекты если ты еще не определился, будешь ли ты записывать текущий объект
|
|||
35
Рэйв
23.06.17
✎
09:55
|
(33)Интересно, если ты объект создал программно, где ты собираешься отказываться от записи?
|
|||
36
catena
23.06.17
✎
09:57
|
(34)Перед записью можно сравнить версию в базе с текущей версией. При фиксации версионирования без транзакции перед записью очень грустно было бы.
|
|||
37
1sanekmaloi1
23.06.17
✎
10:09
|
(32) например: создать новый элемент справочника и присвоить ссылку реквизиту документа, как это сделать в ПриЗаписи?
|
|||
38
Buster007
23.06.17
✎
10:12
|
Для того, чтобы объект в памяти сохранил свою целостность.
Например, в перед записью ты изменяешь какой-то реквизит, а следующей строкой ты пишешь отказ, так вот чтобы реквизит остался в состоянии как был "перед записью". |
|||
39
h-sp
23.06.17
✎
10:22
|
(32) В ПриЗаписи ты меняешь реквизит только в памяти. В базу он не попадет. Так и останется в оперативной памяти.
|
|||
40
Feunoir
23.06.17
✎
10:37
|
(32) Кто говорил про связанные объекты? Связанные объекты ПередЗаписью создавать, теоретически можно, но с плясками, так как ссылки на основной в этот момент ещё нет.
Разговор (у меня) шел об изменениях реквизитов этого самого объекта. |
|||
41
vi0
24.06.17
✎
06:34
|
(35) в смысле где?
Предположим есть обработчик ПередЗаписью, транзакция еще не началась, и ты там выставляешь Отказ=Истина (до транзакции). Не вижу здесь проблем. К слову, именно так сейчас работает обработчик ПередЗаписью у формы. Он находится на клиенте, транзакция там еще не началась и запись можно прервать. |
|||
42
vi0
24.06.17
✎
06:36
|
(38) да, это интересное полезное поведение, но это не результат работы транзакции
|
|||
43
vi0
24.06.17
✎
06:38
|
(37) с этим согласен
|
|||
44
vi0
24.06.17
✎
06:50
|
(36) если бы в ПередЗаписью не было транзакции то, не думаю, что были бы сложности с версионированием
сравнить можно было бы ПередЗаписью, а записывать в ПриЗаписи |
|||
45
mehfk
24.06.17
✎
07:18
|
(44) Устройся работать в 1С в раздел разработки платформы, реализуй хотелку и уволься.
|
|||
46
vi0
24.06.17
✎
07:42
|
(45) хотелка? ты шутишь, старичок?!
ветку я создал чтобы разобраться |
|||
47
Diman000
24.06.17
✎
08:46
|
Меня больше волнует почему нет события ПослеЗаписи в модуле объекта.
По сабжу, почему так сделано я не знаю. Определенная логика в этом есть. Это среда разработки упрощенная, создана так специально для низкого входного порога студентов. Миллион событий ПередТранзакциейЗаписи, ВСамомНачалеТранзакцииЗаписи и так далее посчитали ненужным. Если очень надо что-то ПередЗаписью сделать вне транзакции, то фоновые задания помогут. Хотя метод извращенный и по производительности ресурсоемкий, но однажды я столкнулся, что по-другому никак. Когда результаты проверок на разрешение записи и проведения надо было записывать для дальнейшего анализа. Просто ПередЗаписью куда-то там писать нельзя, т.к. если запись не состоится, то транзакция откатится. Внешнюю базу использовать не захотелось. |
|||
48
mehfk
24.06.17
✎
08:46
|
(46) Я серьезно, сынуля.
|
|||
49
vi0
24.06.17
✎
09:13
|
(47) зачем тебе ПослеЗаписи?
|
|||
50
Diman000
24.06.17
✎
10:00
|
(49) Выполнить синхронизацию данных текущего объекта с остальными объектами БД, которой не хочется нагружать транзакцию самой записи объекта.
|
|||
51
vi0
24.06.17
✎
10:04
|
(50) а если ошибка случится? как здесь без транзакции?
|
|||
52
Diman000
24.06.17
✎
10:11
|
(51) Ночная регламентная процедура ошибки синхронизации найдет и исправит. Синхронизации действительно критичные для реал-тайма вне транзакции не делаются.
Ты не переживай, я далеко не зеленый новичок, все последствия представляю и все будет предусмотрено :-) Транзакция записи хорошее дело, но ее завершения должен дождаться пользователь, а там бывает надолго. |
|||
53
vi0
24.06.17
✎
10:23
|
(52) да ты не переживай, что я переживаю)
у тебя дублирование операции получается, не видно в необходимости ПослеЗаписи |
|||
54
Diman000
24.06.17
✎
10:28
|
(53) Дублирования операций нет, есть вынос части операции вне основной транзакции записи. Нужно для того, чтобы пользователь не ждал завершения этой синхронизации.
Так как, во-первых, она может быть продолжительной по времени (ожидание блокировки, например), а пользователю надо работать дальше, для его текущей деятельности эта синхронизация не так важна. А во-вторых, если действительно произойдет ошибка, то не надо запрещать пользователю запись и проведение. Эту ошибку исправит потом автоматический регламент или с ней будет разбираться поддержка, получив оповещение от системы о найденных, но не исправленных рассинхронах. |
|||
55
vi0
24.06.17
✎
12:09
|
в общем, пока вижу единственный правильный ответ в (37)
|
|||
56
mistеr
24.06.17
✎
12:14
|
(0) Мой вариант ответа.
В ПередЗаписью есть возможность отказа от записи, а также изменения режима записи и режима проведения. Для принятия этих решений могут использоваться другие данные, помимо текущего объекта (остатки, состояния и т.д.). То есть, может быть чтение из базы. Выполнение этого чтения в одной транзакции с записью обеспечивает согласованность. Иначе между чтением (принятием решения) и записью ситуация может измениться и решение станет неверным. |
|||
57
vi0
24.06.17
✎
14:31
|
(56) вариант принимается
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |