Имя: Пароль:
1C
1C 7.7
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 выкинули.