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

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

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

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

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

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

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

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

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

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

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

Код 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 |  Дата:   Прочитано: 59428
 +5 
Распечатать
Возможно, вас также заинтересует
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П
PostgreSQL: установка, настройка, обслуживание 11
PostgreSQL напрямую "из коробки" применяться для использования с 1С Предприятем не может. Необходима именно адаптированная версия от 1С, превращающая PostgreSQL в блокировочник, причем нужно понимать, что блокировки будут накладываться на всю таблиц
База 1С при запуске уходит в дамп и вылетает 1
В последнее время частенько обращаются пользователи у которых после замены или ремонта компьютера 1С не запускается, а точнее при открытии уходит в dump и вылетает. Как правило, решение одно: Отключить аппаратное ускорение видеокарты В Window
Восстановление пароля с версии 8.3.17 5
Бывают случаи когда нужно восстановить доступ к 1С, но пароль утерян или прошлый программист уволился и прочее. Доступные методы в интернете не работают с версии 8.3.17, а некоторые методы полностью вычищают список пользователей. Данный метод позвол
Вывод в поле Наименование справочника Штатное список значений из справочника Подразделения? 0
Есть два справочника Штатное и Подразделения. В справочнике Штатное есть автоматически генерируемое поле Наименование. Как программно сделать так чтобы в поле Наименование справочника Штатное выводились списком значений из поля Наименование справочн
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.