Имя: Пароль:
1C
 
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
Документ пометили на удаление и снесли его, или заменили номер в нём на номер не из последовательности - образовалась дыра. Как заделывать?
Поэтому - без разницы, сколько документов получат свой уникальный порядковый номер, но не будут потом записаны - дыры (разрывы в нумерации) появятся и без этого.
Формируйте номер при записи нового и будет вам счастье.
Второй документ может получить тот же номер, что и недозаписанный первый, но при второй попытке записи - таки получит новый последовательный номер.
Если же нужно избегать сообщение пользователю "номер не уникален", то... нужно избегать и все остальные сообщения от системы (дедлок, таймаут, переменная модуля не определена)...
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан