Имя: Пароль:
1C
1С v8
Как заблокировать РегистрСведений на изменение пока открыта форма обработки
,
0 BaronAlex
 
16.11.12
18:51
Помогите плизз, Как заблокировать РегистрСведений на изменение пока открыта форма обработки согласования. Т.е. Есть администратор и пользователь. Имеются заявки которые создает пользователь, и есть Администратор который открывает свою обработку для согласования данных записей. Так вот надо чтобы пока Администратор работает в обработке согласования регистр полностью блокировался на изменения,как администратор выйдет с обработки чтобы регистр стал разблокированным. Спасибо.
1 tuxik07
 
16.11.12
19:05
никак
2 Axel2009
 
16.11.12
19:05
(0) устанавливай константу. при каждой попытке изменения обычным пользователем считывай эту константу
3 Нуф-Нуф
 
16.11.12
20:06
Управляемая блокировка?
4 BaronAlex
 
19.11.12
09:51
(3) А есть рабочий пример кода на блокировку регистра сведений управляемой блокировкой?
5 AndyTLT63
 
19.11.12
09:55
Никогда не занимался блокировкой регистров сведений.... Интересно посмотреть как лушче это реализовать...
6 Нуф-Нуф
 
19.11.12
09:57
БлокировкаДанных (DataLock)
БлокировкаДанных (DataLock)
Элементы коллекции:

ЭлементБлокировкиДанных
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы блокировки.
Возможно обращение к элементам блокировки посредством оператора [...]. В качестве аргумента передается индекс (нумерация с 0).

Методы:

Добавить (Add)
Заблокировать (Lock)
Количество (Count)
Получить (Get)

Конструкторы:

По умолчанию

Описание:

Предназначен для явной блокировки данных от чтения или изменения другими сессиями.

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

Сервер, толстый клиент, внешнее соединение.
Возможен обмен с сервером. Сериализуется.
Пример:

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

БлокировкаДанных = Новый БлокировкаДанных;
ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрСведений.НоменклатураКонтрагентов");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
       НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
БлокировкаДанных.Заблокировать();
8 Undefined vs NULL
 
19.11.12
10:09
а разве после того как передастся управление обратно в интерфейс транзакция не откатится?
9 ssh2012
 
19.11.12
10:12
(8) да, конечно. Форму можно модально открыть, как вариант. В моем примере дальше обработка регистра была и фиксация транзакции.
10 BaronAlex
 
19.11.12
10:13
(7) не срабатывает. Указал данный код при открытии обработки, Открыл, далее под другим пользователем зашел в регистр и мне спокойно дает добавлять записи. а надо блокировать затем буду выдавать сообщение что типа подождите ока Админ закончит работу
11 Reset
 
19.11.12
10:14
(10) --> (8)
12 Reset
 
19.11.12
10:15
Начать транзакцию, открыть форму модально, после закрытия зафиксировать/откатить
13 BaronAlex
 
19.11.12
10:19
(12) У Меня внешняя обработка которая при открытии в табличную часть получает записи из регистра., а под другим сеансом в этот момент пользователь открывает форму регистр и непосредственно в регистр добавляет записи.
P.S Админ работает не в самом регистре сведений, а через сторонюю обработку.
14 Reset
 
19.11.12
10:25
(13) Начать транзакцию, наложить блокировку, открыть форму модально, закрыть форму, отменить/зафиксировать транзакцию
15 BaronAlex
 
19.11.12
10:43
Вот в обработке внешней при открытии :
БлокировкаДанных = Новый БлокировкаДанных;
ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрСведений.ЗаявкиНаДедубликацию");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
БлокировкаДанных.Заблокировать();

В Регистре перед открытием:
Если РольДоступна("ПолныеПрава") И НЕ ФормаЗаполнения Тогда
       
Попытка
ОбщегоНазначения.ОткрытьВнешнийМодуль("ЗаявкиНаДедубликацию");
ОткрытьВнешнийМодуль("ЗаявкиНаДедубликацию");

 Функция ОткрытьВнешнийМодуль(Имя, Вид="Обработка", ДобавитьВКеш=Истина) Экспорт

   Обр = ОбщегоНазначения.ПолучитьВнешнийМодуль(Имя, Вид, ДобавитьВКеш);
   
   Если Обр <> Неопределено Тогда
       
       ФормаОбработки = Обр.ПолучитьФорму();
       ФормаОбработки.ОткрытьМодально();
       
   КонецЕсли;

КонецФункции

Вот в конце видно что форма открыта модально.
Но зайдя под другим пользователем мне все равно дает изменить данные в форме списка.А надо чтобы не давало, пока открыта обрабокта у админа.
16 ssh2012
 
19.11.12
10:50
(15) модально открывать надо внешнюю обработку, где транзакция
17 BaronAlex
 
19.11.12
10:56
а как проверять у пользователя что регистр заблокирован, и выдавать сообщение?
18 ssh2012
 
19.11.12
10:58
(17) сообщение сама система выдаст при записи пользователем.
19 BaronAlex
 
19.11.12
11:01
У меня при попытке добавления выдает сообщение что в данной транзакции уже происходили ошибки, и окно с кнопками завершить или перезапустить. Надо видимо как то явно проверять при попытке добавления если заблокирован, выдавать сообщение ЖДИТЕ!
20 ssh2012
 
19.11.12
11:06
(19) само добавление в попытке что ле происходит в явной транзакции? Что за код там у тебя?
21 BaronAlex
 
19.11.12
11:07
Ошибся - не при попытке добавления, а при попытке открытия на изменение существующего элемента.
22 BaronAlex
 
19.11.12
11:08
При попытке записи нового система выдает сообщение что привышено время ожидания, и не вываливается
23 Maxus43
 
19.11.12
11:08
про "ИзменяетДанные" было уже? это специально придумано чтоб блокировать записи не связанные с конкретным объектом
24 BaronAlex
 
19.11.12
11:17
(23) По подробнее можно?
25 ssh2012
 
19.11.12
11:20
(23) не вижу как это применить здесь
26 Шапокляк
 
19.11.12
11:22
(0) Может быть, как-то по-другому работу организовать? Например, пользователь создает документ, в котором есть как бы проект записей, а Администратор ставит в документе галку и при проведении записи добавляются?
Думаю, сама идея блокировать на запись регистр, если кто-то где-то открыл обработку - несколько странная.
27 BaronAlex
 
19.11.12
11:22
Сейчас все заработало как мне подсказывали до этого, вот только мне надо как то проверять что заблокирован, при открытии формы записи. Ну и если у пользователя уже открыта была форма, то при записи.
28 BaronAlex
 
19.11.12
11:25
(26) Дело в том что Администратор открывает обработку для согласования заявок на дедубликацию контрагентов, и когда он это сделал, делает Заплонировать дедубликацию, которая выполняется регламентным заданием ночью, вот если в тот момент когда админ делал правки и ставил согласованно, пользователь чтото изменил в существующей записи, админ при заплонировании перезапишет изменения. вот для этого надо и блокировать какие лиюо изменения пользователю пока админ согласовывает
29 Reset
 
19.11.12
11:27
"Заплонировать дедубликацию" oO
30 Reset
 
19.11.12
11:28
" сама идея блокировать на запись регистр, если кто-то где-то открыл обработку - несколько странная" +1
31 BaronAlex
 
19.11.12
11:29
Открывать обработку согласованно будет только админ, а админов всего лишь два человека
32 Reset
 
19.11.12
11:30
Имхо как то по другому нужно все организовывать, как - нужно вникать в смысл (28), мне сейчас лень и некогда, поэтому придется ограничится троллингом