|
v7: Как работают транзакции? | ☑ | ||
---|---|---|---|---|
0
forforumandspam
02.10.13
✎
07:59
|
Всем добрый день. Есть пара связанных докуентов: поступление и реализация. Они работают всегда парно. До проведения соответствующего документа поступления документ реализация не сможет быть проведён, т.к. нет в наличии товара. Запустил обработку, которая меняет склад в обох документах. Перед всеми изменениями я начинаю транзакцию. Теперь меняю склад в поступлении, провожу его - всё ОК. После меняю склад в реализации и документ не проводится, т.к. пишет, что нет остатков на новом складе. Это что получается, что объект "БухгалтерскиеИтоги" не видит новых проводок? Как заставить "БухгалтерскиеИтоги" увидеть новые остатки внутри транзакции?
|
|||
1
Плот
02.10.13
✎
08:12
|
(0) Что то в обработке наверное, Итоги где получаешь?
|
|||
2
VladZ
02.10.13
✎
08:12
|
Никак. Фактическая запись происходит в момент "ЗафиксироватьТранзакцию".
|
|||
3
forforumandspam
02.10.13
✎
08:22
|
(1) В обработке такой код (приблизительно):
НачатьТранзакцию(); ДокПост.Провести(); ДокРеал.Склад = ЧтоТо; ДокРеал.Провести(); ЗафиксироватьТранзакцию(); В момент проведения ДокРеал из процедуры ОбработкаПроведения() модуля документа объект "БухгалтерскиеИтоги" не видит новых движений. |
|||
4
VladZ
02.10.13
✎
08:25
|
Разнеси запись документов и проведение.
|
|||
5
Плот
02.10.13
✎
08:29
|
(3) тогда (2) и (4)
|
|||
6
Bigbro
02.10.13
✎
08:56
|
после фиксации транзакции увидишь новые итоги.
вообще не стоило бы в транзакцию это заталкивать. |
|||
7
forforumandspam
02.10.13
✎
09:03
|
(6) Так мне надо, либо чтобы оба документа проводились, либо чтобы оба вернулись в исходное состояние, если будет ошибка при проведении второго.
|
|||
8
Злой Бобр
02.10.13
✎
09:14
|
(0) Ну ты сам себе злобный буратино. Кроме извращенно поставленной задачи, не менее извращенная реализация задачи.
Выдай исходные данные и чего в итоге нужно получить. Разбираться в твоем г*коде никто небудет. |
|||
9
forforumandspam
02.10.13
✎
09:15
|
(8) Где ты увидел Г*внокод?
|
|||
10
пипец
02.10.13
✎
09:32
|
проведение само по себе транзакция
|
|||
11
Злой Бобр
02.10.13
✎
09:33
|
(9) Это было сказано образно. Но если ты действительно непонимаешь что перед транзакцией нада (по уму) получить итоги и сравнить с твоей ТЧ, тогда всетаки сначала учить матчасть.
|
|||
12
forforumandspam
02.10.13
✎
09:52
|
(11) Это ты, не разобравшись, начинаешь ярлыки навешивать.
|
|||
13
scanduta
02.10.13
✎
09:54
|
(2) А если сделать транзакцию внутри транзакции?? никто не пробывал =)?
|
|||
14
catena
02.10.13
✎
09:55
|
(7)А нельзя проверить провелся ли первый и только потом проводить второй?
|
|||
15
catena
02.10.13
✎
09:55
|
А, ну да. Со вторым косяк :)
|
|||
16
пипец
02.10.13
✎
10:21
|
(13) мсье знает толк в извращениях (с)
|
|||
17
Кирпич
02.10.13
✎
10:28
|
(0) Забей. Не используй транзакции.
|
|||
18
Bigbro
02.10.13
✎
10:31
|
(7) так и проверяй что произошло. но не в транзакцию же толкать. в базе у тебя не изменятся итоги пока транзакция не фиксирована. принципиально неверный подход.
|
|||
19
ЧеловекДуши
02.10.13
✎
10:33
|
(3) За такой код, руки тебе нужно из пятой точки выдернуть и метлу вставить :)
|
|||
20
ЧеловекДуши
02.10.13
✎
10:34
|
(12) Какой ярлык?
Код из (3) вешает всю БД и все ждут, пока ты наиграешься в провидение. При этом команда "Провести" уже имеет функцию транзакции. :) |
|||
21
ЧеловекДуши
02.10.13
✎
10:35
|
+(12) Читай в (17) до просветления :)
|
|||
22
scanduta
02.10.13
✎
10:36
|
(20) Почему транзакция вешает всю базу?
|
|||
23
Salimbek
02.10.13
✎
10:49
|
Попытка
Попытка ...Проводишь первый док Исключение ...Говоришь, что док такой-то не смог провести ...Возврат из процедуры конецпопытки ...Проводишь второй док Исключение ...Говоришь что док второй не можешь провести ...Вертаешь назад первый док конецпопытки |
|||
24
forforumandspam
02.10.13
✎
10:58
|
(14) Первый всегда гарантированно проведётся. Ошибка может возникнуть при проведении второго и тогда надо вернуть в исходное состояние первый документ.
|
|||
25
Злой Бобр
02.10.13
✎
11:02
|
(22) Ну попробуй. Если у тебя 20 пользователей которые проводят документы, то жди их с биткой уже минут через 10. После этого либо перестанешь быдлокодить, либо будешь постоянно отгре_бать.
|
|||
26
forforumandspam
02.10.13
✎
12:44
|
(25) Ещё один. Где вы быдлокод увидели? Я в базе один - никто не придёт.
(20) Внутри одной транзакции только 2 документа. Другие два будут в новой транзакции и т.д. |
|||
27
Bigbro
02.10.13
✎
12:57
|
(26) нельзя проводить 2 документа в транзакции, при этом один по результату проведения второго.
|
|||
28
trad
02.10.13
✎
13:03
|
(27) а есть объяснение почему нельзя?
|
|||
29
Bigbro
02.10.13
✎
13:16
|
в (18) уже написал. как написать более понятно - не знаю.
|
|||
30
ЧеловекДуши
02.10.13
✎
13:19
|
(24) Тогда твой код, можно запускать только ночью, или по выходным, когда никто не работает :)
|
|||
31
ЧеловекДуши
02.10.13
✎
13:20
|
(26) Поверь, использовать типо штатный механизм "Транзакции" от 1С, это и есть быдло код :)
Так же, если ты боишься, что не проведётся второй документ, так предусмотри, что бы была проверка или вариант того, что бы после до провести не проведенный документ :) |
|||
32
ЧеловекДуши
02.10.13
✎
13:21
|
(27) Почему нельзя?
В пределе сессии все отработает на ура. Проблема только в одном, пока господин в (0) проводит документы в транзакции, все курят бамбук :) |
|||
33
trad
02.10.13
✎
13:49
|
(29) из 18 "в базе у тебя не изменятся итоги пока транзакция не фиксирована"
мне не понятно почему не изменятся итоги для той же сессии |
|||
34
trad
02.10.13
✎
13:51
|
(26) покажи как итоги получаешь
|
|||
35
Fragster
модератор
02.10.13
✎
13:52
|
все фигня, автору надо просто реализацию на секунду позже поступления поставить.
|
|||
36
forforumandspam
02.10.13
✎
14:35
|
Прошу прощения перед всеми. Я где-то ошибся. На самом деле мой код отработал на ура. Если в транзакции проводится первый документ, то второй при проведении увидит его проводки и проведётся, как и надо. Где-же я ступил, что мне пришлось писать тему - не знаю.
Резюме: Такой подход не является быдлокодом. По два документа в одной транзакции не вешают базу. |
|||
37
Torquader
03.10.13
✎
00:08
|
Всё зависит от тяжести выполняемых действий при проведении документа - если документ проводится за доли секунды, то транзакция мешать не будет.
Но, есть одна проблема - вложенные транзакции в 1С неправильно работают, то есть ОтменитьТранзакцию() не вызывает реальной отмены действий. Если проводить документ в транзакции, то в случае отказа от проведения может отказаться, что отмена проведения не состоялась, так как внутренняя транзакция криво отменилась. P.S. у меня есть в базе документы, которые только одну строчку в БухИтоги при проведении пишут, и их прекрасно можно проводить в одной транзакции по несколько штук - главное, только следить, чтобы транзакция не занимала более двух секунд - тогда остальные не успевают скурить бамбук и изготовить биту. |
|||
38
Туц
03.10.13
✎
06:14
|
(0) Как я понял транзакцию используешь чтоб при ошибке подмена не выполнилась? Если так, то лучше реализовать собственный контроль не через механизм транзакций или вообще напрямую лезьть в таблички, но тока аккуратно.
|
|||
39
Повелитель
03.10.13
✎
06:40
|
(36) Это же 7.7 там и так пока проводиться один документ все курят бамбук, так что 2 документа проводятся или один думаю не так уж важно.
У нас вот была помню проблема база была огромная и документ Отчет ККМ проводился 5-10 минут (Несколько тысяч строк в документах было), которые приходили с магазинов, вот это было весело, а филиалов было 7. И эти 7 документов проводились около часа, вот это было весело. Потом эту 7.7 выкинули. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |