Имя: Пароль:
1C
1C 7.7
v7: Параллельное проведение документов
,
0 gamletspb
 
18.10.19
13:01
Всем привет.
Столкнулся с неожиданной проблемой. Есть документ, в модуле проведения которого есть некая проверка. Если проверка пройдена, документ проводится, если нет, проведение отменяется. Результат проверки зависит от других уже проведенных документов. Т.е, скажем, если провели документ А, то при проведении документа Б проверка выдаст отрицательный результат и проведение документа Б будет отменено. Все это замечательно работает пока не возникает ситуация, когда документ А и Б начинают проводится в разных сеансах одновременно (с разницей менее секунды). Происходит удивительная вещь: оба документа проводятся, так, как если проверка пройдена в обоих случаях. Если же проводить последовательно, то как и положено, А проведется, Б не проведется. Мне всегда казалось, что 1С 7.7 не позволяет проводить одновременно 2 документа и если один начал проводиться, то второй в это время должен ждать окончания транзакции предыдущего. А тут получается, что проверка у документов А и Б проходит до того, как одни из них провелся, т.е. проведение идет параллельно? А как же блокировка? Или я чего-то не понимаю? На всякий случай: проведение производится из внешней обработки через метод Провести().
у кого какие мысли?
1 Ёпрст
 
18.10.19
13:03
(0) какой загадочный и непознаный мир клюшек
2 Garykom
 
гуру
18.10.19
13:03
(0) Открой для себя удивительный мир транзакций
3 Злопчинский
 
18.10.19
13:08
а по теме? птицы-говоруны вы наши...
4 Злопчинский
 
18.10.19
13:09
документ ждет не окончания транзакции и освобождения от блокировки какого-либо нужного обьекта.
5 Злопчинский
 
18.10.19
13:10
поэтому, в общем случае, паралельное проведение документов может быть.
.
правда я не помню, в какой именно момент блокируется общий журнал. это типа единственный общий ресурс, который блокируетяс при проведении всеми документами.
6 Злопчинский
 
18.10.19
13:11
(4) читать так: "не окончания транзакции, А освобождения от блокировки..."
7 Aleksey
 
18.10.19
13:19
(0) Открой документ А и не проводи. После этого открой документ Б и проведи его. Затем провести документ А. Классика же

Менеджер делает заявку, на основании его девочка делает реализацию. В это время (так как реализация еще не записана, т.е. нельзя физически узнать что делает девочка) менеджер заходит в заявку и добивает позиции и проводит ее. Но для девочки заполнение ТЧ происходит при создании, т.е. "добивки"не попадут в документ. И как результат прибегает менеджер и орет на девочку, что какого в реализации нет этого товара.
8 Aleksey
 
18.10.19
13:23
Вывод. В момент создания документа Б документ А должен быть заблокирован (Блокировка()), чтобы не одна пада не смогла войти в документ А и что то с ним сделать. Главное не забыть разблокировать документ при закрытии документа А
9 Aleksey
 
18.10.19
13:23
* при закрытии документа Б
10 trad
 
18.10.19
13:25
(0) из описанной ситуации ясно что проведение Б зависит от проведения А, но неясно зависит ли проведение А от Б.
Вполне вероятно что Б проводится до проведения А, а А позже
11 Garykom
 
гуру
18.10.19
13:28
А
НачатьТранзакцию();
Рез = ПроверитьОстатки();
Если Рез>0 Тогда
Провести();
Иначе
ОтменитьПроведение();
КонецЕсли;
ЗафиксироватьТранзакцию();

Б
НачатьТранзакцию();
// опс ждем пока А

ЗЫ
Проблема в том что проверка делается не внутри транзакции (неявной в ОбработкаПроведения()) а снаружи.
А само проведение доков по Провести() ни хрена не проверяет.
12 gamletspb
 
18.10.19
13:30
(11) да если бы. В том то и дело, что проверка именно внутри ОбработкаПроведения().
13 Kigo_Kigo
 
18.10.19
13:31
а проверить Если а.Проведен() тогда? не
14 gamletspb
 
18.10.19
13:34
(10) если быть более точным, то проверка идет на остатки, которые зависят от проведенных документов.. собственно достаточно стандартная проверка при проведении - как такое вообще возможно я не понимаю
15 gamletspb
 
18.10.19
13:34
(13) "Если а.Проведен() тогда?" - и куда это воткнуть?
16 Kigo_Kigo
 
18.10.19
13:38
(15) Перед тем как работать с Б
Нашли док А, что бы запустить проверку дока А , проверяем док А.Проведен() = 0 тогда
Сообщить("Док А" + "А.ДатаДок " + "А.НомерДок" +"не проведен, не готов к обработке"
далее на усМотрение, но так откат дока Б
17 trad
 
18.10.19
13:40
(14) проверка остатка на какой момент времени делается?
18 gamletspb
 
18.10.19
13:42
(17) РассчитатьРегистрыНа(ТекущийДокумент());
19 trad
 
18.10.19
13:43
(18) Б проводится раньше А
Б проводится потому, что остатки есть, так как А не еще проведен
А проводится потому что раньше Б на оси и на его позицию остатки есть
20 trad
 
18.10.19
13:43
* так как А еще проведен
21 trad
 
18.10.19
13:44
(20) * тьфу
так как А еще не проведен
22 gamletspb
 
18.10.19
13:47
(19) замечательно, и как тогда решить задачу по проверке остатков если у нас вводится куча документов параллельно?
23 trad
 
18.10.19
13:51
(22) подозрения на параллельное проведение развеяны?
24 gamletspb
 
18.10.19
13:54
(19) проблема в том что они в итоге проводятся оба
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.