|   |   | 
| 
 | Для чего ПередЗаписью выполняется в транзакции? | ☑ | ||
|---|---|---|---|---|
| 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) вариант принимается     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |