![]() |
![]() |
|
Блокировка регистра сведений из формы записи этого регистра | ☑ | ||
---|---|---|---|---|
0
lEvGl
гуру
04.07.25
✎
20:33
|
Подскажите в ситуации:
РС, в нем одно измерение Номер (порядковый). В форме записи этого РС вносятся и записываются данные. Нужно заполнить измерение Номер этой записи так, чтобы на время записи этой Записи другой сеанс не считал такой же номер в другой Записи и не получилось дублей по измерению Номер Максимальный Номер получается запросом к этому регистру, потом +1, это и есть значение для текущей записи То есть ситуация - наложение блокировки для чтения на РС в транзакции записи Записи (менеджер записи) этого регистра. Форма записи регистра сведений &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.РС"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(МАКСИМУМ(РС.Номер), 0) КАК Номер |ИЗ | РегистрСведений.РС КАК "; ТекущийОбъект.Номер = Запрос.Выполнить().Выгрузить()[0].Номер + 1; КонецПроцедуры |
|||
1
Волшебник
04.07.25
✎
20:31
|
Заведите константу и её блокируйте
|
|||
2
lEvGl
гуру
04.07.25
✎
20:40
|
что получилось: блокировка накладывается успешно, точкой останова тормозим текущий (первый) сеанс. Второй сеанс в это время не может заблокировать еще раз, висит и ждет - ок. Но он выхватывает запросом номер, как только первый выходит из процедуры ПередЗаписюНаСервере. То есть если поставить еще одну точку в первом сеансе на ПриЗаписиНаСервере (и на ней будет висеть указатель), то второму сеансу на это просто чхать, он хватает ПередЗаписью запросом нормер и успешно проводит запись своей Записи. Оба сеанса записывают в бд записи с одинаковым Номером. Не записывают, но пытаются
|
|||
3
lEvGl
гуру
04.07.25
✎
20:38
|
(1) хыммм просто и без затей.. ну по правильному хотелось бы
|
|||
4
Мультук
гуру
04.07.25
✎
20:42
|
(3)
Поменять РС на документ ? |
|||
5
Волшебник
04.07.25
✎
20:47
|
(3) Самые простые решения являются правильными с точки зрения ТРИЗ ( wiki:Теория_решения_изобретательских_задач )
|
|||
6
Волшебник
04.07.25
✎
20:48
|
(4) и создать нумератор. Да ну, скучно. Вы же гуру. Придумайте что-то поинтереснее
|
|||
7
lEvGl
гуру
04.07.25
✎
20:53
|
(4) там 3 реквизита и одно измерение
(6) константа с номером для каждого регистра, где это надо? да ну.. |
|||
8
Волшебник
04.07.25
✎
20:54
|
(7) Ого! Много регистров! Держите нас в курсе
|
|||
9
Волшебник
04.07.25
✎
20:55
|
А почему под каждый регистр не создать константу? Вы же регистр создали (
|
|||
10
lEvGl
гуру
04.07.25
✎
21:04
|
нет, не я создал
|
|||
11
Волшебник
04.07.25
✎
21:06
|
(10) Будь мужиком, создай константу!
|
|||
12
lEvGl
гуру
04.07.25
✎
21:33
|
так сделал, не по-мужски и хер с ним
Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.РС"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(МАКСИМУМ(РС), 0) КАК Номер |ИЗ | РегистрСведений.РС КАК РС"; ТекущийОбъект.Номер = Запрос.Выполнить().Выгрузить()[0].Номер + 1; ТекущийОбъект.Записать(); ЗафиксироватьТранзакцию(); 3 уровня вложенности транзакций, только хардкор пойдет? а то константами базу не завалишь |
|||
13
Волшебник
04.07.25
✎
21:47
|
(12) говнокод детектед
|
|||
14
H A D G E H O G s
04.07.25
✎
22:32
|
В ПередЗаписьюНаСервере у тебя платформенная транзакция еще не открыта.
Ты открываешь свою транзакцию, накладываешь блокировку, которая работает до конца транзакции иии, выходишь из процедуры. При этом платформа откатывает твою транзакцию и снимает блокировку. Тебе надо делать весь твой код в модуле объекта, в ПередЗаписью, не открывая никаких своих транзакций, там уже будет открыта платформенная. А потом перечитать обьект в форме, в ПослеЗаписиНаСервере (или он сам перечитается, я уж не помню) |
|||
15
lEvGl
гуру
04.07.25
✎
22:56
|
(14) ппц а че я думаю что транзакция началась еще в передзаписью?.. и в картинку влипал несколько раз
![]() проверяем.. |
|||
16
Волшебник
04.07.25
✎
23:03
|
(15) подумаешь, картинки... Зацените, айти-братва, он тут нам картинки лепит из учебника!
|
|||
17
lEvGl
гуру
05.07.25
✎
00:17
|
(14) КомментарийВерсии рулит
тупанул с началом транзакции, благодарю! модуль набора Процедура ПередЗаписью(Отказ, Замещение) Если ЗначениеЗаполнено(ЭтотОбъект) И Не ЗначениеЗаполнено(ЭтотОбъект[0].Номер) И ЭтотОбъект.ЗаписьИсторииДанных.КомментарийВерсии = "МенеждерЗаписи" Тогда Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.РС"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; //НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(МАКСИМУМ(РС.Номер), 0) КАК Номер |ИЗ | РегистрСведений.РС КАК РС"; Номер = Запрос.Выполнить().Выгрузить()[0].Номер + 1; ЭтотОбъект.Отбор.Номер.Установить(Номер); ЭтотОбъект[0].Номер = Номер; //ТекущийОбъект.Записать(); // //ЗафиксироватьТранзакцию(); КонецЕсли; КонецПроцедуры зы. справедливости ради скажу что в ПриЗаписиНаСервере формы, где транзакция еще идет, писал тоже самое, но был косяк "Данные не соответствуют установленному отбору" и запись просто не добавлялась, видимо из за смены значения измерения. Но наверно просто на этом этапе уже нельзя менять значения полей. Возможно если там писать тоже будет нормально, но уже лень, транзакция типа цельная и неважно где блок ставить, с момента ее установки в первом сеансе второй будет ждать пока транзакция первого не закончится |
|||
18
lEvGl
гуру
05.07.25
✎
01:19
|
(16) это потому что кодить надо чаще и + все эти ваши управляемые дела, но вы не расстраивайтесь и не радуйтесь, будут и еще косяки :P))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |