1C. Разработка конфигурации «Менеджер задач». Часть 2

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

1C. Разработка конфигурации Менеджер задач. Часть 1
1C. Разработка конфигурации «Менеджер задач». Часть 2.  Пользователи.

Требование

Разработать конфигурацию «Менеджер задач»:

[…]

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

[…]

Под данным требованием предполагается, что пользователи на рабочих местах должны видеть состояния только положенных ему задач, ограничение видимости задач в справочниках организовывать не требуется. Для идентификации и аутентификации будем пользоваться связкой Пользователей ИБ и справочника Пользователи.

!!! О пользователях ИБ можно почитать Синтаксис-помощник в разделе Работа со списком пользователей информационной базы.

На текущий момент будем реализовывать необходимый минимум:

  • Хранение пользователей системы и соответствия с пользователями ИБ;
  • При первом запуске создавать пользователя Администратор и назначать ему полные права;
  • Введение новых пользователей и назначать права через Конфигуратор;
  • При входе в систему инициализировать параметр сеанса ТекущийПользователь.

Создание и изменение пользователей через режим 1С:Предприятие будем разбирать позже.

Реализация требования

Пользователи

Создадим справочник Пользователи с иерархией групп и элементов, длину наименования установим 100. Справочник включим в состав подсистемы Менеджер задач. В синоним стандартного реквизита Наименование установим значение «Полное имя«, в нем будет храниться представление пользователя.

Добавим реквизит ИмяВхода, тип Строка(50) для отображения логина пользователя.

При запуске необходимо определять по текущему пользователю ИБ пользователя нашей системы, для этого воспользуемся свойством УникальныйИдентификатор пользователя ИБ. Создадим реквизит УникальныйИдентифиткатор с типом УникальныйИдентифиткатор, там и будем хранить соответствие.

Менеджер задач

Сразу набросаем форму

Менеджер задач

Для разделения пользователей создадим роли:

  • Полные права — Имеет права на все объекты конфигурации;
  • Пользователь — Имеет право запуска клиента, установки параметров сеанса и просмотра НСИ.

Текущий пользователь

Для хранения текущего пользователя сеанса создадим параметр сеанса ТекущийПользователь, как и положено будем его заполнять в событии модуля сеанса УстановкаПараметровСеанса().

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)

    // Определение текущего пользователя
    ТекущийПользовательИБ  = ПользователиИнформационнойБазы.ТекущийПользователь(); 
    ТекущийПользователь    = УправлениеПользователями.ПолучитьПользователяСистемы(ТекущийПользовательИБ);
	
    ПараметрыСеанса.ТекущийПользователь = ТекущийПользователь;

КонецПроцедуры

Как видно из кода, я добавил общий модуль УправлениеПользователями, в котором в функции ПолучитьПользователяСистемы() буду производить определение  пользователя системы по переданному пользователю ИБ.

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

  1. Нет пользователей ИБ, нет пользователей системы. Считаем, что это первый запуск системы, создаем полноправного пользователя Администратор, назначаем его текущим;
  2. Есть пользователь ИБ и пользователь системы, назначаем его текущим;
  3. Есть пользователь ИБ, нет пользователя системы. Запуск после добавления нового пользователя через конфигуратор. Создаем пользователя системы, назначаем его текущим.

Из изложенного выше описываем код общего модуля УправлениеПользователями.

#Область УправлениеПользователями

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

// Создает пользователя системы(Справочник.Пользователи) на основании переданного пользователя ИБ
//
//  Параметры:
//      ПользовательИБ, Тип: ПользовательИнформационнойБазы
//  
//  Возврвщает: Сссылку на созданного пользователя, Тип: СправочникСсылка.Пользователи
//
Функция СоздатьПользователяСистемы(Знач ПользовательИБ) 
    
    ПользовательСистемы = Справочники.Пользователи.СоздатьЭлемент();
    ПользовательСистемы.Наименование                = ПользовательИБ.ПолноеИмя;
    ПользовательСистемы.ИмяВхода                    = ПользовательИБ.Имя;
    ПользовательСистемы.УникальныйИдентификатор     = ПользовательИБ.УникальныйИдентификатор;
    
    Попытка
        ПользовательСистемы.Записать();
    Исключение
        Возврат Неопределено;
    КонецПопытки;   
    
    Возврат ПользовательСистемы.Ссылка;
    
КонецФункции

// Создает Администратора ИБ и Администратора системы
//              на основании переданного пользователя ИБ
//  
//  Возврвщает: Сссылку на созданного пользователя, Тип: СправочникСсылка.Пользователи
//
Функция СоздатьАдминистратора() 
    
    // Создадим пользователя ИБ
    СруктураПользователя    = Новый Структура("Наименование, ИмяВхода", "Администратор", "Администратор");
    АдминистраторИБ         = СоздатьПользователяИБ(СруктураПользователя, Истина);
    
    // Создадим пользователя системы
    Администратор = СоздатьПользователяСистемы(АдминистраторИБ);
    
    Возврат Администратор;
    
КонецФункции

// Возвращает пользователя системы(СправочникСсылка.Пользователи) по переданному пользователю ИБ
//
//  Параметры:
//      ПользовательИБ, Тип: ПользовательИнформационнойБазы
//  
//  Возврвщает: Ссылку пользователя, Тип: СправочникСсылка.Пользователи
//
Функция ПолучитьПользователяСистемы(Знач ПользовательИБ) Экспорт 
    
    УстановитьПривилегированныйРежим(Истина);

    // Проверим наличие пользователей ИБ
    ЕстьПользователи = ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() > 0;
    
    Если ЕстьПользователи Тогда
        
        // Пользователи ИБ есть, получим пользователя системы по UUID 
        
        Запрос = Новый Запрос;
        Запрос.УстановитьПараметр("УникальныйИдентификатор", ПользовательИБ.УникальныйИдентификатор);
        Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |   Пользователи.Ссылка КАК Пользователь
        |ИЗ
        |   Справочник.Пользователи КАК Пользователи
        |ГДЕ
        |   Пользователи.УникальныйИдентификатор = &УникальныйИдентификатор";
        
        РезультатЗапроса = Запрос.Выполнить();
        
        Если РезультатЗапроса.Пустой() Тогда 
            
            // По указаному UUID не нашли пользователя в справочнике, будем создавать
            ПользовательСистемы = СоздатьПользователяСистемы(ПользовательИБ);           
            
            ТекстСообщения = "Пользователь системы не определен. Создан пользователь %1";
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = СтрШаблон(ТекстСообщения,  ПользовательСистемы.ИмяВхода);
            Сообщение.Сообщить();
            
        Иначе 
            
            // Пользователь найден, возвращаем его
            Выборка = РезультатЗапроса.Выбрать();
            Выборка.Следующий();
            
            ПользовательСистемы = Выборка.Пользователь;
            
        КонецЕсли;
        
    Иначе
        
        // Пользователей ИБ нет, создадим Администратора
        ПользовательСистемы = СоздатьАдминистратора();
        
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Похоже, это первый запуск системы. Создан пользователь Администратор";
        Сообщение.Сообщить();
        
    КонецЕсли;
    
    УстановитьПривилегированныйРежим(Ложь);

    Возврат ПользовательСистемы;
    
КонецФункции

#КонецОбласти

Теперь при запуске в параметрах сеанса будет установлен текущий пользователь.

Разбор требования завершен, в следующей части будем разбираться с хранением и отображением состояния задач.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *