Имя: Пароль:
1C
1C 7.7
v7: Запретить одновременное открытие документов
0 vmprog
 
08.05.09
12:47
Люди. Как запретить двум и более юзерам одновременно открывать один и тот же документ? Это в настройках есть или надо копать в сторону процедуры ПриОткрытии()?

Конфа БП релиз последний.
1 Нуф-Нуф
 
08.05.09
12:48
какая разница все равно сохранить не даст
2 Salvador Limones
 
08.05.09
12:48
А зачем?
3 Ненавижу 1С
 
гуру
08.05.09
12:48
(0) опять?
4 mikecool
 
08.05.09
12:48
(3) +1 тоже подумал...
5 IronDemon
 
08.05.09
12:48
(3) Уже было?
6 vde69
 
08.05.09
12:49
(5) постов на 300 бреа полного, искать не буду :)
7 vmprog
 
08.05.09
12:52
поиск ничего путного не дал.

Про сохранить не даст знаю. Требование руководства.

А если без демогогии. Просто скажите в настройках гденить есть или писать надо?
8 hhhh
 
08.05.09
12:53
(7) писать надо
9 IronDemon
 
08.05.09
12:53
Надо писАть. Показать как?
10 Ненавижу 1С
 
гуру
08.05.09
12:53
писать
11 cost10
 
08.05.09
12:55
перед открытием пытаться заблокировать()
12 hhhh
 
08.05.09
12:57
(11) заблокировать() не катит. Действует только внутри этого сеанса. Чтобы один пользователь 2 раза не открыл.
13 vde69
 
08.05.09
12:57
самое смешное, что это не только не нужно, но и ВРЕДНО, шли в сад свое руководство...
14 vmprog
 
08.05.09
12:58
(7) показать с учетом (11)
15 vmprog
 
08.05.09
12:59
(9) показать с учетом (11)
16 IronDemon
 
08.05.09
13:02
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
   
   Если Не ЭтоНовый() Тогда
       Попытка
           ДокументОбъект.Заблокировать();
       Исключение
           Предупреждение("Документ открыт другим пользователем.");
           ЭтаФорма.ТолькоПросмотр=Истина;
       КонецПопытки;
       
   КонецЕсли;
   
КонецПроцедуры

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
   
   Если ДокументОбъект.Заблокирован() Тогда
       ДокументОбъект.Разблокировать();
   КонецЕсли;
   
КонецПроцедуры
17 vde69
 
08.05.09
13:04
Функция ПолучитьМассивАктивныхИгроков() Экспорт
   // формируем список возможного выбора
   Запрос = Новый Запрос("ВЫБРАТЬ
                         |    Игроки.Ссылка
                         |ИЗ
                         |    Справочник.Игроки КАК Игроки
                         |ГДЕ
                         |    Игроки.Ссылка <> &ТекущийИгрок");
                         
   Запрос.УстановитьПараметр("ТекущийИгрок", ТекущийИгрокОбьект.Ссылка);
   Массив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
   
   е = Массив.Количество();
   Пока е > 0 Цикл
       Объект = Массив[е-1].ПолучитьОбъект();
       попытка
           Объект.Заблокировать();
           Массив.Удалить(е-1);
       Исключение
       КонецПопытки;
       Объект = "";
       е = е - 1;
   КонецЦикла;
   
   Возврат Массив;
КонецФункции
18 Stepa86
 
08.05.09
13:05
(17) шустро работает?
19 vmprog
 
08.05.09
13:06
Спасибо.
20 hhhh
 
08.05.09
13:09
и всё-таки

ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
Заблокировать (Lock)
Синтаксис:
Заблокировать()
Описание:
Выполняет блокировку объекта от изменения другими режимами или пользователями.

блокировка от изменения а не от повторного открытия.
21 Serg_1960
 
08.05.09
13:40
А если сделать блокировку при открытии формы? А если заблокировать не получается - закрывать форму с предупреждением? Повторная блокировка "против" повторного открытия :)

PS: имхо, не айс это все :(
22 vde69
 
08.05.09
13:42
(18) на больших сетях не тестил, вот от куда http://www.infostart.ru/projects/3363/ (типа сетевые шахматы),

при 10 пользователях вообще не заметно задержек, скорость лучше чем в аське
23 Stepa86
 
08.05.09
13:50
(22) у меня для одного документа блокировка 0.5 сек проверяется... думаю оптом 5000-10000 доков на заблокированность не шустро проверятся
24 Serg_1960
 
08.05.09
13:55
Степа, сорри, ну а это-то здесь причем? :) Надо всего-то проверить блокировкой 1(один) открываемый пользователем документ.
25 vde69
 
08.05.09
14:01
(24) может он так хочет выводить в журнал галку "ДокументОткрыт" ?

тогда это надо по другому делать, через регистр сведений и регламентую обработку
26 Serg_1960
 
08.05.09
14:12
В каждой форме (у меня УПП) есть вызов проверки даты запрета редактирования для полных прав. В той процедуре запросто реализовывается то, что нужно...
Можно и через регистр накоплений (открытие документа - приход, закрытие - расход)...
27 Serg_1960
 
08.05.09
14:18
На ходу придумываю :) На регистре сведений каждое открытие документа - новая записб. Каждое закрытие - удаление записи. На регистрах накопления записи не удаляются, а накапливаются. Тогда можно отчетом выводить кто, когда, что открывал и на сколько.
28 vde69
 
08.05.09
14:20
(27) если клиент отвалится, событие "закрытиеДокумента" не отработает, и он повиснет, по этому и нужна регламентная обработка
29 Stepa86
 
08.05.09
14:20
(24) блокировка ставится и проверяется для одного дока за раз (в КСПУ), но если вдруг встанет задача узнать - какие доки заблокированы (для (25) например или тупо не показывать в списке доков заблокированные другими пользователями), то (17) для меня не выход... через РС думаю в итоге доделать, потому что не надо хранить историю кто и когда открыл/закрыл
30 Serg_1960
 
08.05.09
14:24
Единственная проблема - кода юзвер отваливается, не успевая сообщить об закрытии документов. В принципе можно при входе юзвера "чистить" регистр, - но лучше регламент использовать.
31 Serg_1960
 
08.05.09
14:26
О_О Блин, экран не обновился. Сорри за (30) - не видел предыдущие топики :)
32 Stepa86
 
08.05.09
14:26
(30) у меня при начале работы РС по текущему пользователю чиститься, потому что если пользователь вылетел аварийно, очень велика вероятность, что он снова зайдет...
33 Serg_1960
 
08.05.09
14:28
(32) Не айс. У меня юзверы компы выключают при свернутом окне 1С или из рерминалов забывают выходить... Регламент, - только регламент!
34 Serg_1960
 
08.05.09
14:29
сорри, рерминалов = терминалов
35 Stepa86
 
08.05.09
14:32
(33) ну значит сделаю регламент, пока РС и не нужен, достаточно "Заблокировать()" но потом планируется разрешить открывать док, но будет надпись "Задача захвачена Васей Пупкиным. Вы не сможете записать эту задачу"
36 vde69
 
08.05.09
14:34
вообще можно RLS поставить на левое соединение с этим регистром, тогда в самих обьектах не надо будет ни строчки кода писать

зы
красивое решение будет
37 Stepa86
 
08.05.09
14:36
(36) а регистр кто заполнять будет? тем более хочется покрасивше блокировку сделать =)
38 Serg_1960
 
08.05.09
14:38
На всякий случай учтите то, что этот Пупкин может открыть несколько сеансов. У меня такие приколыбыли, когда особо нервные возмущались "Я открываю документ, а она мне говорит, что он уже мною открыт" :))
39 Stepa86
 
08.05.09
14:40
(38) а какая разница - другой пользователь пытается открыть документ или этот же, но в другом сеансе?
40 Serg_1960
 
08.05.09
14:43
В принципе - никакой разницы... Актуально когда если через регистры делать - нужно будет предусмотреть такие ситуации.
41 vde69
 
08.05.09
14:44
(37) подписку на событие, в нем добавляеться запись, а удаляеться регламентной обработкой или событием "закрытие"
42 Serg_1960
 
08.05.09
14:45
(41) С открытием все ясно, - надо подумать как "пристроить" закрытие :(
43 Stepa86
 
08.05.09
14:48
(41) подписка не взлетит - она к объектам привязывается, а хочется в Передоткрытием формы
(40) значит перед чисткой проверить, а нет ли второго такого сеанса с этим Пупкиным, и если есть - не чистить

что то мне кажется, что реализовать проверку на заблокированность не применяя Заблокировать() в силу ньюансов опиванных выше - нетривиально, если вообще возможно
44 Stepa86
 
08.05.09
14:49
+(43) хотя...
45 Serg_1960
 
08.05.09
14:58
Что "хотя..."?
Я склоняюсь к мысли, что бедному крестьянину некуда деться, токма парсить модули форм документов :((
46 Stepa86
 
08.05.09
15:00
(45) ну ведь не на все же документы навешивать, да и парсер пишется полчаса максимум, и это мной, а не86 вообще за 10 минут осилит =)
47 Serg_1960
 
08.05.09
15:09
Ыыы... парсер не проблема... проблемы с обновлением :(
48 Serg_1960
 
08.05.09
15:11
(47) Стоп, отставить, - ляпнул не подумавши. Парсером-же и убрать перед обновлением все можно.
49 Serg_1960
 
08.05.09
15:14
Как говорится, теперь только осталось все это в алгоритмы сложить :) В принципе проблема решена - можно и по домам :)) С наступающими Вас.
Закон Брукера: Даже маленькая практика стоит большой теории.