helpf.pro
Регистрация
 +5 
Распечатать

Как программно создать нового пользователя или скопировать настройки существующего?

Часто встречаю вопросы касаемые программного создания и настройки прав пользователей. 

В этот статье я приведу примеры для Обычного и Управляемого приложений, которые программно создают пользователя в конфигураторе и в режиме Предприятие (справочник пользователи) и установку Групп пользователей.

В приложении к статье обработки, код которых приведен ниже: Скачать обработки 

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

Управляемое приложение:

В конфигурациях на управляемом интерфейсе (Такси) изменили подход к ведению пользователей. Если вы добавляете не программно, то добавлять нужно из режима Предприятия - тогда пользователь ИБ у вас сам создатся. И если раньше, в обычном приложении, достаточно будет добавить польз в конфигураторе - и при заходе в Предприятие, этот польз сам создавался в спр Пользователи, то с управляемым приложением такой фокус не прокатит - система не даст зайти под пользователем ИБ, которого нет в справочнике Пользователи.

! В типовых конфигурациях для работы с пользователями активно используется БСП !

В общем модуле Пользователи используется программный интерфейс процедур и функций НовоеОписаниеПользователяИБ, ПрочитатьПользователяИБ, ЗаписатьПользователяИБ иУдалитьПользователяИБ.

Код создания нового пользователя с использованием БСП:

Код 1C v 8.3
 &НаСервере
Функция КопированиеВсехНастроек(ПользовательСсылка,ПользовательПриемник)

Пользователь = Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательСсылка);

Приемники = Новый Массив;
ТаблицаПользователей = Новый ТаблицаЗначений;
ТаблицаПользователей.Колонки.Добавить("Пользователь");
ТаблицаПользователей = Обработки.НастройкиПользователей.ПользователиДляКопирования(ПользовательСсылка, ТаблицаПользователей, 
ТипЗнч(ПользовательСсылка) = Тип("СправочникСсылка.ВнешниеПользователи"));

Для Каждого СтрокаТаблицы Из ТаблицаПользователей Цикл
Приемники.Добавить(ПользовательПриемник);
КонецЦикла;

КопируемыеНастройки = Новый Массив;
КопируемыеНастройки.Добавить("НастройкиОтчетов");
КопируемыеНастройки.Добавить("НастройкиВнешнегоВида");
КопируемыеНастройки.Добавить("ПерсональныеНастройки");
КопируемыеНастройки.Добавить("Избранное");
КопируемыеНастройки.Добавить("НастройкиПечати");
КопируемыеНастройки.Добавить("ПрочиеПользовательскиеНастройки");

НастройкиСкопированы = Обработки.НастройкиПользователей.
КопированиеНастроекПользователей(ПользовательСсылка, Приемники, КопируемыеНастройки);

Возврат НастройкиСкопированы;

КонецФункции


Функция СоздатьНовыйУровеньДоступа(ФИО)

Рез = Справочники.CRM_УровниДоступа.НайтиПоНаименованию(ФИО);
Если Рез = Неопределено ИЛИ Рез = Справочники.CRM_УровниДоступа.ПустаяСсылка() Тогда
НовыйОбъект = Справочники.CRM_УровниДоступа.СоздатьЭлемент();
НовыйОбъект.Наименование = ФИО;
НовыйОбъект.Записать();
возврат НовыйОбъект.Ссылка;
КонецЕсли;  
 
КонецФункции


Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)

Если ПользовательНастроек = Неопределено Тогда
Возврат;
КонецЕсли;

ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы.НайтиПоИмени(Объект.ФИОСоздаваемогоПользователя);
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда

Пользователь_Шаблон = ПользователиИнформационнойБазы.НайтиПоИмени(сокрлп(ПользовательНастроек.Наименование));


ОписаниеПользователяИБ            = Пользователи.НовоеОписаниеПользователяИБ();
ПользовательИБСуществует          = Ложь;
ДоступКИнформационнойБазеРазрешен = Ложь;

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

// Установка связи пользователем ИБ.
//ДоступКИнформационнойБазеРазрешен = Истина;

// Копирование свойств и ролей пользователяИБ.
ЗаполнитьЗначенияСвойств(
ОписаниеПользователяИБ,
ПрочитанныеСвойства,
"АутентификацияOpenID,
|АутентификацияСтандартная,
|ЗапрещеноИзменятьПароль,
|ПоказыватьВСпискеВыбора,
|АутентификацияОС,
|РежимЗапуска,
|Язык,
|Роли");
КонецЕсли;

ОписаниеПользователяИБ.Вставить("Действие", "Записать");
ОписаниеПользователяИБ.Вставить("Имя", Объект.ФИОСоздаваемогоПользователя);



НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
НовыйПользователь.Наименование = Объект.ФИОСоздаваемогоПользователя;
НовыйПользователь.ТекущееПодразделение = ПользовательНастроек.ТекущееПодразделение;
НовыйПользователь.CRM_УровеньДоступа = СоздатьНовыйУровеньДоступа(Объект.ФИОСоздаваемогоПользователя);
НовыйПользователь.Недействителен = ложь;


НовыйПользователь.ДополнительныеСвойства.Вставить(
"ОписаниеПользователяИБ", ОписаниеПользователяИБ);

НовыйПользователь.Записать();

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка";

Запрос.УстановитьПараметр("Пользователь", ПользовательНастроек);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
объ = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
НоваяСтрока = объ.Состав.Добавить();
НоваяСтрока.Пользователь = НовыйПользователь.Ссылка;
объ.Записать();
КонецЦикла;

Запрос.Текст = 
"ВЫБРАТЬ
| ГруппыДоступаПользователи.Ссылка
|ИЗ
| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
|ГДЕ
| ГруппыДоступаПользователи.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыДоступаПользователи.Ссылка";

Запрос.УстановитьПараметр("Пользователь", ПользовательНастроек);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
объ = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
НоваяСтрока = объ.Пользователи.Добавить();
НоваяСтрока.Пользователь = НовыйПользователь.Ссылка;
объ.Записать();
КонецЦикла;


КопированиеВсехНастроек(ПользовательНастроек,НовыйПользователь.Ссылка);

Иначе
сообщить("Указанное ФИО Пользователя уже используется !!! ");
КонецЕсли;

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


&НаКлиенте
Процедура СоздатьПользователя(Команда)
СоздатьПользователяНаСервере();
КонецПроцедуры


&НаСервере
Процедура СоздатьПользователяНаСервере()

Если НЕ ЗначениеЗаполнено(Объект.ШаблонПользователяДляСозданияНового) Тогда
Возврат;
КонецЕсли;


// настройки устанавливаются на форму
ОбновитьДанныеПользователяИБ(Объект.ШаблонПользователяДляСозданияНового, Ложь);

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


&НаСервере
Процедура СкопироватьНастройкиНаСервере(ИзменяемыйПользователь,ШаблонПользователяДляКопирования)
//Копируем роли пользователя
тИзменяемыйПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(сокрлп(ИзменяемыйПользователь.Наименование));
тШаблонПользователяДляКопирования = ПользователиИнформационнойБазы.НайтиПоИмени(сокрлп(ШаблонПользователяДляКопирования.Наименование));

//Очищаем роли
тИзменяемыйПользователь.Роли.Очистить();
// Копируем
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;  
Для Каждого мРоль Из Метаданные.Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ.Добавить();
СтрокаСписокаДоступныхРолей.Представление = мРоль.Представление();
СтрокаСписокаДоступныхРолей.Значение = мРоль;
КонецЦикла; 

Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если тШаблонПользователяДляКопирования.Роли.Содержит(СтрокаСпискаДоступныхРолей.Значение) Тогда
тИзменяемыйПользователь.Роли.Добавить(СтрокаСпискаДоступныхРолей.Значение);
КонецЕсли;
КонецЦикла; 
тИзменяемыйПользователь.Записать();


//Копируем настройки БСП
КопированиеВсехНастроек(ШаблонПользователяДляКопирования,ИзменяемыйПользователь);  
КонецПроцедуры


&НаКлиенте
Процедура СкопироватьНастройки(Команда)
СкопироватьНастройкиНаСервере(Объект.ИзменяемыйПользователь, Объект.ШаблонПользователяДляКопирования);
КонецПроцедуры

Обычное приложение:

В обычном все проще:

Код 1C v 8.х
 Процедура КнопкаВыполнитьНажатие(Кнопка)

Если НЕ ЗначениеЗаполнено(ШаблонПользователяДляСозданияНового) Тогда
Возврат;
КонецЕсли;

// настройки устанавливаются на форму
ОбновитьДанныеПользователяИБ(ШаблонПользователяДляСозданияНового, Ложь);

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

Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)

Если ПользовательНастроек = Неопределено Тогда
Возврат;
КонецЕсли;

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

Пользователь_Шаблон = ПользователиИнформационнойБазы.НайтиПоИмени(сокрлп(ПользовательНастроек.Код));

ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
ПользовательИБ.Имя = ФИОСоздаваемогоПользователя;
ПользовательИБ.АутентификацияСтандартная = Истина;
ПользовательИБ.Пароль = ПарольСоздаваемогоПользователя;
ПользовательИБ.ПолноеИмя =  ФИОСоздаваемогоПользователя;
ПользовательИБ.ПоказыватьВСпискеВыбора = Истина;
ПользовательИБ.ОсновнойИнтерфейс = Пользователь_Шаблон.ОсновнойИнтерфейс;
ПользовательИБ.Язык = Пользователь_Шаблон.Язык;


СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;

Для Каждого мРоль Из Метаданные.Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ.Добавить();
СтрокаСписокаДоступныхРолей.Представление = мРоль.Представление();
СтрокаСписокаДоступныхРолей.Значение = мРоль;
КонецЦикла; 

Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если Пользователь_Шаблон.Роли.Содержит(СтрокаСпискаДоступныхРолей.Значение) Тогда
ПользовательИБ.Роли.Добавить(СтрокаСпискаДоступныхРолей.Значение);
КонецЕсли;
КонецЦикла; 

ПользовательИБ.Записать();

НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
//НовыйПользователь.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
НовыйПользователь.Код = ФИОСоздаваемогоПользователя;
НовыйПользователь.Наименование = ФИОСоздаваемогоПользователя;
НовыйПользователь.Родитель = ПользовательНастроек.Родитель;

НовыйПользователь.Подразделение = ПользовательНастроек.Подразделение;
НовыйПользователь.Категория = ПользовательНастроек.Категория;
НовыйПользователь.Руководитель = ПользовательНастроек.Руководитель;
НовыйПользователь.Действует = ПользовательНастроек.Действует;
НовыйПользователь.Записать();


НаборПользователя = РегистрыСведений.НастройкиПользователей.СоздатьНаборЗаписей();
НаборПользователя.Отбор.Пользователь.Установить(ПользовательНастроек);
НаборПользователя.Прочитать();

НаборНовогоПользователя = РегистрыСведений.НастройкиПользователей.СоздатьНаборЗаписей();
НаборНовогоПользователя.Отбор.Пользователь.Установить(НовыйПользователь.Ссылка);


Для Каждого СтрокаНастроек из НаборПользователя Цикл
НоваяСтрокаНастроек = НаборНовогоПользователя.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаНастроек,СтрокаНастроек);
НоваяСтрокаНастроек.Пользователь = НовыйПользователь.Ссылка;
Если Найти(СтрокаНастроек.Настройка.Наименование,"Основной ответственный") Тогда
НоваяСтрокаНастроек.Значение = НовыйПользователь.Ссылка;
КонецЕсли;
КонецЦикла;

Если НаборНовогоПользователя.Количество()>0 Тогда
НаборНовогоПользователя.Записать();
КонецЕсли;
сообщить("Создан пользователь "+ФИОСоздаваемогоПользователя);

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.ПользователиГруппы КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка";

Запрос.УстановитьПараметр("Пользователь", ПользовательНастроек);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
объ = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
НоваяСтрока = объ.ПользователиГруппы.Добавить();
НоваяСтрока.Пользователь = НовыйПользователь.Ссылка;
объ.Записать();
КонецЦикла;

Иначе
сообщить("Указанное ФИО Пользователя уже используется !!! ");
КонецЕсли;


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

еще пример:

Код 1C v 8.х
 Функция ДобавитьПользователя(ИмяПользователя, ДоменноеИмя, ПользовательАктивен, АутентификацияОС, Авторизация1СПредприятия, МассивРолей) Экспорт
    // Попробуем найти сотрудника
    Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);


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


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


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

    // Записываем!
    Пользователь.Записать();

    // Теперь посмотрим нужно ли деактивировать пользователя
    Если Не ПользовательАктивен Тогда
        ДективироватьПользователя(Пользователь);    
    КонецЕсли;

    // Запишем еще и справочник пользователя
    ЗаполнитьСправочникПользователя(Пользователь);
  
    Возврат Истина;
КонецФункции


// Процедура заполняет помимо прочего справочник пользователя
Процедура ЗаполнитьСправочникПользователя(ПользовательИБ) Экспорт
    ТекстЗапроса = "ВЫБРАТЬ
                   |    ИСТИНА КАК ЕстьПользователь,
                   |    Пользователи.Ссылка КАК Пользователь
                   |ИЗ
                   |    Справочник.Пользователи КАК Пользователи
                   |ГДЕ
                   |    Пользователи.ИдентификаторПользователяИБ =ИдентификаторПользователяИБ
                   |
                   |ОБЪЕДИНИТЬ ВСЕ
                   |
                   |ВЫБРАТЬ
                   |    ЛОЖЬ,
                   |    NULL";
    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
    Результат = Запрос.Выполнить().Выгрузить()[0];
    ОписаниеПользователя = Пользователи.НовоеОписаниеПользователяИБ();
    Если Результат.ЕстьПользователь Тогда
        ПользовательОбъект = Результат.Пользователь.ПолучитьОбъект();
    Иначе            
        ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент(); 
        ПользовательОбъект.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
        ПользовательОбъект.Наименование = ПользовательИБ.Имя;
        ОписаниеПользователя.Вставить("Действие", "Записать");
        ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователя);
    КонецЕсли;
    ЗаполнитьЗначенияСвойств(ОписаниеПользователя, ПользовательИБ);
    Для Каждого Элемент Из ОписаниеПользователя Цикл
        ПользовательОбъект.ДополнительныеСвойства.Вставить(Элемент.Ключ, Элемент.Значение);        
    КонецЦикла;        
    ПользовательОбъект.ДополнительныеСвойства.Удалить("Роли");
    ПользовательОбъект.Записать();
КонецПроцедуры
Разместил:   Версии: | 8.x | 8.2 УП | 8.3 |  Дата:   Прочитано: 54831
 +5 
Распечатать
Возможно, вас также заинтересует
1С Предприятие что это? 12
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое
Cодержимое указанного ниже веб-сайта в этом приложении блокируется... Aboutsecurity_1cv8c.exe 1
Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка: Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe «Содержимое указанного ниже веб-узла в э
rphost занимает память и грузит процессор 22
У многих возникают проблемы с rphost.exe, разного вида: rphost занимает всю память rphost грузит процессор rphost жрет память причем 1С даже на запущена, а в диспетчере следующее: ежеминутно расчет на 2-3 мегабайта. Как быть и что делат
v7plus.dll - отсутствует CLSID либо отсутствует интерфейс llnitDone 0
При выгрузке отчетности в 1С 7.7 программа ругается на v7plus.dll и указывает, что отсутствует интерфейс llritDone. Что делать? 1) Поудалять нафиг все v7plus.dll из каталогов ИБ и папок пользователей 2) Оставить только в bin каталоге и зарегить чер
V82.COMConnector.1: Не найдена лицензия COM-соединением 1
При подключении из одной базы к другой через COM внезапно стала появляться следующая ошибка: «V82.COMConnector.1: Не найдена лицензия COM-соединением», хотя никаких изменений на серверах не делалось. Релиз платформы был 8.2.13. Обновил до 14-го – не
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.