Имя: Пароль:
1C
1С v8
Как заблокировать регистр накопления при записи набора?
0 Gorr
 
03.07.14
14:32
Здравствуйте!
В моей обработке выполняется запись довольно большого набора записей в транзакции. Как правильно заблокировать регистр от чтения другими сеансами на время выполнения записи?
Пробовал так:
    Блокировки = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировки.Добавить("РегистрНакопления."+ВыбРегистр);
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    
    НачатьТранзакцию();
    
    Попытка Блокировки.Заблокировать();
    Исключение
        Предупреждение("Не удалось заблокировать регистр!");
        возврат;
    КонецПопытки;


Ставил бряк в отладчике после вызова Заблокировать(), запускал дополнительный сеанс из него консолью запросов без труда прочитал записи блокируемого регистра. Как заблокировать регистр чтобы у других сеансов вообще доступа не было?
1 Fragster
 
гуру
03.07.14
14:35
а режим блокировки у базы какой?
2 Fragster
 
гуру
03.07.14
14:35
и у самого регистра и у транзакции стартованной
3 Spieluhr
 
03.07.14
14:44
(0) все правильно, только вне транзакции (консолью запросов) читать всегда можно
4 Gorr
 
03.07.14
14:48
(1) у конфигурации режим автоматический
5 Fragster
 
гуру
03.07.14
15:02
(4) Выбрать * из Регистр ДЛЯ ИЗМЕНЕНИЯ
6 Жан Пердежон
 
03.07.14
15:03
(0) от зряного чтения - НИКАК
7 floody
 
03.07.14
15:06
(6) от грязного чтения как раз и спасает режим блокировки "исключительный"
8 Maxus43
 
03.07.14
15:13
(7)>(4)

Ну раз автоматический, то о каких Новый БлокировкаДанных; мы вообще говорим
9 Maxus43
 
03.07.14
15:14
тут надо (5), причем в транзакции явной или неявной
10 Жан Пердежон
 
03.07.14
15:17
(7) "исключительный" не дает ставить на ресурс другие блокировки, но никто не мешает читать вообще без установки блокировок, так что (5) не поможет ни разу
11 Maxus43
 
03.07.14
15:19
а, я чот топик то не прочитал, от чтения надо заблокировать...
12 Gorr
 
03.07.14
15:25
остается только УстановитьМонопольныйРежим(Истина);
13 Fragster
 
гуру
03.07.14
15:26
(12) а чем мешает чтение? ну почитают... документы-то все равно не смогут делать...
14 Gorr
 
03.07.14
16:10
(13) существует вероятность получения неверных данных и запись на основании этих неверных данных уже в другие регистры. почему не смогут?
15 Spieluhr
 
03.07.14
16:17
(4) Если у вас автоматический режим блокировок в конфигурации, то пытаться наложить управляемую смысла нет, этот код игнорируется. в последних версиях платформы сделали на этот случай ругалку, т.к. люди путаются

(14) в транзакции нужно получать данные, если на их основе принимаются решения
16 Gorr
 
03.07.14
16:39
(15) таким образом, работу типовых документов моя обработка не заденет?
17 Gorr
 
03.07.14
16:41
поскольку запись обработкой выполняется в транзакции и анализ остатков документами неявно тоже выполняется в транзакции.
18 Fragster
 
гуру
03.07.14
16:41
(16) если сделаешь (5) - типовые документы не смогут проводиться, пока твоя обработка работает
19 Gorr
 
03.07.14
16:47
(18) мне не понятно мне что предлагается в (5)?

//1. Подготовка набора к записи.
НачатьТранзакцию();
Запрос.Выполнить();
//2. ЗаписьНабора
Набор.Записать();
ЗафиксироватьТранзакцию();

Это предлагается в (5)?
20 Gorr
 
03.07.14
16:49
(15) а вы что думаете относительно (18)?
21 Spieluhr
 
03.07.14
16:49
(19) да, это
22 Fragster
 
гуру
03.07.14
16:49
(19) типа того. но как только конфа станет управляемой - код превратится в тыкву
23 Spieluhr
 
03.07.14
16:51
(20) Fragster в (5) и в (18) прав. Но это справедливо, пока конфа в автоматическом режиме блокировок работает
24 Fragster
 
гуру
03.07.14
16:52
(23) т.е. я прав еще и в (22)
25 Spieluhr
 
03.07.14
16:53
(24) конечно
26 Gorr
 
03.07.14
17:06
(22) пожалуйста без эмоций.
Довайте подведем итог. Конструкция "Для изменения" запроса внутри транзакции блокирует всю таблицу не только для записи, но и для чтения другими сессиями при использовании автоматического режима блокировки.
27 Fragster
 
гуру
03.07.14
17:09
вот что пишет справка:
Конфигуратор 1С:Предприятие 8

Предложение ДЛЯ ИЗМЕНЕНИЯ
Предложение ДЛЯ ИЗМЕНЕНИЯ предназначено для указания необходимости блокировки считываемых в транзакции данных.

Считанные данные становятся недоступными для чтения в других сессиях. Для файлового варианта блокируются указанные таблицы, а для клиент-серверного варианта — только выбранные записи. Блокировка снимается после завершения транзакции.
28 Gorr
 
03.07.14
17:16
думаю, если бы в справке додумались написать "ДЛЯ ЧТЕНИЯ" вопросов было бы куда меньше
29 Gorr
 
03.07.14
17:23
в итоге исправил код на

    НачатьТранзакцию();
    
    Запрос = Новый Запрос ("выбрать * из ""РегистрНакопления."+Выбрегистр+" для изменения");
    Попытка Запрос.Выполнить();
    Исключение
        Предупреждение("Не удалось заблокировать регистр!");
        возврат;
    КонецПопытки;
30 Жан Пердежон
 
03.07.14
17:26
(26) не совсем, прочитать не блокирую данные все равно можно
31 Spieluhr
 
03.07.14
17:39
(29) в итоге я так и не понял зачем вам блокировать на чтение весь регистр? Вне транзакции , т.е. из консоли запросов или в любом отчете данные будут прочитаны независимо от установленных блокировок, а параллельные транзакции и так не смогут прочитать те данные, которые вы измените в своей (ваш набор записей).
на выходе получите избыточную блокировку и никакой пользы.
32 Gorr
 
03.07.14
17:52
(31) вот я же вас спрашивал в (16) и (17) постах, но вы промолчали. вот я и подумал что все же нужно блокировать принудительно
33 Spieluhr
 
03.07.14
17:57
(32) ответьте все же на вопрос: зачем вам блокировать на чтение весь регистр?
34 Gorr
 
03.07.14
17:59
(33) давно уже ответил см (14)
35 Gorr
 
03.07.14
18:01
еще непонятно как проверить режим блокировки конфигурации:
если Метаданные.РежимУправленияБлокировкойДанных = РежимУправленияБлокировкойДанныхПоУмолчанию.автоматический
выдает ошибку переменная РежимУправленияБлокировкойДанныхПоУмолчанию не определена
36 Fragster
 
гуру
03.07.14
20:53
(35) смотри в СП вмнимательнее
37 Gorr
 
03.07.14
21:48
ОбъектМетаданныхКонфигурация.РежимУправленияБлокировкойДанных (ConfigurationMetadataObject.DataLockControlMode)
ОбъектМетаданныхКонфигурация (ConfigurationMetadataObject)
РежимУправленияБлокировкойДанных (DataLockControlMode)
Использование:

Только чтение.
Описание:

Тип: РежимУправленияБлокировкойДанныхПоУмолчанию.
Содержит варианты режимов управления блокировкой данных, устанавливаемых по умолчанию.

Доступность:

Сервер, толстый клиент, внешнее соединение.
38 Gorr
 
03.07.14
21:49
я так понимаю РежимУправленияБлокировкойДанныхПоУмолчанию должно быть системное перечисление?
39 Gorr
 
03.07.14
21:53
(36) не вижу нифига
40 Gorr
 
04.07.14
09:24
UP!
41 Spieluhr
 
04.07.14
10:12
42 Gorr
 
04.07.14
10:54
(41) некрасиво.
На случай если кто еще сталкнется с необходимостью проверки объектов метаданных на перечислимое свойство, доступ этим "перечислимым" перечислениям можно получить через "Метаданные.СвойстваОбъектов.ПеоечислимоеСвойство.ЗначениеСвойства"
43 Fragster
 
гуру
04.07.14
11:58
ПеречислимыеСвойстваОбъектовМетаданных (MetadataObjectEnumeratedProperties)
Свойства:

....
РежимУправленияБлокировкойДанныхПоУмолчанию (DefaultDataLockControlMode)
.....

Описание:

Предоставляет доступ к системным перечислениям, выступающим в качестве значений свойств объектов метаданных. Состав и описание системных перечислений объектов метаданных описан в разделе "Системные перечисления свойств объектов метаданных".

Доступность:

Сервер, толстый клиент, внешнее соединение.
См. также:

ОбъектМетаданныхКонфигурация, свойство СвойстваОбъектов
44 Fragster
 
гуру
04.07.14
11:58
в общем метаданные.свойстваобъектов.РежимУправленияБлокировкойДанныхПоУмолчанию.Управляемый
45 Fragster
 
гуру
04.07.14
11:59
а вообще - просто код од другого режима блокировки будет проигнорирован будет
46 Gorr
 
04.07.14
12:01
(45) я сделал так, что в одном случае осуществляется выборка, в другом используется объект блокировка. таким образом получилось универсально.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший