Идея возникла в обычной рабочей ситуации. Подошёл пользователь ИБ и попросил заменить ему пароль во всех базах (используется система УРБД и в наличии на данный момент 12 периферийных баз). Раньше этим вопросом занимался админ, но в данный момент он оказался в отпуске и пришлось, заданную задачу решать мне. Я начал заходить удалённо на сервера, но вот незадача посыпались проблемы:
1. Не достаточно прав для доступа на сервер
2. Обвалился канал и нужно выжидать пока он подымется
3. Сервер находится не в домене и снова до него не достучаться
4. И т.д. и т.п. ...
И я пошёл в обход!
1. Взял компоненту для работы со списком пользователей в конфигураторе UsersDef.dll
2. Открыл конфигуратор и создал новые элементы метаданных:
· Новый справочник [Подразделения] (у меня этот элемент был ранее создан, но для тех кто будет использовать данный материал как пример к разработке он понадобится в минимальном, своём, представлении)
Реквизиты:
- Код
- Наименование
(Справочник.Подразделения используется для идентификации удалённой торговой точки, и привязанн к пользователю для определения его местоположения (т.е. в Справочник.Пользователи есть реквизит Подразделение))
· Новая константа [МеняемПарольПользователям] принимающая значения 0/1 (т.е. функция флага)
· Перечисления [СатусыИзмененияПароляПользователю]
Значения:
- Изменить
- Готово
· Новый справочник [ЗаменаПароляПользователю]
Реквизиты:
- Подразделение Тип [Справочник.Подразделения]
- Пользователь Тип [Справочник.Пользователи]
- Заменил Тип [Справочник.Пользователи]
- Пароль Тип [Строка / длина 15]
- Статус Тип [Перечисления.СатусыИзмененияПароляПользователю]
- Время Тип [Строка / длина 8]
- Дата Тип [Дата]
- Птп Тип [Число / длина 2 / точность 0]
3. Добавил код в [модуль формы списка] справочника [ЗаменаПароляПользователю]
4. После того, как в конфигурации были добавлены все элементы. Я заполнил Справочник.ЗаменаПароляПользователю необходимыми данными для замены.
5. И добавил немного кода в [глобальный модуль]:
//************************************************************************** {
Процедура ПриНачалеРаботыСистемы()
глУстановитьПользователяСистемы(пИмяПользователя);
//[Замена пароля пользователям] {
//2-ая часть
Если (Константа.МеняемПарольПользователям = 1) И (пИмяПользователя = "Администратор") Тогда
РезультатВыполнения = глВнестиИзмененияВСписокПользователейКонфигуратора();
Предупреждение(РезультатВыполнения,30);
Константа.МеняемПарольПользователям = 0;
СтатусВозврата(0);
ЗавершитьРаботуСистемы(0);
Возврат;
КонецЕсли;
//1-ая часть
Константа.МеняемПарольПользователям = 0;
КолвоИзменений = глПроверитьНаличиеДанныхНаИзменениеПароляПользователям();
Если КолвоИзменений > 0 Тогда
ТолькоИмя = ПолучитьТолькоИмяПользователя(пИмяПользователя);
Ответ = Вопрос("Доброго времени суток!
|" +ТолькоИмя+ ", можно я внесу изменения в список пользователей?
|Это займёт не больше 1 минуты...","Да+Нет");
Если Ответ = "Да" Тогда
Предупреждение("Спасибо " +ТолькоИмя+ "!",2);
Константа.МеняемПарольПользователям = 1;
КомандаСистемы(Симв(34) +КаталогПрограммы()+ "1cv7s.exe" +Симв(34)+ " enterprise /d" +КаталогИБ()+ " /nАдминистратор /pПароль");
Иначе
ЗаписьЖурналаРегистрации("Пользователь [" +глПользователь+ "] отказал в замене пароля!", "Отказ при замене пароля");
КонецЕсли;
КонецЕсли;
//Если изменений нет, то пользователь продолжает работу в обычном режиме
//[Замена пароля пользователям] }
КонецПроцедуры // ПриНачалеРаботыСистемы
//************************************************************************** {
При начале работы системы я добавил два блока кода, первый из которых (1-ая часть) проверяет наличие обновлений в справочнике, и если таковые имеются, то устанавливает значение константы в положение 1 и запускает 1С под Администратором. Срабатывает второй блок кода (2-ая часть), и вносит все изменения в конфигурацию (предусмотренные Администратором). После чего сессия Администратора закрывается и пользователь продолжает работу в своей сессии 1С.
Вот таким образом, за 4 часа работы, я избавил себя от этой проблемы навсегда.
---
Готовые тексты модулей прикреплены к статье.
//************************************************************************************************************************** }