Имя: Пароль:
1C
1С v8
как заблокировать объект в УФ.
0 simol
 
18.10.12
10:21
Есть несколько объектов справочники и документы.
У них только УФ.

Необходимо при открытии формы блокировать объект для того, чтобы в другом сеансе при невозможности заблокировать объект форма открывалась на просмотр.

Сделал в ПриЧтенииНаСервере

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
   
   Попытка
       ТекущийОбъект.Заблокировать();
   Исключение
       ЭтаФорма.НеЗаблокирован = Истина;    
   КонецПопытки;    
   
КонецПроцедуры

Где НеЗаблокирован это реквизит формы.
Но такой вариант не держит блокировку на время, пока форма открыта.

Как еще можно выкрутиться?
1 ilpar
 
18.10.12
11:08
а теперь объясни

Синтаксис:

Заблокировать()
Описание:

Выполняет блокировку объекта от изменения другими режимами или пользователями.

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

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

Попытка
   Объект.Заблокировать();
Исключение
   Текст = "ru = ""Не удалось заблокировать объект"";"
          + " en = ""Can't lock the object""";
   Предупреждение(НСтр(Текст) " """ + Объект + """!
          |"+ ОписаниеОшибки());
КонецПопытки;
2 simol
 
18.10.12
11:19
(1)А что объяснять?
3 simol
 
18.10.12
11:20
(1)В УФ у меня не работает. получается блокировка до перехода на Клиент УФ
4 simol
 
18.10.12
11:49
Где вы, гуру блокировок?
5 zladenuw
 
18.10.12
11:59
БлокировкаДанных в сп
6 vmv
 
18.10.12
12:02
да почитай там сп, Гилевых - просветись и напомни мне как там и чо, просто все стесняються завить, что профаны в этом вопросе - я нет, требую знаний

ИДИ КОПАЙ и взахлеб опиши решение, иначе я предам тебя анафеме!
7 simol
 
18.10.12
12:04
(5)
там только два режима:
Исключительный (Exclusive)
Разделяемый (Shared)

Исключаемый мне не подходит, так как не смогут отрывать во втором сеансе на просмотр
Разделяемая не подходит, так как во втором сеансе она без проблем на разделяемую наложится

Можно ли прочитать есть разделяемые блокировки или нет?

Вариант накладывать исключающую и при положительном исходе снимать и накладывать разделяемую смущает, что есть разрыв.

Или можно у разделяемой блокировки на ходу менять режим?
8 simol
 
18.10.12
12:07
В общем пробую накладывать исключающую и при положительном исходе ее же переводить в разделяемую
9 Жан Пердежон
 
18.10.12
12:07
(8) не путай объектные и табличные блокировки
10 simol
 
18.10.12
12:08
(9)Так управляемая же объектная
11 Жан Пердежон
 
18.10.12
12:09
(10) как все запущено
12 simol
 
18.10.12
12:10
(11)как все не начато ;). Я жертва автоматических блокировок и обычных форм
13 simol
 
18.10.12
14:35
Сделала такую блокировку:


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

   Блокировка.Заблокировать();



Не пойму почему поля блокировки двумя строками http://screencast.com/t/eoirO4gTZanh, а не одной
14 AaNnDdRrEeYy
 
18.10.12
14:40
Блокировка снимается как только происходит выход из процедуры в которой она была создана.
и зачем ставить блокировки на открытую форму? есть же версия данных которая не даст записать объект который уже кемто был записан после открытия формы.
15 simol
 
18.10.12
14:50
(14)
- У меня две базы, между которыми идет обмен каждые N минут.
- В обоих базах одни и те же элементы справочника могут менять между обменами и получится, что на момент обмена один и тот же элемент изменился в двух базах.
- Для разрешения этой ситуации я в обоих базах сделал регистр захваченных объектов.
- В случае отсутствия в нем записи о конкретном элементе справочника, я понимаю, что последний раз элемент редактировался не здесь и через ВебСервис проверяю регистрацию этого элемента в плане обмена во второй базе. В случае отсутствия изменений я во второй базе в регистре убираю захват, а в первой записываю захват. Если это удалось, то форма открывается в режиме редактирования, если захватить не удалось то форма открывается на чтение.

Все это нормально запустилось.

Но может быть ситуация, когда объект во второй базе открыли в форме. изменять не начали и ответственно объект еще не заблокировался, В плане обмена регистрации нет и первая база будет думать, что можно редактировать.

Вот мне и нужно при открытии формы сразу блокировать объект
16 simol
 
18.10.12
14:52
+(15) а нужно либо в первой базе понять, что во второй открыта форма, либо во второй перехватить событие (которого нет) о том, что в форме начинают редактировать объект, то есть происходит захват объекта.
17 AaNnDdRrEeYy
 
18.10.12
15:04
(16)>>либо во второй перехватить событие (которого нет) о том, что в форме начинают редактировать объект,

Зато есть свойство Модифицированность оно истина когда что то изменили на форме но еще не записали
18 AaNnDdRrEeYy
 
18.10.12
15:04
можно его проверять и если оно истина то значит не просто открыли а правят, хотя это изврат какойто
19 olegves
 
18.10.12
15:15
(15) при открытии в форме также пищи запись в этот регистр, а при закрытии стирай, только добавь реквизит с номером сессии и фоновое задание, которое будет удалять записи для неактивных сессий
20 AaNnDdRrEeYy
 
18.10.12
15:18
(19)оставит ктонибудь открытым документ на ночь и свалит домой . и все обмен обломался
21 simol
 
18.10.12
15:19
(20) Обмен не поломается, просто не смогут захватить. что и нужно. А утром по рукам уже дадут тому, но то уже не мой вопрос.
22 simol
 
18.10.12
15:20
(19)Да, к этому уже и склоняюсь, но хотел без регистра.
23 simol
 
18.10.12
15:21
(20)Можно сделать обработчик, если 5 минут форма не модифицирваолась и не модифицирована, то закрывать
24 simol
 
18.10.12
15:28
Еще придумал такой вариант.
Во второй базе В форма обработчик ожидания каждые 15 сек проверяет не модифицирована ли форма. Если произошел переход с немодифицированный на модифицированную, то проверить не захвачен ли он первой базой. Если захвачен, то предупредить пользователя, что его изменения (сделанные в течении 15 минут) не сохранятся.

Думаю на этом и остановлюсь.
25 simol
 
18.10.12
15:29
....сделанные в течении 15 секунд....
26 AaNnDdRrEeYy
 
18.10.12
15:32
это по COM все будет? если да то медлено все это, каждые 15 секунд по кому бегать не вариант. если это 8.2 то луче внешние источники данных прикрутить, они наверно быстрее работать будут
27 simol
 
18.10.12
15:34
(26) общение между базами по Web сервисам
28 simol
 
18.10.12
15:35
(26)Не проверяю я локально, регистр в обоих базах.
Если из первой захватывают объект второй. то по  Вебсервису во второй меняется регистр захвата.

А в обработчике ожидания я проверяю локальный регистр и то, по сути 1 раз при смене немодифицирваон на модифицирован
29 simol
 
18.10.12
15:36
+(28)Не, проверяю.... [запятую потерял]
30 SUA
 
18.10.12
15:41
(28)а что в 15 не работает?
при создании -
- смотрим что объект не захвачен и не изменен в другой базе
- захватываем в своей
при закрытии формы -
- убираем захват в своей
доступ к другой базе при этом идет только на чтение, в своей - дополнительно запись локального регистра
31 simol
 
18.10.12
15:45
(30)Не могу в УФ сделать захват. При выходе из ПриЧтенииНаСервере он сбрасывается. С этого и начинал
32 simol
 
18.10.12
15:46
+(31)Получается с момента открытия формы до начала изменения объект не захвачен и вторая база о том что открыта форма не знает
33 simol
 
18.10.12
16:10
(30)Так надеялся, что будет ответ на (31) :)
34 SUA
 
18.10.12
16:15
(31)захват=запись в локальный регистр, а не блокировка.
35 SUA
 
18.10.12
16:16
правда пойдут ошибки при некорректном завершении сеанса
36 simol
 
18.10.12
16:21
(35), да, это было обсуждено в (19)-(22), но пойду по пути (24). чтобы не заморачиваться с потерянными сеансами
37 Buster007
 
18.10.12
16:24
ЗаблокироватьДанныеДляРедактирования (LockDataForEdit)
Синтаксис:

ЗаблокироватьДанныеДляРедактирования(<Ключ>, <ВерсияДанных>, <ИдентификаторФормы>)
Параметры:

<Ключ> (обязательный)

Тип: Любая ссылка на объект информационной базы; РегистрСведенийКлючЗаписи.<Имя регистра сведений>.
Ссылка на объект, который должен быть заблокирован, или ключ записи независимого регистра сведений, которая должна быть заблокирована.
<ВерсияДанных> (необязательный)

Тип: Строка.
Версия блокируемого объекта в формате Base64. Используется, если параметр <Ключ> имеет тип Любая ссылка на объект информационной базы.
Если указан, то при блокировке объекта проверяется версия объекта базы данных. При несовпадении версии или отсутствии объекта в базе данных генерируется исключение.
Значение по умолчанию: Неопределено.
<ИдентификаторФормы> (необязательный)

Тип: УникальныйИдентификатор.
Уникальный идентификатор формы. Если параметр указан, то блокировка устанавливается на все время жизни формы и может быть снята:
методом РазблокироватьДанныеДляРедактирования с тем же идентификатором формы;
при закрытии формы;
при завершении сеанса.
Если параметр не указан, то блокировка устанавливается на ограниченное время и может быть снята:
с помощью метода РазблокироватьДанныеДляРедактирования без указания идентификатора формы;
при окончании транзакции, если блокировка установлена в транзакции;
при окончании работы встроенного языка (для режимов запуска "Тонкий клиент" и "Веб-клиент"; при возврате управления с сервера);
при завершении сеанса.

Значение по умолчанию: Неопределено.
Описание:

Заблокировать данные для редактирования в управляемой форме.
Вызывает исключение, если объект уже заблокирован, в том числе и методом Заблокировать.

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

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

Оно?
38 simol
 
18.10.12
16:35
(37) Куда тебя расцеловать?
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший