Имя: Пароль:
1C
1С v8
Блокировка данных. Как правильно расписать?
, ,
0 new1snik
 
21.10.13
15:16
День добрый.
Нужно заблокировать данные в регистрах на момент выполнения запроса.
Запрос собирает данные из 3 регистров накопления. Размещаю этот код перед запросом:

Блокировка = Новый БлокировкаДанных;
        ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
        ЭлементБлокировки.УстановитьЗначение("Регистратор", ДокументОбъект.Ссылка);
        ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
        Блокировка.Заблокировать();
        
        Блокировка = Новый БлокировкаДанных;
        ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыВРознице");
        ЭлементБлокировки.УстановитьЗначение("Регистратор", ДокументОбъект.Ссылка);
        ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
        Блокировка.Заблокировать();
        
        Блокировка = Новый БлокировкаДанных;
        ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыВРезервеНаСкладах");
        ЭлементБлокировки.УстановитьЗначение("Регистратор", ДокументОбъект.Ссылка);
        ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
        Блокировка.Заблокировать();

Будет ли это работать как надо и нужно ли как-то дополнительно потом разблокировать заблокированные регистры?
1 Рыжий Лис
 
21.10.13
15:20
Блокировка работает внутри транзакции. Завершится транзакция и блокировка снимется.
2 new1snik
 
21.10.13
15:25
(1) Получается, такая блокировка будет работать только пока выполняется запрос в процедуре? И код блокировки верен?
3 Рыжий Лис
 
21.10.13
16:09
Если нет транзакции то и не будет работать.
В коде нужно оставить только одну строку
Новый БлокировкаДанных;
и
Блокировка.Заблокировать();
4 Мэс33
 
21.10.13
16:14
Интересная тема.
Вот вопрос: на момент создания документа - движений по РН еще нет. Но надо заблокировать прочтенные остатки по выбранной номенклатуре.
То есть - я понимаю так, что надо блокировать конкретные значения в регистре, пример:

ЭлементБлокировки.УстановитьЗначение("Номенклатура",Справочники.Номенклатура.НайтиПоНаименованию("Товар"));

И это сделать перед запросом. Правильно ли думаю?
5 Рыжий Лис
 
21.10.13
16:44
Если надо по одной номенклатуре то можно и так. А вообще есть ИспользоватьИзИсточникаДанных, например из табличной части документа. Конечно перед запросом.
6 GROOVY
 
21.10.13
16:46
7 ptiz
 
21.10.13
16:48
(0) В чем цель такой странной блокировки?
8 Sabbath
 
21.10.13
16:54
(0) а зачем?
8.1 или 8.2.?
9 GROOVY
 
21.10.13
16:56
(7) (8) Никакого смысла там нет.
10 new1snik
 
22.10.13
07:05
(7) (8) Задача стоит следующая: существует рабочая обработка, создающая резервы по определенному заказу. Чтобы создать резервы запросом собираются данные по различным регистрам, и мне, если я все правильно понимаю, нужно заблокировать возможность внесения изменений в регистры в момент, когда обработка создает резервы.
11 new1snik
 
22.10.13
07:06
(6) Спасибо, определенно лишним мне не будет.
12 ptiz
 
22.10.13
08:49
(10) "нужно заблокировать " - зачем? цель понимаешь?
13 new1snik
 
22.10.13
08:56
(12) Чтобы в момент проведения резервирования не был зарезервирован тот же товар, который резервируем мы или не был продан.
14 GROOVY
 
22.10.13
09:08
(13) Описанное в (0) не даст Вам этот результат. Даже больше скажу, скорее всего вообще ничего не даст.
15 new1snik
 
22.10.13
09:20
(14) Как заметно в блокировках я ничего не смыслю. Но почему невозможно добиться поставленной цели?
16 vhl
 
22.10.13
09:28
а "ДЛЯ ИЗМЕНЕНИЯ" не подойдет?
17 new1snik
 
22.10.13
09:39
(16) Хм, я не знал о такой штуке, нужно смотреть, но беглое ознакомление дает надежду на то, что можно попытаться использовать ее.
18 ptiz
 
22.10.13
10:46
(15) " проведения резервирования не был зарезервирован тот же товар" - тогда блокировка должна быть по значениям измерения, в котором указаны товары этого документа. И только по этому складу (если в алгоритме не заложено какое-нибудь автоматическое распределение по складам).
19 GROOVY
 
22.10.13
10:49
(16) При автоматических - подойдет.
(15) Просто попробуйте мыслить логически: Вы говорите заблокировать записи в регистрах которые принадлежат текущему документу, что будет заблокировано? Это то что Вы хотели?
20 new1snik
 
05.11.13
11:01
Так я на них и завис после этого. Сейчас навтыкал в запрос где только можно ДЛЯ ИЗМЕНЕНИЯ и пытаюсь это тестировать.
ЗАпускаю отладку, ставлю точку останова после выполнения запроса и запускаю еще один сеанс, где пытаюсь выполнить туже операцию. Во втором сеансе ведь должно быть невозможно прочитать запросом те же данные, что и в первом сеансе. Но данные считываются. Есть ли какие то дополнительные условия для применения ДЛЯ ИЗМЕНЕНИЯ в запросе?
21 new1snik
 
05.11.13
12:47
(19) Получается нужно блокировать не определенные записи в регистре накопления, а весь регистр, например, РН ТоварыВРезервеНаСкладах.