2 пользователя открывают окно одного и того же элемента раздела для редактирования. Как заблокировать окно для того пользователя, который открыл позже?

Да, есть механизм блокировки полей страницы записи, вопрос когда ставить блокировку а когда снимать. Допустим, при открытии окна мы "запомнили" объект что он уже редактируется (и для всех следующих проверяем при открытии окна нет ли блокировки по данному объекту), но как отслеживать конец редактирования если пользователь не нажал кнопку "Сохранить" или кнопку "Отменить"? То есть, пользователь закрыл вкладку броузера\закрыл броузер\выключил компьютер а блокировка осталась?

Нравится

4 комментария

Никто с таким не сталкивался?

 В 1С есть аналог - пессимистическая блокировка

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

Добрый день, Александр.



Вы можете проверять открыта ли страница у пользователя через сообщения веб-сокета. С сервера можно отправлять какое-нибудь сообщение, на клиенте в методе-обработчике отправлять ответ. Соответственно если пользователь закрыл страницу, то сервер ответа не получит и сможет отправить уже другому пользователю(тоже по веб-сокету), что страницу можно разблокировать. 

Информацию по веб-сокета и обработке сообщений можно найти на отрытых ресурсах, а также в академии.

А насколько такой метод проверки будет уязвим к закрытию окна\броузера\отключения компъютера?

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

Но валидация очень интересно отрабатывает, при изменении значения запускается 4 раза и каждый раз не видит 2 значения одновременно.

Кто-нибудь такое делал?

Олександр Басалик,

При использовании подхода с проверкой по 

веб-сокету можно основываться на ответ от сервер, если ответ получен - страницу блокировать, а если браузер закрыт он не отправить ответ. 

Нам известен немного иной подход реализации описанной задачи.

Приблизительная логика реализации:

Необходимо создать дополнительную таблицу, в которую в момент открытия карточки будут вносится данные:

- id записи, что редактируется;

- время открытия;

- пользователь, который редактирует запись.

После завершения редактирования записи или по таймеру данные должны с таблицы удалятся. При открытии карточки необходимо добавить метод проверки наличия записи в дополнительной таблице.



Но хочу обратить внимание, что данная логика решения бизнес-задачи имеет много минусов так как не учитывает следующие события:

вкладка со страницей редактирования была закрыта или открыта в фоновом режиме, браузер был закрыт.

Показать все комментарии

Подскажите, есть ли возможность заблокировать деталь со страницей редактирования?

По документации есть механизм бокировки "IsModelItemsEnabled", он блокирует поля, убирает кнопки "+" на детали и кнопки "Копировать", "Изменить", "Удалить", но если два раза клацнуть на запись детали то она открывается в странице редактирования и дальше делай что хочешь. Понимаю что можно заблокировать ее прочитав связанную продажу и там уже на основании какого-то признака блокировать, но может есть уже встроенный механизм и велосепед не нужно изобретать

Нравится

7 комментариев
Лучший ответ

Зверев Александр пишет:

Тогда механизм прав Вам не поможет, он регулирует доступность вне зависимости от раздела, где на детали видна запись.

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

Мы оставляли возможность открытия по двойному щелчку (а также с помощью "Изменить"), чтобы была возможность увидеть запись на странице детали.

А возможность сохранения регулировали правами на объект или запись

Владимир Соколов,

 тогда как решить такую задачу механизмом прав - есть продажа, у на последнем этапе у нее блокируются все поля и детали? При этом детали есть общие для раздела "Договоры" (сделаны как в заказе с продуктами) и деталь "Контакты", есть детали что в контрагенте. При этом наследовать права от продажи нельзя так как доступы в контрагентах другие и если запретить редактирование в детали то через контрагента добавить не сможем.

Можно раздавать права через бизнес-процесс для каждой записи в детали, но если мы меняем этам нам нужно снова запускать процесс по всему списку. К тому же на странице редактирования записи детали нет управления доступом и потому изменить доступ можно снова через бизнес-процесс. Так образом мы увеличиваем нагрузку увеличившимся количеством процессов и можем поучить еще и опасность зависание процесса.

Думаю удобнее сделать наследование блокировки как это реализовано для детали с редактируемым реестром но в открывающейся странице (удобно потому что полей много бывает и просто для просмотра надо бы открывать как сейчас реализовано)

Владимир Соколов,

 

И тогда вопрос - доступы раздела можно посмотреть в таблице "Sys + название схемы + Right", а вот где смотреть доступы для деталей? К примеру нужно скопировать все доступы из раздела в деталь, как это можно сделать?

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

Тогда механизм прав Вам не поможет, он регулирует доступность вне зависимости от раздела, где на детали видна запись.

 И тогда вопрос - доступы раздела можно посмотреть в таблице "Sys + название схемы + Right", а вот где смотреть доступы для деталей?

Так же само. 

К примеру нужно скопировать все доступы из раздела в деталь, как это можно сделать?

Если разово, то проще всего написать SQL-запрос. Если постоянно, то выдавать можно БП. Но если хотите завязаться на событие именно выдачи прав в самом объекте, то такого события вроде бы нет, разве что SQL-триггером. 

Зверев Александр пишет:

Тогда механизм прав Вам не поможет, он регулирует доступность вне зависимости от раздела, где на детали видна запись.

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

Спасибо за предложенные варианты. Решил сделать привязку к одному разделу и через бизнеспроцес отбирать права на изменение записи в детали. Благо такая деталь сейчас в доработке только одна. А вообще вопрос думаю интересный и нужно будет подумать. Всем Спасибо

Владимир Соколов пишет:   сделал похоже, но не много по другом. Использовал механизм блокировки всех полей на странице редактирования по условию - запрос в базу данных про этап текущий продажи (а в самих этапах добавил булевую строку с отметкой нужно ли блокировать поля на этапе)

Показать все комментарии

Если ваша система работает с СУБД Oracle, то вам необходимо знать, что если ввести несколько раз подряд неверный пароль, то учетная запись пользователя может быть заблокирована на уровне СУБД. "Может быть" я написал потому, что это зависит от настроек Oracle. В случае, если пользователи, все таки, блокируются, для их разблокировки проще всего выполнить в sqlplus следующую команду

ALTER USER username ACCOUNT UNLOCK

Если с такой ситуацией приходится сталкиваться часто, то можно пойти дальше - добавить в разделе Администрирование действие "Разблокировать пользователя" и реализовать следующий обработчик события:
function amiUnlockUserOnExecute(ActionMenuItem, Sender) {
  var UserName = GetDatasetFieldValue (dlData.Dataset, 'SQLObjectName');
  if (UserName) {
    Connector.DBEngine.ExecuteCustomSQL('ALTER USER "' + UserName + '" ACCOUNT UNLOCK', System.EmptyValue);
    ShowInformationDialog('Пользователь "' + UserName + '" успешно разблокирован!');
  }
}

Нравится

Поделиться

2 комментария

Впринципе, если это часто происходит блокировка пользователей в следствии некорректного воода пароля, то в настройках Oracle параметру FAILED_LOGIN_ATTEMPTS нужно указать UNLIMITED и пользователь блокироваться не будет.

я вообще ничего не понимаю в этом оракле =)
что он хочет?

ALTER USER username ACCOUNT UNLOCK
   2  /
SP2-0640: Not connected
Показать все комментарии