В процессе разработки и администрирования баз данных на платформе «1С:Предприятие» часто возникает задача контроля входа пользователей в систему. Например, необходимо ограничить одновременный вход под одной учетной записью, запретить авторизацию новых пользователей при превышении лимита лицензий или выполнить определенные проверки безопасности. Для реализации этого функционала программисту требуется решить две основные подзадачи: правильно получить список текущих сеансов информационной базы при старте программы и настроить среду отладки так, чтобы можно было протестировать этот алгоритм под разными учетными записями одновременно.
В этой статье мы подробно разберем, как получить список активных пользователей, как правильно прервать сеанс работы программы в случае невыполнения условий входа, а также как отлаживать код сразу в нескольких запущенных сеансах в файловом режиме работы.
---
Для решения задачи определения пользователей, у которых в данный момент открыта информационная база, в платформе «1С:Предприятие 8» предусмотрена специальная встроенная функция ПолучитьСеансыИнформационнойБазы(). Данный метод возвращает массив объектов типа СеансИнформационнойБазы. Каждый элемент этого массива содержит информацию о конкретном активном соединении, включая имя пользователя, компьютер, время начала работы и другие параметры сеанса.
Однако при использовании этой функции разработчики часто сталкиваются с проблемой ограничения прав доступа. По умолчанию вызов метода ПолучитьСеансыИнформационнойБазы() обычным пользователем, у которого нет административных прав (а именно роли «Администратор» или права «Активные пользователи» / ActiveUsers), приведет к аварийному завершению работы программы с ошибкой нарушения прав доступа.
Чтобы обойти это ограничение и позволить любому пользователю при входе проверять список активных сеансов, мы должны выполнять опрос базы данных в привилегированном режиме на стороне сервера. Разберем этот механизм по шагам:
РаботаССеансамиПереопределяемый).Рассмотрим пример кода в нашем привилегированном общем модуле:
Функция ПолучитьСписокАктивныхПользователей() Экспорт
МассивСеансов = ПолучитьСеансыИнформационнойБазы();
СписокПользователей = Новый Массив;
Для Каждого ТекущийСеанс Из МассивСеансов Цикл
// Исключаем из списка фоновые задания, если проверяем только интерактивных пользователей
Если ТекущийСеанс.ИмяПриложения = "1CV8" Или ТекущийСеанс.ИмяПриложения = "1CV8C" Тогда
ИмяПользователя = ТекущийСеанс.Пользователь.Имя;
Если ЗначениеЗаполнено(ИмяПользователя) Тогда
СписокПользователей.Добавить(ИмяПользователя);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат СписокПользователей;
КонецФункции
Если ваша конфигурация разработана на базе Библиотеки стандартных подсистем (БСП), вам не нужно писать этот код с нуля. В составе БСП есть готовый программный интерфейс для работы с соединениями. Мы можем использовать встроенную функцию из общего модуля БСП:
СоединенияИБ.АктивныеСеансы()
Этот метод возвращает готовую таблицу значений, содержащую информацию обо всех сеансах, запущенных в системе, и его вызов уже оптимизирован с точки зрения прав доступа и производительности.
---
Многие начинающие разработчики пытаются реализовать проверку прав на вход и выталкивание пользователя в процедуре ПриНачалеРаботыСистемы() модуля управляемого приложения. Однако это архитектурно неверно по двум причинам:
ПриНачалеРаботыСистемы() вызывается, когда главное окно программы уже открыто и интерфейс полностью инициализирован.Отказ, поэтому для закрытия программы придется вызывать жесткий принудительный метод ЗавершитьРаботуСистемы(Ложь), что может приводить к визуальному «миганию» интерфейса и некорректному завершению сопутствующих процессов.Для корректного прерывания сеанса необходимо использовать предопределенное событие модуля управляемого приложения ПередНачаломРаботыСистемы(Отказ). Данное событие отрабатывает до открытия основного интерфейса программы. Если в ходе проверок мы установим параметр Отказ = Истина, платформа штатно завершит процесс запуска 1С без открытия окон.
Проанализируем пример реализации такой проверки в модуле управляемого приложения:
Процедура ПередНачаломРаботыСистемы(Отказ)
// Проверяем, запущена ли система в интерактивном режиме
#Если Клиент Тогда
// Вызываем нашу привилегированную функцию получения пользователей
АктивныеПользователи = РаботаССеансамиПереопределяемый.ПолучитьСписокАктивныхПользователей();
ИмяТекущегоПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
КоличествоВхождений = 0;
Для Каждого ПользовательИзСписка Из АктивныеПользователи Цикл
Если ВРег(ПользовательИзСписка) = ВРег(ИмяТекущегоПользователя) Тогда
КоличествоВхождений = КоличествоВхождений + 1;
КонецЕсли;
КонецЦикла;
// Например, запрещаем повторный вход под одной учетной записью
Если КоличествоВхождений > 1 Тогда
ПоказатьПредупреждение(, "Вход в систему заблокирован: пользователь с таким именем уже работает в базе!");
Отказ = Истина;
КонецЕсли;
#КонецЕсли
КонецПроцедуры
В случае работы с современными типовыми конфигурациями на БСП (такими как 1С:ERP, УТ 11, БП 3.0), напрямую редактировать модуль управляемого приложения не рекомендуется. Вместо этого следует использовать переопределяемые модули БСП. Нам потребуется процедура:
ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы(Параметры)
В этой процедуре БСП передает входящим аргументом структуру Параметры. Чтобы отменить запуск программы и корректно закрыть сеанс, разработчику достаточно установить свойство Параметры.Отказ = Истина и заполнить описание ошибки для пользователя в сопутствующих свойствах структуры.
---
Часто разработчики сталкиваются с трудностью при тестировании механизмов контроля сеансов: при запуске системы через конфигуратор (по клавише F5) отладка работает только для первого пользователя. При попытке запустить второй сеанс 1С:Предприятия под другой учетной записью точки останова в коде перестают срабатывать.
Выясним причину этого поведения. По умолчанию конфигуратор автоматически подключает отладчик только к тому сеансу, который был запущен непосредственно из него. Прочие сеансы, запускаемые вручную через список баз, остаются без подключенного отладчика.
Разберем по шагам, как настроить одновременную отладку нескольких сеансов в файловом режиме:
После выполнения этих простых шагов точки останова (включая точку останова в процедуре ПередНачаломРаботыСистемы()) начнут корректно срабатывать во всех подключенных сеансах, что позволит вам полностью протестировать разработанную логику блокировки соединений.