Как правильно завершить работу 1С при старте, если запускается веб-клиент?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке корпоративных решений на платформе 1С:Предприятие 8 часто возникает необходимость разграничить доступ пользователей в зависимости от способа их подключения. Например, вам может потребоваться запретить вход в систему через веб-клиент в период выполнения регламентных работ, ограничить доступ для определенных пользователей вне локальной сети или направить их в специализированную мобильную версию. В этой статье мы подробно разберем, как правильно реализовать условное завершение работы системы при запуске веб-клиента, где именно писать код и какие методы платформы использовать для корректного освобождения лицензий.

Где пишется код управления запуском системы?

Для того чтобы управлять процессом авторизации и запуска приложения, нам необходимо обратиться к глобальному модулю конфигурации — Модулю управляемого приложения. Открыть его можно через конфигуратор, нажав правой кнопкой мыши на корневой элемент дерева метаданных конфигурации и выбрав пункт «Открыть модуль управляемого приложения».

В этом модуле система предоставляет нам два основных клиентских обработчика событий, которые выполняются при старте приложения:

  1. ПередНачаломРаботыСистемы(Отказ) — вызывается в самом начале процесса запуска, еще до того, как пользователю будет продемонстрирован основной интерфейс программы. Это идеальное место для проведения проверок безопасности и контроля доступа.
  2. ПриНачалеРаботыСистемы() — вызывается, когда основной интерфейс приложения уже успешно загружен и отображен пользователю. Этот обработчик обычно используется для запуска фоновых процессов, открытия начальных страниц или вывода информационных сообщений.

Выясним, какой из этих методов лучше подходит для нашей задачи, и проанализируем различные сценарии завершения сеанса.

Штатный способ отмены запуска (рекомендуемый метод)

Вместо того чтобы принудительно «убивать» процесс 1С программными методами во время его инициализации, разработчики платформы предусмотрели штатный механизм отмены запуска. Наиболее корректным и безопасным способом прервать сессию веб-клиента является использование параметра Отказ в процедуре ПередНачаломРаботыСистемы.

Рассмотрим практический пример реализации этого подхода:


Процедура ПередНачаломРаботыСистемы(Отказ)
    
    #Если ВебКлиент Тогда
    
    // Проводим анализ условий, при которых вход должен быть заблокирован
    Если Не РазрешенДоступЧерезВебКлиент() Тогда
        
        ПоказатьПредупреждение(, "Вход в систему через веб-клиент временно ограничен администратором.");
        Отказ = Истина;
        
    КонецЕсли;
    
    #КонецЕсли

КонецПроцедуры

Почему этот способ является наиболее предпочтительным?

  1. Отсутствие визуального «мерцания»: приложение завершает свою работу до того, как начнет отрисовывать главное окно интерфейса. Пользователь не увидит открывающиеся и тут же закрывающиеся панели.
  2. Экономия ресурсов сервера: отмена запуска происходит на самом раннем этапе. Платформа не тратит процессорное время и оперативную память на полную инициализацию окружения клиента.
  3. Корректное освобождение лицензий: при установке параметра Отказ = Истина веб-сервер и кластер 1С сразу же закрывают сеанс связи, возвращая клиентскую лицензию в пул свободных.

Принудительное завершение работы: в чем разница методов?

Иногда логика приложения устроена так, что решение о закрытии программы принимается уже после ее полного запуска (например, по результатам анализа данных, полученных из открытых форм в процедуре ПриНачалеРаботыСистемы). В этом случае отменить запуск через параметр Отказ уже невозможно. Нам приходится использовать специализированные методы принудительного закрытия системы.

Давайте разберем ключевые различия между двумя основными методами закрытия сеанса:

Метод 1: ЗавершитьРаботуСистемы

Этот метод представляет собой «мягкий» (штатный) способ выхода из программы. Синтаксис метода выглядит следующим образом:

ЗавершитьРаботуСистемы(<ЗапрашиватьВозможность>, <ТекстУведомления>)

Проанализируем особенности его работы:

  1. Проверка несохраненных данных: если у пользователя открыты формы с измененными данными, система автоматически предложит сохранить их перед выходом (если первый параметр установлен в значение Истина).
  2. Вызов обработчиков закрытия: метод последовательно запускает процедуру ПередЗавершениемРаботыСистемы, в которой другие модули конфигурации или подключенные расширения могут заблокировать закрытие программы.
  3. Безусловный выход: если вы передадите в первый параметр значение Ложь, система закроется без лишних вопросов к пользователю, однако все встроенные обработчики завершения все равно будут выполнены.

Пример программного кода для «мягкого» завершения работы:


Процедура ПриНачалеРаботыСистемы()
    
    #Если ВебКлиент Тогда
    
    // Если критические обновления не применились, закрываем систему без лишних вопросов
    Если ТребуетсяЭкстренныйВыход() Тогда
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
    
    #КонецЕсли

КонецПроцедуры

Метод 2: ПрекратитьРаботуСистемы

Этот метод осуществляет «жесткое» (аварийное) прерывание работы процесса. Он закрывает клиентское приложение мгновенно и безусловно.

Важные особенности использования метода:

Пример вызова жесткого прекращения сессии:


#Если ВебКлиент Тогда
// Немедленное прекращение работы процесса без вызова обработчиков
ПрекратитьРаботуСистемы();
#КонецЕсли

Специфика работы веб-клиента 1С:Предприятия

Разработка под веб-клиент накладывает ряд существенных ограничений и особенностей, которые необходимо учитывать при написании логики закрытия приложения:

  1. Инструкции препроцессора: Обратите внимание на использование конструкции #Если ВебКлиент Тогда ... #КонецЕсли. Это инструкции препроцессора, которые анализируются платформой на этапе компиляции модулей. Код, написанный внутри этой директивы, физически не компилируется и не передается на исполнение тонкому или толстому клиенту. Это позволяет избежать лишних накладных расходов и проверок на классических десктопных клиентах.
  2. Проблема «зависших» сеансов на веб-сервере: Веб-клиент работает по протоколу HTTP/HTTPS поверх веб-серверов (например, Apache или IIS). Если работа веб-клиента завершается аварийно (произошла ошибка исполнения, завис скрипт или пользователь просто закрыл вкладку в браузере), веб-сервер не всегда может мгновенно уведомить об этом кластер серверов 1С. В результате сеанс пользователя на сервере 1С переходит в статус «спящего». Такие сеансы продолжают удерживать клиентские лицензии. По умолчанию время ожидания (таймаут) спящего сеанса составляет 20 минут. Использование штатного отказа через Отказ = Истина или вызова ЗавершитьРаботуСистемы(Ложь) гарантирует отправку корректного системного сигнала на веб-сервер для мгновенного удаления сессии и освобождения занятой лицензии.

Резюме и рекомендации

Подведем итоги нашего анализа. Для надежной и производительной работы вашей конфигурации придерживайтесь следующих правил:

← На главную