v8: Программное управление списком пользователей Ключевые слова: пользователь, программное, автоматически, активные, роли, ПользователиИнформационнойБазы
Из встроенного языка можно выгружать/загружать пользователей в/из DBF или XML.
Вот пара процедур для работы с DBF:
//===========================================
Процедура ВыгрузитьПользователейНажатие(Элемент)
Файл = Новый XBase;
Файл.поля.Добавить("NAME","S",100,0);
Файл.поля.Добавить("AUT_WIN","N",1,0);
Файл.поля.Добавить("WIN_NAME","S",100,0);
Файл.поля.Добавить("AUT_1C","N",1,0);
Файл.поля.Добавить("PWDSET","N",1,0);
Файл.поля.Добавить("AUT_WIN","N",1,0);
Файл.поля.Добавить("INLIST","N",1,0);
Файл.поля.Добавить("FULL_NAME","S",100,0);
Файл.поля.Добавить("INTERFACE","S",100,0);
Файл.поля.Добавить("LANG","S",100,0);
Для н=1 По 5 Цикл
Файл.поля.Добавить("ROLE_" + СокрЛП(н),"S",100,0);
КонецЦикла;
Файл.Кодировка = КодировкаXBase.OEM;
Файл.СоздатьФайл(ПутьКФайлу);
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Для каждого Пользователь Из Пользователи Цикл
Файл.Добавить();
Файл.NAME = СокрЛП(Пользователь.Имя);
Файл.AUT_WIN = Число(Пользователь.АутентификацияОС);
Файл.WIN_NAME = СокрЛП(Пользователь.ПользовательОС);
Файл.AUT_1C = Число(Пользователь.АутентификацияСтандартная);
//Файл.PWD = Булево(Пользователь.Пароль); //поле Пароль доступно ТолькоЗапись
Файл.PWDSET = Число(Пользователь.ПарольУстановлен);
Файл.AUT_WIN = Число(Пользователь.АутентификацияОС);
Файл.INLIST = Число(Пользователь.ПоказыватьВСпискеВыбора);
Файл.FULL_NAME = СокрЛП(Пользователь.ПолноеИмя);
Файл.INTERFACE = Пользователь.ОсновнойИнтерфейс.Имя;
Файл.LANG = Пользователь.Язык.Имя;
н = 0;
Для Каждого Роль Из Метаданные.Роли Цикл
Если Пользователь.Роли.Содержит(Роль) Тогда
н = н + 1;
Файл["ROLE_" + СокрЛП(н)] = Роль.Имя;
КонецЕсли;
КонецЦикла;
Сообщить("Выгружен " + Пользователь.Имя);
Файл.Записать();
КонецЦикла;
Файл.ЗакрытьФайл();
КонецПроцедуры
//===========================================
Процедура ЗагрузитьПользователейНажатие(Элемент)
//ПутьКФайлу = КаталогЗагрузки + "users2.dbf";
Файл = Новый XBase(ПутьКФайлу,,Истина);
Если НЕ Файл.Открыта() Тогда
Сообщить("Файл не открыт " + ПутьКФайлу);
Возврат;
КонецЕсли;
Файл.Кодировка = КодировкаXBase.OEM;
Файл.Первая();
Пока НЕ Файл.ВКонце() Цикл
КраткоеИмя = СокрЛП(Файл.NAME);
Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(КраткоеИмя);
Если Пользователь = Неопределено Тогда
Пользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
Пользователь.Имя = КраткоеИмя;
Сообщить("Создан пользователь " + КраткоеИмя);
Иначе
Сообщить("Найден пользователь " + КраткоеИмя);
КонецЕсли;
Пользователь.АутентификацияОС = Булево(Файл.AUT_WIN);
Пользователь.ПользовательОС = СокрЛП(Файл.WIN_NAME);
Пользователь.АутентификацияСтандартная = Булево(Файл.AUT_1C);
//Пользователь.Пароль = СокрЛП(Файл.PWD);
//Пользователь.ПарольУстановлен = Булево(Файл.PWDSET);
Если Булево(Файл.PWDSET) Тогда
Сообщить("У пользователя " +КраткоеИмя + " НУЖНО УСТАНОВИТЬ пароль!",СтатусСообщения.ОченьВажное);
КонецЕсли;
Пользователь.ПоказыватьВСпискеВыбора = Булево(Файл.INLIST);
Пользователь.ПолноеИмя = СокрЛП(Файл.FULL_NAME);
Если СокрЛП(Файл.INTERFACE) = "<" Тогда
Пользователь.ОсновнойИнтерфейс = Неопределено;
Иначе
Пользователь.ОсновнойИнтерфейс = Метаданные.Интерфейсы.Найти(СокрЛП(Файл.INTERFACE));
КонецЕсли;
Если СокрЛП(Файл.LANG) = "<" Тогда
Пользователь.Язык = Неопределено;
Иначе
Пользователь.Язык = Метаданные.Языки.Найти(СокрЛП(Файл.LANG));
КонецЕсли;
Пользователь.Роли.Очистить();
Для н = 1 По 5 Цикл
Роль = СокрЛП(Файл["ROLE_" + СокрЛП(н)]);
Если Роль <> "<" Тогда
Пользователь.Роли.Добавить(Метаданные.Роли.Найти(Роль));
КонецЕсли;
КонецЦикла;
Пользователь.Записать();
//Сообщить("Загружен пользователь " + Пользователь.Имя);
Файл.Следующая();
КонецЦикла;
Файл.ЗакрытьФайл();
КонецПроцедуры
//===========================================
Обратите внимание, что свойство Пароль доступно только для записи, т.е. нельзя прочитать пароль пользователя - его можно только установить.
На диске ИТС есть обработка "_УправлениеСпискомПользователей.epf.
Для получения списка АКТИВНЫХ пользователей, т.е. подключенных в данный момент к базе, можно использовать метод ПолучитьСоединенияИнформационнойБазы() или через COM-соединение к серверу 1С:Предприятия в случае SQL-версии:
Коннектор = Новый COMОбъект("V8.COMConnector");
Сервер = Коннектор.ConnectServer("server");
Сервер.AddAuthentication("Login","password");
ИнформационнаяБаза = Сервер.CreateInfoBaseInfo();
ИнформационнаяБаза.Name = "1c";
СоединенияБазы = Сервер.GetIBConnections(ИнформационнаяБаза);
Для Каждого Соединение Из СоединенияБазы Цикл
Сервер.Disconnect(Соединение); //только здесь можно ненароком отключить самого себя
КонецЦикла;
Можно также организовать список активных пользователей средствами конфигурации:
Завести Список пользователей, при ПриНачалеРаботыСистемы() проверять и записывать, если его нет в списке, а при ПриЗавершенииРаботыСистемы() вычеркивай из списка... Список сохранять с помощью СохранитьЗначение() и востанавливать ВосстановитьЗначение() из файла в определенном месте, хотя под это дело можно приспособить справочник/регистр сведений. Но это будет работать, если выход пользователей происходит штатно, а если 1С вылетит, то он не будет удален из списка.
Еще есть мысль использовать метод Заблокировать() "Выполняет блокировку объекта от изменения другими режимами или пользователями." Даже если пользователь войдет второй раз, объект будет для него уже заблокирован. При падении/вылете/выходе из 1С система сама разблокирует элемент справочника.
еще один способ выгрузки/загрузки через XML:
Процедура ЗаписатьВXML()
Перем Хран;
//Создать объект записи XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("user.xml");
ЗаписьXML.ЗаписатьОбъявлениеXML();
//XML-сериализация - пришлось изощриться, т.к. платформа почему-то не хочет сериализовать пользователей - поэтому через массив
МасПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();
Хран = Новый ХранилищеЗначения(МасПользователей);
ЗаписатьXML(ЗаписьXML, Хран);
ЗаписьXML.Закрыть();
КонецПроцедуры
Процедура ПрочитатьПользователейИзXML()
ЧтениеXML = Новый ЧтениеXML;
Попытка
ЧтениеXML.ОткрытьФайл("user.xml");
Исключение
Сообщить("Не возможно открыть файл обмена данными!!!");
Возврат;
КонецПопытки;
//Читаем данные из сообщения - XML - сериализация
Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
//Читать очередное значение
Данные = ПрочитатьXML(ЧтениеXML);
МасПользователей = Данные.Получить();
КонецЦикла;
ЧтениеXML.Закрыть();
Для Каждого ТекПользователь Из МасПользователей Цикл
ТекПользователь.Записать();
КонецЦикла;
КонецПроцедуры
|