Имя: Пароль:
1C
1С v8
8.1 Как программно отловить что документ открыт?
0 lanc2233
 
27.08.11
00:34
В форме документа при открытии есть:

ЭтотОбъект.Заблокировать();

В журнале есть возможность пользователю менять реквизит не перепроводя документ:

Док = ЭтаФорма.ЭлементыФормы.ЖурналДокументовСписок.ТекущаяСтрока.ПолучитьОбъект();
Док.ИмяРеквизита= Истина;

Попытка
   Док.Записать();
Исключение
   Предупреждение("Невозможно изменить документ.");
КонецПопытки;

На данный момент оно дает записать в независимости от того открыт документ или нет. Как сделать так чтобы открытый документ нельзя было изменить программно.
1 zak555
 
27.08.11
00:37
открытый док - заблокирован ?
2 lanc2233
 
27.08.11
00:41
а как узнать заблокирован он или нет?

>> В форме документа при открытии есть:
>> ЭтотОбъект.Заблокировать();
3 Лефмихалыч
 
27.08.11
00:50
Документы.ТвойДокумент.получитьФорму().Открыта()

правда, такую методу наипать легко, но в целом, вопрос (0) довольно глупый
4 Bober
 
27.08.11
01:38
Если в форме документа запускается это ЭтотОбъект.Заблокировать();, то пока форма открыта никто другой этот объект не запишет.
5 lanc2233
 
27.08.11
01:40
(4) программно записывает.
6 IamAlexy
 
27.08.11
01:46
в процедуре приоткрытии() пишем так:


Попытка
    ЭтотОбъект.Заблокировать();
Исключение
    Отказ = Истина; //отказываемся от открытия формы
    Сообщить("Документ уже открыт другим пользователем!", СтатусСообщения.Внимание);
КонецПопытки;
7 lanc2233
 
27.08.11
01:50
(6) вопрос не в этом.

Не дать записать нужно в другом коде, который выполняется при нажатии кнопки в журнале. более подробно в (0)
8 IamAlexy
 
27.08.11
01:56
ну сделай втупую регистр сведений "открытыедокументы" :) и в подписке проверяй на наличие записей
9 Лефмихалыч
 
27.08.11
01:57
(7) не делай так - козленочком станешь. такие хреновины надо вне документа хранить в регистрах
13 IamAlexy
 
27.08.11
02:13
ыыыыыыыыыыыыыыы


все очень просто

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

вот этот же код:

Попытка
    ИзменяемыйОбъект.Заблокировать();
Исключение
   Сообщить("АВОТКУЙТЕБЕ", СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
14 lanc2233
 
27.08.11
02:15
Спасибо.
15 Bober
 
27.08.11
02:16
(7) система не дает записать никому документ, если у клиента открыта форма документа и эта форма заблокировала документ или это сделано программно. Если у тебя это не работает ищи причину
16 IamAlexy
 
27.08.11
02:17
(15) ыыыыыыыыыыыыы спасибо копетан очивидность.. целых 14 постов никто незнал чтоже делать и даже не думал искать причину....
17 lanc2233
 
27.08.11
02:17
Кстати а сколько блокировка действовать будет?
Его после записи разблокировать можно?
18 Bober
 
27.08.11
02:19
- пока открыта форма,
- до после записи,
- пока не скажешь разблокировать
19 IamAlexy
 
27.08.11
02:20
я так понял до закрытия формы или до окончания процедуры..

токачто проверил на списке документов.
добавил блокировку в форму
добавил блокировку в процедуру изменяющую статус.

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

по поводу разблокировать - я так понял это не работает для подобных блокировок.. хотя можно покурить разблокировать()
20 lanc2233
 
27.08.11
02:25
Все работает )
21 d_koz
 
27.08.11
09:49
(2) ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
Заблокирован (IsLocked)
Синтаксис:

Заблокирован()
Возвращаемое значение:

Тип: Булево. Истина - документ заблокирован; Ложь - в противном случае.
Описание:

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

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

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

Следует учитывать, что этот метод используется для проверки блокировки объекта базы данных конкретным объектом встроенного языка. Он не может быть использован, чтобы проверить, заблокирован ли вообще объект базы данных.
Пример:

Если РасходнаяНакладная.Заблокирован() Тогда
   РасходнаяНакладная.Разблокировать();
КонецЕсли;