Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Параллельное проведение документов

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

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

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


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


Список тем форума
Рекламное место пустует  Рекламное место пустует
Миста — веселый ресурс со своими эксклюзивными тараканами Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.