Шёл тихий, спокойный рабочий день, ничего не предвещало беды.
Но, закон подлости подкрался незаметно. Повис терминальный сервак(Да, сервак не слишком то мощный, но всё же...).
Появилась задача запретить запуск нескольких сеансов 1с, дабы наши доблестные юзера не могли разом формировать много-много больших отчётиков.
Задачка, вроде бы простая, но естетственно у юзеров нет права на просмотр списка активных пользователей. Поиски в интеренете не дали никаких результатов, ибо предлагалось много чего, начиная от раздачи всем прав на просмотр списка активных пользователей, заканчивая COM соединением с той же базой.
После недолгих раздумий родилось следующее:
1) в любом привелигированном модуле(в моём случае модуль называется ПолныеПрава) добавлем функцию:
Функция ПолучитьСписокАктивныхПользователей() Экспорт
СписокАктивныхЮзеров=ПолучитьСоединенияИнформационнойБазы();
Запрос=Новый Запрос;
Запрос.Текст="ВЫБРАТЬ
| "" "" КАК Пользователь,
| "" "" КАК ИмяКомпьютера";
ТЗ=Запрос.Выполнить().Выгрузить().СкопироватьКолонки();
для Каждого ЭлементМассива из СписокАктивныхЮзеров Цикл
если ЭлементМассива.ИмяПриложения="1CV8" тогда
НоваяСтрока=ТЗ.Добавить();
НоваяСтрока.Пользователь=ВРег(СокрЛП(ЭлементМассива.Пользователь.Имя));
НоваяСтрока.ИмяКомпьютера=ВРег(СокрЛП(ЭлементМассива.ИмяКомпьютера));
КонецЕсли;
КонецЦикла;
Возврат ТЗ;
КонецФункции
сделать напрямую Возврат ПолучитьСоединенияИнформационнойБазы(); нельзя ибо 1с запустится с ошибкой "Передача мутабельного значения...."
2) В модуле приложения в процедуре ПриНачалеРаботыСистемы() пишем следующее:
Если Не РольДоступна("ПолныеПрава") Тогда
НеРазрешатьПодключение=Ложь;
ИмяКомпа=ИмяКомпьютера();
АктивныеПользователи=ПолныеПрава.ПолучитьСписокАктивныхПользователей();
мЮзер=ВРег(СокрЛП(ПараметрыСеанса.ТекущийПользователь.Код));
КолСеанс=0;
Для каждого АктивныйПользователь Из АктивныеПользователи Цикл
Если АктивныйПользователь.Пользователь=мЮзер Тогда
Если АктивныйПользователь.ИмяКомпьютера=ИмяКомпа Тогда
КолСеанс=КолСеанс+1;
Если КолСеанс=2 Тогда
Предупреждение("Под пользователем "+Строка(АктивныйПользователь.Пользователь)+" на компьютере "+АктивныйПользователь.ИмяКомпьютера+" уже имеется соединение."+Символы.ПС+"Работа системы будет завершена.");
НеРазрешатьПодключение=Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НеРазрешатьПодключение Тогда
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецЕсли;
Как результат мы получили "Profit" все рады, все довольны)