|
1С управление блокировкой | ☑ | ||
---|---|---|---|---|
0
olo_lo1
08.11.18
✎
11:21
|
Подскажите кто в курсе как это работает, что то затупил с утра
На конфу поставил Управляемый режим блокировкой На Документ поставил Управляемый Режим управления блокировкой данных При установке нового номера написал свою процедуру в транзакции ставлю ТОЧКУ ОСТАНОВА по идее должна случиться блокировка этого документа Захожу во вторую базу Создаю документ и провожу - все проводит, документ новый выписывает. Подскажите где и что нужно смазать и чем ? |
|||
1
Numerus Mikhail
08.11.18
✎
11:26
|
(0) >> захожу во вторую базу
ну очевидно в чем |
|||
2
olo_lo1
08.11.18
✎
11:28
|
(1) Я описался, в туже базу но еще раз под тем же пользователем
если понимать теорию вопроса - обьект должен заблокироваться. |
|||
3
el-gamberro
08.11.18
✎
11:30
|
А причем тут блокировка?
|
|||
4
Numerus Mikhail
08.11.18
✎
11:30
|
(2) Ну по идее блокировка устанавливается на твой новый документ, а не на всю таблицу
Логично, что новый ты создать можешь |
|||
5
Остап Сулейманович
08.11.18
✎
11:30
|
(2) "обьект должен заблокироваться". Так он и заблокирован.
Новый документ в сеансе "1" и Новый документ в сеансе "2" - это разные объекты. Более того. Пока документ не записан - это вообще не объект. |
|||
6
olo_lo1
08.11.18
✎
11:32
|
(5) Тогда подскажите мне как быть, щас опишу суть проблемы
|
|||
7
olo_lo1
08.11.18
✎
11:34
|
Нумерация сложная, и с префиксами и с суффиксами и корнями.
Номер присваиваю своим алгоритмом. Контроль уникальности выключен, но должен быть внутри организации, а их несколько, но с разными организациями одинаковые номера могут быть Несколько пользователей делают одновременно документы. Номера к сож задваивают, нужна изоляция в момент присвоения. Как добиться |
|||
8
RoRu
08.11.18
✎
11:36
|
(7) проверять при записи ?
|
|||
9
Вафель
08.11.18
✎
11:38
|
тут блокировку нужно ставить самому програмно.
|
|||
10
el-gamberro
08.11.18
✎
11:38
|
(7) Делай подписку на событие "ПриУстановкеНовогоНомера" и проверяй, устанавливай что надо.
|
|||
11
el-gamberro
08.11.18
✎
11:39
|
(9) Тут никакую блокировку сделать нельзя
|
|||
12
Остап Сулейманович
08.11.18
✎
11:39
|
(7) Классика такова :
Регистр сведений с последним выданным номером (или со всей последовательностью номеров) на время расчета следующего оно блокируется. Запросили расчет с рабочего места - пытаемся установить блокировку. Получилось - рассчитали номер. Записали. Сняли блокировку. Не получилось - ждем пока не освободиться или отменяем запись. |
|||
13
el-gamberro
08.11.18
✎
11:39
|
Для документа блокировка имеет смысл, только когда 2 пользователя будут пытаться одновременно его поменять.
|
|||
14
el-gamberro
08.11.18
✎
11:44
|
(12) Странный механизм.
Лучше просто запись номера делать который документ взял. Следующий берет больше и добавляет запись. При записи самого документа удалять запись в РС Нумерации. |
|||
15
Остап Сулейманович
08.11.18
✎
11:44
|
(13) Ну да. Поэтому и уводят блокировки с документа в регистр сведений. Там единственная запись на все документы одного вида.
|
|||
16
el-gamberro
08.11.18
✎
11:45
|
(12) Блокировка в описанном механизме работать не будет.
|
|||
17
Остап Сулейманович
08.11.18
✎
11:46
|
(14) "Следующий берет больше и добавляет запись." А если "следующих" двое или больше?
(16) Будет. Более того. Работает. |
|||
18
el-gamberro
08.11.18
✎
11:47
|
(17) А да я понял, работать будет. Блокировка на время расчета номера.
Ну это по сути попытка внедрить механизм из 7.7 |
|||
19
olo_lo1
08.11.18
✎
11:55
|
(17)
может глуповатый вопрос задам - а блокировку на кусок выполнения кода нельзя выставить ? |
|||
20
olo_lo1
08.11.18
✎
12:05
|
(7) Остап Сулейманович, правильно ли я понимаю что в этом случае (0) сработает и под вторым пользователем запись документа "подвиснет" . И где можно выставить таймаут на время, колько она будет "ждать"
|
|||
21
Остап Сулейманович
08.11.18
✎
12:15
|
(20) Ничего не подвиснет. Все в ваших руках.
Пример: Попытка КлючЗаписиРС = ... ЗаблокироватьДанныеДляРедактирования(КлючЗаписиРС); Номер = РассчитатьНовыйНомер(); РазблокироватьДанныеДляРедактирования(КлючЗаписиРС); Исключение ПоказатьПредупреждение(,"Не удалось получить новый номер"); КонецПопытки; |
|||
22
ptiz
08.11.18
✎
12:19
|
(21) Только ничего разблокировать принудительно не следует - само разблокируется по окончании транзакции (кстати, она должна быть начата), а раньше этого разблокировать нельзя.
|
|||
23
olo_lo1
08.11.18
✎
12:21
|
(22) то есть этот код все таки нужно выполнять в транзакции ?
Как я понимаю ПриУстановкеНовогоНомера уже идет в транзакции, разве нет ? |
|||
24
Cyberhawk
08.11.18
✎
12:23
|
Можно при получении очередного порядкового номера просто записывать новый элемент справочника и брать его код
|
|||
25
olo_lo1
08.11.18
✎
15:10
|
(24) видимо вы не вниклись в проблему. 2 отдельных человека при одновременной записи или при пакетной записи обязательно 2 процесса поставят один и тот же номер, поэтому нужна гарантированная блокировка.
|
|||
26
youalex
08.11.18
✎
15:20
|
(23) 1.ЗаблокироватьДанныеДляРедактирования - работает и без транзакции.
2. Скорее да, чем нет. можете сами проверить: ТранзакцияАктивна() |
|||
27
Cyberhawk
08.11.18
✎
15:25
|
(25) Видимо ты баклан
|
|||
28
bolobol
08.11.18
✎
15:42
|
Документ пометили на удаление и снесли его, или заменили номер в нём на номер не из последовательности - образовалась дыра. Как заделывать?
Поэтому - без разницы, сколько документов получат свой уникальный порядковый номер, но не будут потом записаны - дыры (разрывы в нумерации) появятся и без этого. Формируйте номер при записи нового и будет вам счастье. Второй документ может получить тот же номер, что и недозаписанный первый, но при второй попытке записи - таки получит новый последовательный номер. Если же нужно избегать сообщение пользователю "номер не уникален", то... нужно избегать и все остальные сообщения от системы (дедлок, таймаут, переменная модуля не определена)... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |