Имя: Пароль:
1C
1С v8
Вопрос про оптимистическую блокировку, разрыв шаблона
,
0 ШангриЛа
 
08.06.13
13:37
Встретил конфигурацию, где в обработках, выполняющих изменение данных в справочниках и документах, вовсю применяются конструкции:
1. ЗаблокироватьДанныеДляРедактирования(<Ключ>, <ВерсияДанных>, <ИдентификаторФормы>)
2. ОбъектЭкземпляр2 = Справочники.Номенклатура.НайтиПоКоду(1).
ПолучитьОбъект();
ОбъектЭкземпляр1.Заблокировать();

В руководстве разработчика написано по этому поводу следующее:
"Однако следует учитывать, что сам по себе факт
установки оптимистической блокировки не препятствует изменению или удалению объекта в базе данных."

Вопрос:
допустим, в этот момент времени исполняется другой код, который изменяет данные заблокированные этими конструкциями языка.
Код спокойно изменит и запишет данные, наплевав на эти блокировки?
1 ШангриЛа
 
08.06.13
13:57
ДА, это так.

В одной обработке делаю c точкой останова:

&НаКлиенте
Процедура Команда1(Команда)
   Заблокировать();
КонецПроцедуры

Процедура Заблокировать()
   
   Объект.Реквизит1.ПолучитьОбъект().Заблокировать();
   
КонецПроцедуры


В другой обработке ничто не мешает сделать:

Процедура Изменить(Ссылка) Экспорт
   Ссылка.ПолучитьОбъект().Записать();
КонецПроцедуры
2 ШангриЛа
 
08.06.13
13:58
Пля, сколько же людей владеет ЛОЖНЫМИ знаниями и делают из других идиотов!
3 ШангриЛа
 
08.06.13
14:00
+(2) и при этом, даже руководство разработчика им не указ!
4 ШангриЛа
 
08.06.13
14:32
Один чувак блокировал записи такими конструкциями, пытался их интерактивно открыть в другом сеансе, открывающаяся форма сообщала, что данные заблокированы.

И он думал, что заблокировал объекты в БД. Ржака жесткая!
5 ШангриЛа
 
08.06.13
16:39
Эта конструкция тоже никак не мешает изменить данные из другой обработки или кода, выполняющегося в другом сеансе.

&НаКлиенте
Процедура ЗаблокироватьДляРедактирования(Команда)
   ЗаблокироватьДляРедактированияНаСервере();
КонецПроцедуры

Процедура ЗаблокироватьДляРедактированияНаСервере()
   ЗаблокироватьДанныеДляРедактирования(Объект.Реквизит1,,ЭтаФорма.УникальныйИдентификатор);
КонецПроцедуры
6 ШангриЛа
 
08.06.13
16:45
Про такие блокировки сказано следующее:
Однако следует учитывать, что сам по себе факт
установки пессимистической блокировки не препятствует изменению или удалению объекта в базе данных.

Вывод:
Это блокировки, устанавливаемые для того, что другой ПОЛЬЗОВАТЕЛЬ не мог через другую ФОРМУ поменять объект базы данных.

Они никак не относятся  и не блокируют объект базы данных от программного изменения из других сеансов.

Для этого есть управляемые блокировки (Новый БлокировкаДанных), конструкция запроса "ДляИзменения" и НачатьТранзакцию.
7 Emilio
 
08.06.13
16:52
(2) А почме ложные данные? если надо программно изменить данные, мы их заблокируем, а на случай если юзер захочет изменить данные сам - мы ему ответим, что бы он шел лесом. вроде все логично или нет?
8 ШангриЛа
 
08.06.13
16:55
(7) набуя в обработке данных применять эти конструкции, какой в этом смысл?

Другая такая же обработка, запущенная другим пользователем, спокойно все поменяет параллельно в БД.
9 ШангриЛа
 
08.06.13
16:58
(7) применять такие вещи имеет смысл только в ситуации, когда необходимо предотвратить интерактивное открытие пользователем объекта БД на редактирование.

Их можно применять и в обработке. Но тогда должна быть конструкция, проверяющая блокировку: Если Объект.Заблокирован() Тогда НеТрогатьДляЗаписи КонецЕсли.

Но это просто проверка, не препятствующая никак записи объекта в БД. И таких проверок в конфе нет.
10 Emilio
 
08.06.13
17:05
(8) ну, с обработкой-то ясно. сама по себе цель конструкции не несет в себе использования в обработках, если в обработке нет кода проверки запущена ли в другом сеансе эта же обработка или может она предназначена в для одного только человека, к примеру обработка перепроведения доков за период админом базы, дабы умные бухи ничего не на крутили, но если в Вашем случае, то корявый мозг предыдущего прогера, если уж даже я понимаю смысл и цель такой блокировки
з.ы. не подумайте, что я туп, просто я еще только учусь одинэситься :)
11 ШангриЛа
 
08.06.13
17:08
(10) вы все правильно понимаете. Нет смысла их использовать при массовом изменении данных. Для этого есть другие механизмы платформы :)
12 ШангриЛа
 
08.06.13
17:09
+(11) особенно, если есть вероятность, что в момент работы обработки данные могут быть изменены из другого кода.
13 sanja26
 
09.06.13
01:53
(27) полный бред.
Сегодня целый день в депрессняке читал руководство разработчика и тестил работу этого метода в форме.

Этот метод ВСЕГО-ЛИШЬ устанавливает некий флаг, который срабатывает при открытии пользователем формы или просто сидит в БД для того, чтобы его можно было прочитать из кода.

Данные в бд он не блокирует и их спокойно можно менять из доугого сеанса программным кодом.

ты хоть посмотрел какой у тебя режим используется?
14 ШангриЛа
 
09.06.13
02:03
(13) тестил на том режиме, на котором конфа в офисе
15 ШангриЛа
 
09.06.13
02:04
(13) кури до дыр руководство разработчика, глава 10
16 ШангриЛа
 
09.06.13
02:06
+(15) могу тебе конфигурацию прислать, в которой тестировал этот метод. Если сделаешь так, чтобы обработка не смогла изменить заблокированный элемент справочника - отдам тебе все старт-мани и еще 100$ в придачу.
17 Reaper_1c
 
09.06.13
02:10
(16) эмо 1сник, ах-ха-ха, прекрати, что ты делаешь?
18 sanja26
 
09.06.13
02:11
(16) присылай, завтра гляну
19 ШангриЛа
 
09.06.13
02:17
(18) отправил даже описание теста, гляди...
20 GROOVY
 
09.06.13
02:32
Продолжайте наблюдения, а вместе с этим почитайте про блокировки в учебниках для начинающих...
ЗЫ: У меня прям неделя насыщена вопросами про блокировки... Казалось бы...
21 ШангриЛа
 
09.06.13
02:37
(20) :)
Основная теорема систематики: Новые системы плодят новые проблемы.