При разработке корпоративных решений на платформе 1С:Предприятие 8 часто возникает необходимость разграничить доступ пользователей в зависимости от способа их подключения. Например, вам может потребоваться запретить вход в систему через веб-клиент в период выполнения регламентных работ, ограничить доступ для определенных пользователей вне локальной сети или направить их в специализированную мобильную версию. В этой статье мы подробно разберем, как правильно реализовать условное завершение работы системы при запуске веб-клиента, где именно писать код и какие методы платформы использовать для корректного освобождения лицензий.
Для того чтобы управлять процессом авторизации и запуска приложения, нам необходимо обратиться к глобальному модулю конфигурации — Модулю управляемого приложения. Открыть его можно через конфигуратор, нажав правой кнопкой мыши на корневой элемент дерева метаданных конфигурации и выбрав пункт «Открыть модуль управляемого приложения».
В этом модуле система предоставляет нам два основных клиентских обработчика событий, которые выполняются при старте приложения:
ПередНачаломРаботыСистемы(Отказ) — вызывается в самом начале процесса запуска, еще до того, как пользователю будет продемонстрирован основной интерфейс программы. Это идеальное место для проведения проверок безопасности и контроля доступа.ПриНачалеРаботыСистемы() — вызывается, когда основной интерфейс приложения уже успешно загружен и отображен пользователю. Этот обработчик обычно используется для запуска фоновых процессов, открытия начальных страниц или вывода информационных сообщений.Выясним, какой из этих методов лучше подходит для нашей задачи, и проанализируем различные сценарии завершения сеанса.
Вместо того чтобы принудительно «убивать» процесс 1С программными методами во время его инициализации, разработчики платформы предусмотрели штатный механизм отмены запуска. Наиболее корректным и безопасным способом прервать сессию веб-клиента является использование параметра Отказ в процедуре ПередНачаломРаботыСистемы.
Рассмотрим практический пример реализации этого подхода:
Процедура ПередНачаломРаботыСистемы(Отказ)
#Если ВебКлиент Тогда
// Проводим анализ условий, при которых вход должен быть заблокирован
Если Не РазрешенДоступЧерезВебКлиент() Тогда
ПоказатьПредупреждение(, "Вход в систему через веб-клиент временно ограничен администратором.");
Отказ = Истина;
КонецЕсли;
#КонецЕсли
КонецПроцедуры
Почему этот способ является наиболее предпочтительным?
Отказ = Истина веб-сервер и кластер 1С сразу же закрывают сеанс связи, возвращая клиентскую лицензию в пул свободных.Иногда логика приложения устроена так, что решение о закрытии программы принимается уже после ее полного запуска (например, по результатам анализа данных, полученных из открытых форм в процедуре ПриНачалеРаботыСистемы). В этом случае отменить запуск через параметр Отказ уже невозможно. Нам приходится использовать специализированные методы принудительного закрытия системы.
Давайте разберем ключевые различия между двумя основными методами закрытия сеанса:
Этот метод представляет собой «мягкий» (штатный) способ выхода из программы. Синтаксис метода выглядит следующим образом:
ЗавершитьРаботуСистемы(<ЗапрашиватьВозможность>, <ТекстУведомления>)
Проанализируем особенности его работы:
Истина).ПередЗавершениемРаботыСистемы, в которой другие модули конфигурации или подключенные расширения могут заблокировать закрытие программы.Ложь, система закроется без лишних вопросов к пользователю, однако все встроенные обработчики завершения все равно будут выполнены.Пример программного кода для «мягкого» завершения работы:
Процедура ПриНачалеРаботыСистемы()
#Если ВебКлиент Тогда
// Если критические обновления не применились, закрываем систему без лишних вопросов
Если ТребуетсяЭкстренныйВыход() Тогда
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
#КонецЕсли
КонецПроцедуры
Этот метод осуществляет «жесткое» (аварийное) прерывание работы процесса. Он закрывает клиентское приложение мгновенно и безусловно.
Важные особенности использования метода:
ПередЗавершениемРаботыСистемы. Ни один модуль конфигурации не сможет остановить или перехватить этот процесс.Пример вызова жесткого прекращения сессии:
#Если ВебКлиент Тогда
// Немедленное прекращение работы процесса без вызова обработчиков
ПрекратитьРаботуСистемы();
#КонецЕсли
Разработка под веб-клиент накладывает ряд существенных ограничений и особенностей, которые необходимо учитывать при написании логики закрытия приложения:
#Если ВебКлиент Тогда ... #КонецЕсли. Это инструкции препроцессора, которые анализируются платформой на этапе компиляции модулей. Код, написанный внутри этой директивы, физически не компилируется и не передается на исполнение тонкому или толстому клиенту. Это позволяет избежать лишних накладных расходов и проверок на классических десктопных клиентах.Отказ = Истина или вызова ЗавершитьРаботуСистемы(Ложь) гарантирует отправку корректного системного сигнала на веб-сервер для мгновенного удаления сессии и освобождения занятой лицензии.Подведем итоги нашего анализа. Для надежной и производительной работы вашей конфигурации придерживайтесь следующих правил:
ПередНачаломРаботыСистемы и установке параметра Отказ = Истина. Это самый чистый, экономичный и безопасный способ отсечь нежелательные подключения.ЗавершитьРаботуСистемы(Ложь) для мягкого, но уверенного выхода без лишних диалоговых окон.ПрекратитьРаботуСистемы только в исключительных случаях, когда продолжение сеанса несет угрозу безопасности.#Если ВебКлиент Тогда, чтобы оптимизировать код для остальных типов клиентских приложений.