Задача возникла в результате того, что я работаю в специфической организации,
где часто идет ротация пользователей(
например аудиторы заходят или фискалы, за раз до 50-60 пользователей). В результате довольно
частая ситуация появляются в базе пользователи с одинаковыми логинами и их надо отлавливать периодически.
Эта обработка дает возможность это делать, плюс парочка дополнительных
возможностей, просмотр всех пользователей и просмотр работающих пользователей. Обработка используется на практике.
Представляю скриншоты которые показывают три закладки на форме обработки:
1. Отображены все пользователи
2. Отображены двойные логины
3. Отображены работающие пользователи
Программа запускается как внешняя обработка:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ОбработкаСписка();
КонецПроцедуры
На форме обработки имеется кнопка "Инструкция", которая запускает процедуру ИнструкцияПоЭксплуатации(Команда):
&НаКлиенте
Процедура ИнструкцияПоЭксплуатации(Команда)
//Процедура выводит текстовый файл Инструкция по эксплуатации
Инструкция=" Инструкция на обработку двойной логин."+Символы.ПС+"
|1. На закладке ""Все пользователи"" отображаются все пользователи базы."+Символы.ПС+"
|2. На закладке ""Двойные логины"" отображаются пользователи с повторяющимися логинами (выбираются только действующие пользователи)."+Символы.ПС+"
|3. На закладке ""Список рабочих пользователей"" отображаются только действующие пользователи";
Предупреждение(Инструкция);
КонецПроцедуры
Следующая процедура заполняет три закладки, которые указаны выше на скриншотах.
Подробно работа процедуры описана в комментариях.
&НаСервере
Процедура ОбработкаСписка()
ТаблицаСписокПользователей.Очистить();
ТаблицаДействующихПользователей.Очистить();
ПорядковыйНомер=0;
//Создаем Массив пользователей Информационной Базы для изменения доменов *****************************
Выборка= ПользователиИнформационнойБазы.ПолучитьПользователей(); //Получаем массив пользователей и из массива выбираем нужного пользователя по идентификатору
Для Каждого ЭлементМассива Из Выборка Цикл
ПолноеИмяПользователя=ЭлементМассива.ПолноеИмя; //Из массива забираем полное имя пользователя
ПользовательУникльныйИдентификатор=ЭлементМассива.УникальныйИдентификатор; //Из массива забираем уникальный идентификатор пользователя
ДоменЛогин=ЭлементМассива.ПользовательОС; //Из Массива забираем домен логин пользователя
Запрос = Новый Запрос; //Определяем текущего пользователя в справочнике Пользователи
Запрос.Текст =
"ВЫБРАТЬ
| Пользователи.Наименование КАК Наименование,
| Пользователи.ПометкаУдаления КАК ПометкаУдаления
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ИдентификаторПользователяИБ = &ПользовательУникльныйИдентификатор"
;
Запрос.УстановитьПараметр("ПользовательУникльныйИдентификатор",ПользовательУникльныйИдентификатор);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ПометкаУдаления=Ложь Тогда
ПометкаУдаленияПользователя = "Действует"; //Записываем результат ПометкаУдаления
Иначе
ПометкаУдаленияПользователя = "Удален";
КонецЕсли;
КонецЦикла;
//****************************************************************************************************
Если НЕ ДоменЛогин="" Тогда //Выделяем из ДоменЛогин Домен и логин
ДлинаДомена=СтрДлина(ДоменЛогин);
ДоменПользователя="";
ЛогинПользователя="";
Буква="";
СчетчикБукв=3;
Буква=Сред(ДоменЛогин,СчетчикБукв,1);
ФлагДЛ="Д";
Пока СчетчикБукв <= ДлинаДомена Цикл
Если Буква="\" Тогда
ФлагДЛ="Л";
СчетчикБукв=СчетчикБукв+1;
Буква=Сред(ДоменЛогин,СчетчикБукв,1);
Иначе
Если ФлагДЛ="Д" Тогда
ДоменПользователя=ДоменПользователя+Буква;
СчетчикБукв=СчетчикБукв+1;
Буква=Сред(ДоменЛогин,СчетчикБукв,1);
КонецЕсли;
Если ФлагДЛ="Л" Тогда
ЛогинПользователя=ЛогинПользователя+Буква;
СчетчикБукв=СчетчикБукв+1;
Буква=Сред(ДоменЛогин,СчетчикБукв,1);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Иначе
ЛогинПользователя="";
ДоменПользователя="";
КонецЕсли;
//***************************************************************************************************************************************************
//Заносим в таблицу всех пользователей по списку*****************************************************************************************************
ПорядковыйНомер=ПорядковыйНомер+1;
Строка=ТаблицаСписокПользователей.Добавить();
Строка.ПорядковыйНомер=ПорядковыйНомер;
Строка.ПолноеИмяПользователя=ПолноеИмяПользователя;
Строка.ПользовательУникльныйИдентификатор =ПользовательУникльныйИдентификатор;
Строка.ДоменЛогин=СокрЛП(ДоменЛогин);
Строка.ДоменПользователя =СокрЛП(ДоменПользователя) ;
Строка.ЛогинПользователя =СокрЛП(ЛогинПользователя) ;
Строка.ПометкаУдаления=ПометкаУдаленияПользователя;
КонецЦикла;
ПорядковыйНомер=0;
Запрос = Новый Запрос;
ТСП = РеквизитФормыВЗначение("ТаблицаСписокПользователей",Тип("ТаблицаЗначений")); //Выгружаем Табличный реквизит формы в переменную
МВТ=Новый МенеджерВременныхТаблиц; //Создаем МенеджерВременныхТаблиц
Запрос.МенеджерВременныхТаблиц=МВТ;
//Помещаем таблицу пользователей во временную таблицу и из нее выбираем талько рабочих пользователей, помещаем их в таблицу рабочих пользователей****
Запрос.Текст =
"ВЫБРАТЬ
| ТСП1.ПолноеИмяПользователя КАК ПолноеИмяПользователя,
| ТСП1.ПользовательУникльныйИдентификатор КАК ПользовательУникльныйИдентификатор,
| ТСП1.ДоменЛогин КАК ДоменЛогин,
| ТСП1.ДоменПользователя КАК ДоменПользователя,
| ТСП1.ЛогинПользователя КАК ЛогинПользователя,
| ТСП1.ПометкаУдаления КАК ПометкаУдаления
|ПОМЕСТИТЬ ВТПользователи
|ИЗ
| &ТСП1 КАК ТСП1
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТПользователи.ПолноеИмяПользователя КАК ПолноеИмяПользователя,
| ВТПользователи.ПользовательУникльныйИдентификатор КАК ПользовательУникльныйИдентификатор,
| ВТПользователи.ДоменЛогин КАК ДоменЛогин,
| ВТПользователи.ДоменПользователя КАК ДоменПользователя,
| ВТПользователи.ЛогинПользователя КАК ЛогинПользователя,
| Пользователи.Ссылка КАК ПользовательСсылка,
| Пользователи.ПометкаУдаления КАК ПометкаУдаления
|ИЗ
| ВТПользователи КАК ВТПользователи
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
| ПО ВТПользователи.ПользовательУникльныйИдентификатор = Пользователи.ИдентификаторПользователяИБ
|ГДЕ
| НЕ Пользователи.ПометкаУдаления = Истина
|
|УПОРЯДОЧИТЬ ПО
| ПолноеИмяПользователя"
;
Запрос.УстановитьПараметр("ТСП1",ТСП);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл //Выбираем результат запроса в цикле
ПорядковыйНомер=ПорядковыйНомер+1;
Строка=ТаблицаСписокРабочихПользователей.Добавить();
Строка.ПорядковыйНомер=ПорядковыйНомер;
Строка.ПолноеИмяПользователя=Выборка.ПолноеИмяПользователя;
Строка.ПользовательУникльныйИдентификатор =Выборка.ПользовательУникльныйИдентификатор;
Строка.ДоменЛогин=Выборка.ДоменЛогин;
Строка.ДоменПользователя =Выборка.ДоменПользователя ;
Строка.ЛогинПользователя =Выборка.ЛогинПользователя ;
Строка.ПометкаУдаления =Выборка.ПометкаУдаления ;
КонецЦикла;
//Помещаем таблицу рабочих пользователей во временную таблицу, выбираем пользователей со сдвоенными логинами для этого используем "КОЛИЧЕСТВО"*******
//и одно поле группировки во временную таблицу СдвоенныеЗаписи . Соединяем временные таблицы и справочник Пользователи******************************
ПорядковыйНомер=0;
ЛогинКоличество1=1;
ТСП = РеквизитФормыВЗначение("ТаблицаСписокПользователей",Тип("ТаблицаЗначений")); //Выгружаем Табличный реквизит формы в переменную
МВТ=Новый МенеджерВременныхТаблиц; //Создаем МенеджерВременныхТаблиц
Запрос.МенеджерВременныхТаблиц=МВТ;
Запрос.Текст =
"ВЫБРАТЬ
| ТСП1.ПолноеИмяПользователя КАК ПолноеИмяПользователя,
| ТСП1.ПользовательУникльныйИдентификатор КАК ПользовательУникльныйИдентификатор,
| ТСП1.ДоменЛогин КАК ДоменЛогин,
| ТСП1.ДоменПользователя КАК ДоменПользователя,
| ТСП1.ЛогинПользователя КАК ЛогинПользователя
|ПОМЕСТИТЬ ВТПользователи
|ИЗ
| &ТСП1 КАК ТСП1
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТПользователи.ЛогинПользователя КАК ЛогинПользователя,
| КОЛИЧЕСТВО(ВТПользователи.ЛогинПользователя) КАК СдвоенныеЗаписиКоличество
|ПОМЕСТИТЬ СдвоенныеЗаписи
|ИЗ
| ВТПользователи КАК ВТПользователи
|
|СГРУППИРОВАТЬ ПО
| ВТПользователи.ЛогинПользователя
|
|ИМЕЮЩИЕ
| КОЛИЧЕСТВО(ВТПользователи.ЛогинПользователя) > 1
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТПользователи.ПолноеИмяПользователя КАК ПолноеИмяПользователя,
| ВТПользователи.ПользовательУникльныйИдентификатор КАК ПользовательУникльныйИдентификатор,
| ВТПользователи.ДоменЛогин КАК ДоменЛогин,
| ВТПользователи.ДоменПользователя КАК ДоменПользователя,
| ВТПользователи.ЛогинПользователя КАК ЛогинПользователя,
| СдвоенныеЗаписи.СдвоенныеЗаписиКоличество КАК СдвоенныеЗаписиКоличество,
| Пользователи.Ссылка КАК ПользовательСсылка
|ИЗ
| ВТПользователи КАК ВТПользователи
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ СдвоенныеЗаписи КАК СдвоенныеЗаписи
| ПО ВТПользователи.ЛогинПользователя = СдвоенныеЗаписи.ЛогинПользователя
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
| ПО ВТПользователи.ПользовательУникльныйИдентификатор = Пользователи.ИдентификаторПользователяИБ
|ГДЕ
| НЕ Пользователи.ПометкаУдаления = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| СдвоенныеЗаписиКоличество,
| ДоменЛогин"
;
Запрос.УстановитьПараметр("ТСП1",ТСП);
Запрос.УстановитьПараметр("ЛогинКоличество",ЛогинКоличество1);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл //Выбираем результат запроса в цикле
ПорядковыйНомер=ПорядковыйНомер+1;
Строка=ТаблицаДействующихПользователей.Добавить();
Строка.ПорядковыйНомер=ПорядковыйНомер;
Строка.ПолноеИмяПользователя=Выборка.ПолноеИмяПользователя;
Строка.ПользовательУникльныйИдентификатор =Выборка.ПользовательУникльныйИдентификатор;
Строка.ДоменЛогин=Выборка.ДоменЛогин;
Строка.ДоменПользователя =Выборка.ДоменПользователя ;
Строка.ЛогинПользователя =Выборка.ЛогинПользователя ;
Строка.ЛогинКоличество =Выборка.СдвоенныеЗаписиКоличество ;
Строка.ПользовательСсылка =Выборка.ПользовательСсылка ;
КонецЦикла;
КонецПроцедуры