Имя: Пароль:
1C
1С v8
Запретить работать двум пользователям с одной и той же ролью.
0 Emilio
 
19.01.13
13:39
Ребята, прошу вашей помощи. Подскажите как можно запретить работать с базой двум пользователям с одной ролью.
Попробовал наваять что-то подобного типа:
Процедура ПользовательИРоль()
   Если РольДостпна("Роль") Тогда
       СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();
       Если Соедиение.НомерСоединения <> 0 Тогда
           Сообщить ("В системе уже зарегистрирован пользователь"+Соединение.Пользователь.Имя+" с такой ролью. Работа с базой одновременно двух пользователей с такой ролью запрещена");
           ЗавершитьРаботуСистемы();
       Иначе Отсказ(Ложь)
       КонецЕсли
   Иначе Возврат;
   КонецЕсли;
КонецПроцедуры

Я знаю, что так не правильно, но с синтаксисом еще доконца не смог разобраться 1С только изучаю.
Прошу не тролить ибо вашей помощи прошу потому как в гугле ответа не смог найти.
1 MrStomak
 
19.01.13
13:47
Нет проверки в существующих соединениях на роль пользователя.
2 DrShad
 
19.01.13
13:49
странная задача
3 Нуф-Нуф
 
19.01.13
13:53
получай список соединений и пользователей, определяй у них доступность роли, и от этого действуй.

а так (2)+1
4 Emilio
 
19.01.13
13:58
(3) вот я получаю список пользователей:
Процедура ПолучениеСпискаАктивныхПользователей()    
   СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();    
   Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл              
                                       
       мПользователь=Соединение.Пользователь.Имя;                              
       мПриложение=ПредставлениеПриложения(Соединение.ИмяПриложения);          
       //мНачалоРаботы=Соединение.НачалоСеанса;                                  
       мКомпьютер=Соединение.ИмяКомпьютера;                                    
       мСоединение=Соединение.НомерСоединения;                                
   КонецЦикла;
   
   нНомерТекущегоСоединения=НомерСоединенияИнформационнойБазы();
   
КонецПроцедуры

так?
Как отсюда получить доступность роли?
5 DrShad
 
19.01.13
13:59
проще сделать им один аккаунт и запретить повторный вход
6 Нуф-Нуф
 
19.01.13
14:00
(4) получи пользователя по имени пользователя
7 Нуф-Нуф
 
19.01.13
14:01
МенеджерПользователейИнформационнойБазы.НайтиПоИмени (InfoBaseUsersManager.FindByName)
МенеджерПользователейИнформационнойБазы (InfoBaseUsersManager)
НайтиПоИмени (FindByName)
Синтаксис:

НайтиПоИмени(<ИмяПользователя>)
Параметры:

<ИмяПользователя> (обязательный)

Тип: Строка.
Имя пользователя.
Возвращаемое значение:

Тип: ПользовательИнформационнойБазы, Неопределено.
Если значение не найдено, то для пользователя с административными правами возвращается значение Неопределено, для других пользователей вызывается исключение.
Описание:

Осуществляет поиск информации о пользователе с указанным именем.

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

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

В случае, если пользователь имеет административные права, то допускается поиск любого пользователя. Если пользователь не имеет административных прав, то допускается поиск только того пользователя, под которым данный пользователь авторизовался.
Если указано пустое имя пользователя, то возвращается объект, который можно использовать в тех случаях, когда пользователь не задан (например, в фильтре журнала регистрации).
Если в конфигурации задано разделение пользователей по аутентификации и для пользователя с административными правами, выполняющего метод, не заданы все разделители, то при выполнении метода генерируется исключение.
8 Emilio
 
19.01.13
14:01
(6) Не совсем понял как это. можешь поподробнее?
9 Нуф-Нуф
 
19.01.13
14:01
ПользовательИнформационнойБазы.Роли (InfoBaseUser.Roles)
ПользовательИнформационнойБазы (InfoBaseUser)
Роли (Roles)
Использование:

Только чтение.
Описание:

Тип: РолиПользователя.
Содержит коллекцию ролей пользователя информационной базы.

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

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

Доступно только пользователю с административными правами.
10 Нуф-Нуф
 
19.01.13
14:02
РолиПользователя.Содержит (UserRoles.Contains)
РолиПользователя (UserRoles)
Содержит (Contains)
Синтаксис:

Содержит(<Роль>)
Параметры:

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

Тип: ОбъектМетаданных: Роль.
Искомая роль.
Возвращаемое значение:

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

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

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

Сервер, толстый клиент, внешнее соединение.
11 Нуф-Нуф
 
19.01.13
14:02
Поверь в силу синтаксис-помощника
12 Emilio
 
19.01.13
14:23
(11) Извини за наглость, но я что-то не догнал как это сделать.
Я думаю пройти последующему алгоритму:
Проверить доступность роли у пользователя, если ему эта роль достпна и он первый кто входит в систему, тогда доступ разрешить иначе если эта роль доступна и другой пользователь уже в базе активен с такой ролью, тогда вывести сообщение и завершить работу системы иначе если у пользователя другая роль (к примеру просмотр) тогда доступ разрешить.
Я представляю как это сделать, но синтакс 1с я пока только изучаю и не могу собрать в кучу всренные процедуры и функции потому и прошу помощи у вас, у гуру.
По твоему методу через:
>>получи пользователя по имени пользователя
я не пойму как сделать, зачем мне искать пользователя по имени.
Если тебе не сложно, подскажи, пожалуйста и не гневайся на меня за мои тупняки.
13 Jstunner
 
19.01.13
14:30
База типовая?
14 Emilio
 
19.01.13
14:32
(13) переделанная до неузнаваемости Розница
15 Нуф-Нуф
 
19.01.13
14:34
Процедура ПолучениеСпискаАктивныхПользователей()    
   СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();    
   Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл              
                                       
       мПользователь=Соединение.Пользователь.Имя;        
                     
       мПриложение=ПредставлениеПриложения(Соединение.ИмяПриложения);          

   Пользователь = ПользователиИнформационнойБазы .НайтиПоИмени(мПользователь);
   Если НЕ Пользователь = Неопределено И Пользователь.Роли.Содержит(Метаданные.Роли.ТвояРоль) Тогда
       
       Предупреждение("Сушите весла");
       
   КонецЕсли;

       //мНачалоРаботы=Соединение.НачалоСеанса;                                  

       мКомпьютер=Соединение.ИмяКомпьютера;                                    
       мСоединение=Соединение.НомерСоединения;                                
   КонецЦикла;
   
   нНомерТекущегоСоединения=НомерСоединенияИнформационнойБазы();
   
КонецПроцедуры
16 Emilio
 
19.01.13
14:40
(15) Премного благодарен тебе мил человек :) Прошу прощения если отнял у кого-то время на чтение моих тупняков, прошу понять, что я только постигаю секреты 1С и благодарен вам, что вы помогаете таким ламерам как я.
17 Нуф-Нуф
 
19.01.13
14:42
(16) хочешь стать адинеснегом и иметь свои отстатыщь, тогда тебе сюда.
http://www.spec8.ru/1c-prog-fast-start
http://www.spec8.ru/devbase
http://www.spec8.ru/devadv
18 Emilio
 
19.01.13
14:49
(17) спасибо за ссылки. Давно собираюсь сходить на курсы и пройти обучение, но пока никак не удается накопить нужной суммы на обучение ибо после кредитов и дочери сумма остается маленькая. нашел на сайте этом бесплатные видеокурсы сегодня буду смотреть. Спасибо! :)
19 Emilio
 
21.01.13
00:46
Если вдруг кто-то наткнется на эту ветку и кому-то будет требоваться решить такую же задачу как мне, тогда вот решение:

Процедура ПолучениеСпискаАктивныхПользователей()Экспорт
   //Получаем все соединения
   СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы();    
   //Цикл проверки строки в массиве
   Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл                      
       мПользователь=Соединение.Пользователь.Имя;        
       НомСоединения = Соединение.НомерСоединения;
       мПриложение=ПредставлениеПриложения(Соединение.ИмяПриложения);
       //Получаем текущего пользователя
       ТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();    
       //Получаем уже активного пользователя
       Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(мПользователь);
       мКомпьютер=Соединение.ИмяКомпьютера;                                    
       мСоединение=Соединение.НомерСоединения;
       нНомерТекущегоСоединения=НомерСоединенияИнформационнойБазы();
       //Проверяем содержит ли уже активный пользователь нашу роль
       Если Пользователь.Роли.Содержит(Метаданные.Роли.ВашаРоль) Тогда
           //Проверяем наличие нужной роли у текущего пользователя
           Если ТекПользователь.Роли.Содержит(Метаданные.Роли.ВашаРоль) Тогда
               //Проверяем одинаковы ли уже активный пользователь и текущий и равны ди у них номера соединения
               Если ТекПользователь <> Пользователь И нНомерТекущегоСоединения > НомСоединения Тогда
               Предупреждение("В системе уже зарегистрирован пользователь...");
                   ЗавершитьРаботуСистемы(Истина,,);
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;                                  
КонецПроцедуры


Всем спасибо, кто помогал! =)
З.Ы. если в код похож на быдлокод, то уж прошу прощения...
20 milan
 
21.01.13
00:59
не проще при входе какую нить константу лочить, или типа того?
2 + 2 = 3.9999999999999999999999999999999...