Имя: Пароль:
1C
1С v8
Программное добавление пользователей в БП 3.0
0 Vladas86
 
28.03.14
10:55
Привет! Перевел бухгалтерию на БП 3.0, обработки переписал, печатные формы перепилил, всё отлично.
Но есть одна штука, которая не дает мне спокойно спать: бухгалтерских баз у меня 10, постоянно нужно назначать права разным людям, вручную это делать ужасно напряжно. В торговле (у нас 10.3) я эту проблему решил синхронизацией пользователей с AD, там никаких проблем нет: просто подключаюсь через webservice и передаю таблицу пользователей и прав.
В БП 3.0 все как-то слишком сложно. Уже второй день не могу победить, может кто уже делал что-то подобное? Собственно проблема у меня с заполнением справочника Пользователи. То роли не цепляет, то группу доступа сбросит.
1 Vladas86
 
28.03.14
12:20
Ап
2 Apokalipsec
 
28.03.14
12:24
Готовый код тебе никто не выложит, помочь разобраться с тем, что не цепляет и сбрасывает можем, если покажешь код.
Пятница - телепаты в запое.
3 Vladas86
 
28.03.14
12:42
Ок.

Функция, которая добавляет пользователя ИБ, работает отлично:

// Функция возвращает Истина, если пользователь успешно добавлен в базу, Ложь в противном случае
// Владас 21_03_14 13:35:15
//
Функция ДобавитьПользователя(ИмяПользователя, ДоменноеИмя, ПользовательАктивен, АутентификацияОС, Авторизация1СПредприятия, МассивРолей) Экспорт
    // Попробуем найти сотрудника
    // Владас 21_03_14 14:05:57
    Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
    //
    // Теперь попробум найти сотрудника по пользователю ос
    // Владас 21_03_14 19:21:27
    Если Пользователь = Неопределено Тогда
        Для Каждого ТекущийПользователь Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
            Если ТекущийПользователь.ПользовательОС = ДоменноеИмя Тогда
                Пользователь = ТекущийПользователь;
                Прервать;
            Конецесли;
        КонецЦикла;
    КонецЕсли;
    //                            
    // Если мы не нашли сотрудника, то создадим его
    // Владас 29_08_13
    Если Пользователь = Неопределено Тогда
        Пользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
    КонецЕсли;
    //
    // Записываем свойства
    // Владас 21_03_14 13:57:07    
    Пользователь.АутентификацияОС = АутентификацияОС;
    Пользователь.АутентификацияСтандартная = Авторизация1СПредприятия;
    Пользователь.ЗапрещеноИзменятьПароль = Истина;
    Пользователь.Имя = ИмяПользователя;
    Пользователь.ПолноеИмя = ИмяПользователя;
    Пользователь.ПоказыватьВСпискеВыбора = Ложь;
    Пользователь.ПользовательОС = ДоменноеИмя;
    //    
    // Сначала очистим все текущие роли
    // Владас 21_03_14 13:51:20
    Пользователь.Роли.Очистить();
    //
    //  Теперь найдем переданный массив ролей в справочнике профилей
    // и добавим все роли указанные в профиле. Все очень сложно, да
    // Владас 27_03_14 11:43:50
    МассивИменРолей = Новый Массив();
    Для Каждого Роль Из МассивРолей.Role Цикл
        МассивИменРолей.Добавить(Роль);    
    КонецЦикла;
    ТекстЗапроса = "ВЫБРАТЬ
                   |    ПрофилиГруппДоступаРоли.Роль.Имя КАК Имя
                   |ИЗ
                   |    Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
                   |ГДЕ
                   |    ПрофилиГруппДоступаРоли.Ссылка.Наименование В(&МассивИменРолей)";
    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("МассивИменРолей", МассивИменРолей);
    Результат = Запрос.Выполнить().Выгрузить();    
    Для Каждого Роль Из Результат Цикл
        НайденнаяРоль = Метаданные.Роли.Найти(Роль.Имя);
        Если НайденнаяРоль <> Неопределено Тогда
            Пользователь.Роли.Добавить(НайденнаяРоль);
        КонецЕсли;
    КонецЦикла;
    //                            
    // Записываем!
    Пользователь.Записать();
    //
    // Теперь посмотрим нужно ли деактивировать пользователя
    Если Не ПользовательАктивен Тогда
        ДективироватьПользователя(Пользователь);    
    КонецЕсли;
    //    
    // Запишем еще и справочник пользователя
    // Владас 24_03_14 10:24:40
    ЗаполнитьСправочникПользователя(Пользователь);
    //                            
    Возврат Истина;
КонецФункции


Теперь функция, которая добавляет справочник Пользователь. С ней и проблема:


// Процедура заполняет помимо прочего справочник пользователя
// Владас 24_03_14 10:13:40
//
Процедура ЗаполнитьСправочникПользователя(ПользовательИБ) Экспорт
    ТекстЗапроса = "ВЫБРАТЬ
                   |    ИСТИНА КАК ЕстьПользователь,
                   |    Пользователи.Ссылка КАК Пользователь
                   |ИЗ
                   |    Справочник.Пользователи КАК Пользователи
                   |ГДЕ
                   |    Пользователи.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ
                   |
                   |ОБЪЕДИНИТЬ ВСЕ
                   |
                   |ВЫБРАТЬ
                   |    ЛОЖЬ,
                   |    NULL";
    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
    Результат = Запрос.Выполнить().Выгрузить()[0];
    ОписаниеПользователя = Пользователи.НовоеОписаниеПользователяИБ();
    Если Результат.ЕстьПользователь Тогда
        ПользовательОбъект = Результат.Пользователь.ПолучитьОбъект();
    Иначе            
        ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент();
        ПользовательОбъект.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
        ПользовательОбъект.Наименование = ПользовательИБ.Имя;
        ОписаниеПользователя.Вставить("Действие", "Записать");
        ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователя);
    КонецЕсли;
    ЗаполнитьЗначенияСвойств(ОписаниеПользователя, ПользовательИБ);
    Для Каждого Элемент Из ОписаниеПользователя Цикл
        ПользовательОбъект.ДополнительныеСвойства.Вставить(Элемент.Ключ, Элемент.Значение);        
    КонецЦикла;        
    ПользовательОбъект.ДополнительныеСвойства.Удалить("Роли");
    ПользовательОбъект.Записать();
КонецПроцедуры

Что не так?
4 mikecool
 
28.03.14
12:44
(3) а что с ней не так?
5 Vladas86
 
28.03.14
12:54
Смотри, я так понимаю в БП 3.0 вместе с обычными ролями 1с проверяются еще и ГруппыДоступа, в которых продублированы роли. Причем при записи справочника Пользователь группа доступа может установиться верно, а может полностью убрать уже установленные роли.
Как это вообще все вместе работает я совершенно не могу разобраться, все очень запутано.
Группы доступа ставятся из внешней формы, и опять же по какому-то очень хитрому алгоритму. Вот как-то так.
6 Apokalipsec
 
28.03.14
13:07
(5) Группа доступа - это профиль, настройка ролей осуществляется через группы доступа. Роли берутся из группы доступа, если сначала дашь роли, потом дашь группу - получишь роли из группы.)
Настрой корректно группы и будет тебе счастье, роли не надо ставить.
7 Vladas86
 
28.03.14
13:11
(6) Ок, понял.
Не подскажешь, кстати, есть ли в модулях процедуры для добавления пользователя в группу?
8 Vladas86
 
31.03.14
16:09
Всем спасибо, всё работает.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой