Имя: Пароль:
1C
1С v8
Как определить, что документ уже кем то открыт.
0 ogion83
 
02.06.16
13:40
Хочу сделать вывод сообщения, что документ (форма) уже открыт другим пользователем. Как вот это определить?
1 Nuobu
 
02.06.16
13:41
ДокументОбъект.Заблокирован();
2 Рэйв
 
02.06.16
13:41
попробуй его записать в полпытке
3 ogion83
 
02.06.16
13:48
(1) Что то не сработало.
4 catena
 
02.06.16
13:49
(1)(2)Разве это сработает на открытие формы? До изменения реквизитов?
5 Nuobu
 
02.06.16
13:49
(3) Если НЕ ДокументОбъект.Заблокирован() Тогда

Ты "НЕ" используешь?
6 AllJoke
 
02.06.16
13:50
Примечание:

Следует учитывать, что этот метод используется для проверки блокировки объекта базы данных конкретным объектом встроенного языка. Он не может быть использован, чтобы проверить, заблокирован ли вообще объект базы данных.
7 Fish
 
02.06.16
13:51
(0) А чем платформенное предупреждение не устраивает?
8 aka AMIGO
 
02.06.16
13:52
Извините, а команды что-то типа "ОткрытьДокумент" в 8-ке нет?

(7) может, ему надо в обработке/отчете..
9 ogion83
 
02.06.16
13:53
(7) Предупреждение появляется когда человек хочет сохранить изменения, а ему не дает, так как документ уже открыт другим. Вот и хочу чтоб было видно заранее, что документ открыт
10 Фрэнки
 
02.06.16
13:53
не знаю, не думал, что нужно делать в УФ, но в толстых я делал так

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    // - - - Заблокируем от работающих остальных
    Попытка
        ЭтотОбъект.Заблокировать();
    Исключение
        Сообщить("Форма документа уже открыта другим пользователем!");
        Отказ = Истина;
        Возврат;
    КонецПопытки;
11 aka AMIGO
 
02.06.16
13:54
(10) А, вишь, ТС надо интерактивно.
12 mistеr
 
02.06.16
13:55
(0) При открытии блокируй что-нибудь. Но будь готов отбиваться от пользователей. Я бы точно по башке настучал.
13 Фрэнки
 
02.06.16
13:55
и в дополнение к (10)

Процедура ПриЗакрытии()
    Если ЭтотОбъект.Заблокирован() Тогда
        ЭтотОбъект.Разблокировать();
    КонецЕсли;
КонецПроцедуры
14 Evgueni
 
02.06.16
13:55
Попытка
Заблокировать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;    

Показывает, кто именно заблокировал документ
15 Фрэнки
 
02.06.16
13:56
(11) не пойму я что надо ТС
16 aka AMIGO
 
02.06.16
13:58
(15) глянь в (9) - чтобы "не давало" открыть документ, если кем-то уже открыт
"При записи" - ему поздно, время юзером напрасно потеряно :)
17 Фрэнки
 
02.06.16
14:00
(16) я даю сразу блокировку в процедуре ПередОткрытием и снимаю блокировку в процедуре ПриЗакрытии
18 aka AMIGO
 
02.06.16
14:01
(17) Отлично. Вот, и пусть ТС экспериментирует :)
19 ogion83
 
02.06.16
14:02
(10) и (14) Благодарствую сделал.

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    Попытка
        ДокументОбъект.Заблокировать();
    Исключение
        Предупреждение("Документ открыт другим пользователем. Изменения не будут сохранены!" + ОписаниеОшибки());
        Отказ = Ложь;
    КонецПопытки;
КонецПроцедуры
Ещё описание ошибки подсокращю)
20 aka AMIGO
 
02.06.16
14:03
(19) И ешё "..чу" "..щу" пиши через "У" :)
21 Evgueni
 
02.06.16
14:05
(20) У меня кладовщики в приходном ордере пишут пишут Цынк 20 кг :)
22 Фрэнки
 
02.06.16
14:06
(19) не забудь снять установленную блокировку
23 mistеr
 
02.06.16
14:06
(21) Скажи спасибо, что не "цынг".
24 aka AMIGO
 
02.06.16
14:13
(21) Кладовщики-то еще ладно.. у нас люди с ВО пишут с ошибками, аж неудобно за них становится :)
Типа "Хороший ведь человек, а такую галиматью накатал!.." :)
25 ogion83
 
02.06.16
14:15
(20) Очепятка)
26 aka AMIGO
 
02.06.16
14:18
(25) шУтю я :)

+24 Копипаст из нашего рабочего Справочника "Товары":
"Кабель-каналы пефарированные мелаллические"
"Кабель-каналы гипкие"
"Управляющие блоки для вент. установок с электрокаллорифером" :)
27 oslokot
 
02.06.16
14:18
(19) надо бы еще туда имя пользователя-открывателя впесать
28 ogion83
 
02.06.16
14:21
(27) В описании ошибки он будет.
Всё лишнее обрезал:
Попытка
        ДокументОбъект.Заблокировать();
    Исключение
        Ошибка = "";
        Ошибка = ОписаниеОшибки();
        Ошибка = Прав(Ошибка,СтрДлина(Ошибка) - Найти(Ошибка,"пользователь:") - 12);
        Ошибка = Лев(Ошибка,СтрДлина(Ошибка) - 28);
        Предупреждение("Изменения не будут сохранены! Документ открыт пользователем:" + Ошибка);
        Отказ = Ложь;
    КонецПопытки;
29 oslokot
 
02.06.16
14:24
(28) а, ну да в описании все есть.
Форму то хоть на просмотр оставь :)
30 aka AMIGO
 
02.06.16
14:26
Хм.. интересно: Найти(Ошибка,"пользователь:") - не текущий пользователь будет отображен?
31 ogion83
 
02.06.16
14:31
(29) Отказ = Ложь как раз и позволит форме все же открыться.
(30) Не, всё в норме, я проверил
32 Ёпрст
 
02.06.16
14:43
(28)
Лучше так:

Процедура ПриОткрытии()

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


ЗЫ: так форма будет открыта на просмотр, это горраааздо лучше, чем её не открытие
33 Dark_Warrior
 
02.06.16
14:54
(26) "с электрокаллорифером" - это пять. Страшно представить