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

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

Работа с веб-клиентом в 1С:Предприятие 8.3 предоставляет мобильность, но иногда оборачивается техническими сложностями, особенно в файловом режиме работы базы данных. Распространенная ситуация: пользователь корректно вышел из программы, закрыл браузер и даже перезагрузил компьютер, но его сеанс продолжает «висеть» в списке активных пользователей. В результате база оказывается заблокированной процессом веб-сервера (например, httpd.exe для Apache), что делает невозможным выполнение административных процедур, таких как обновление конфигурации или создание резервной копии.

Рассмотрим детально, почему это происходит и какие шаги мы можем предпринять для решения проблемы, даже если у нас ограничены права доступа к серверу.

Выясним причину: почему сеанс «зависает»?

Проанализируем механику работы веб-клиента. В отличие от тонкого или толстого клиента, веб-клиент взаимодействует с базой через модуль расширения веб-сервера. В файловом варианте этот модуль (библиотека wsap24.dll для Apache) сам выступает в роли клиента, который открывает файл 1Cv8.1CD.

Когда пользователь закрывает вкладку браузера или происходит сбой сети, веб-сервер не всегда мгновенно получает сигнал о разрыве соединения. Он продолжает удерживать сеанс открытым в течение времени, определенного внутренними тайм-аутами. Пока процесс веб-сервера держит «хендл» (дескриптор) файла базы данных, 1С считает сеанс активным. Ситуация усугубляется в версиях платформы 8.3.13–8.3.14, где наблюдались известные ошибки с утечкой сеансов, когда «спящие» соединения не завершались автоматически.

Способ 1. Программное завершение через внешнюю обработку

Если у нас есть доступ к Конфигуратору или мы можем запустить базу в режиме 1С:Предприятие под полными правами, мы попробуем принудительно «выбить» сеанс программным кодом. Стандартная кнопка «Завершить сеанс» в интерфейсе иногда игнорирует веб-соединения, поэтому воспользуемся методом ЗавершитьСеанс(). Чтобы не писать код вручную, можно воспользоваться готовой обработкой для автоматического закрытия зависших сеансов.

Разберем пример кода, который можно разместить во внешней обработке:


Процедура ЗавершитьСеансыВебКлиентов() Экспорт
    // Получаем список всех активных сеансов информационной базы
    МассивСеансов = ПолучитьСеансыИнформационнойБазы();
    
    Для Каждого ТекущийСеанс Из МассивСеансов Цикл
        // Проверяем, является ли сеанс веб-клиентом
        // Можно также фильтровать по имени пользователя: ТекущийСеанс.Пользователь.Имя
        Если ТекущийСеанс.ИмяПриложения = "WebClient" Тогда
            Попытка
                // Пытаемся принудительно закрыть соединение
                ЗавершитьСеанс(ТекущийСеанс);
                Сообщить("Сеанс пользователя " + ТекущийСеанс.Пользователь + " успешно завершен.");
            Исключение
                Сообщить("Не удалось завершить сеанс: " + ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Этот метод обращается напрямую к менеджеру кластера (в серверном варианте) или к механизму управления блокировками (в файловом), что эффективнее простого ожидания.

Способ 2. Регулировка параметров публикации в default.vrd

Если программное завершение не помогает, проблема кроется в настройках самого веб-сервера. Посмотрим на файл конфигурации публикации default.vrd, который обычно находится в каталоге публикации на сервере. В нем есть параметры, отвечающие за время жизни «заброшенных» сеансов.

Проанализируем структуру файла и найдем нужные атрибуты в узле point. Мы можем добавить или изменить параметры sessionMaxAge и sessionTimeout:


<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       base="/MyBase"
       ib="File="C:\Bases\MyBase";">
    <ws>
        <point name="Common" alias="common.1cws" enable="true"/>
    </ws>
    <!-- Устанавливаем минимальные тайм-ауты в секундах -->
    <standardTimeouts sessionMaxAge="60" sessionTimeout="30" />
</point>

Важный момент: установка малых значений заставит веб-сервер быстрее очищать неактивные соединения. После внесения изменений в default.vrd требуется время (обычно пару минут), чтобы веб-сервер перечитал файл и применил настройки к «повисшим» сеансам.

Способ 3. Попытка вытеснения сеанса («Метод двойника»)

Иногда система не дает завершить сеанс, потому что считает его «активно выполняющим операцию». Попробуем применить небольшую хитрость. Если в базе разрешено использование нескольких сеансов для одного пользователя, попробуем зайти в базу под тем же самым логином, но через Тонкий клиент или другой браузер в режиме инкогнито.

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

Способ 4. Работа с файловой системой и блокировками

Если программные методы внутри 1С бессильны, значит, файл базы данных жестко заблокирован процессом httpd.exe. Проанализируем ситуацию с правами доступа. Даже если у нас нет прав администратора для перезапуска службы, мы можем проверить наличие доступа к папке с базой данных.

  1. Проверим наличие файла 1Cv8.cdn в каталоге базы. Это файл блокировки. Если он есть, попробуем его удалить (если система позволит).
  2. Если база лежит на сетевом ресурсе (SMB), и у вас есть доступ к управлению этим ресурсом, можно попробовать через «Управление компьютером» -> «Общие папки» -> «Открытые файлы» найти файл 1Cv8.1CD и принудительно закрыть его для пользователя, под которым запущен веб-сервер.
  3. В крайнем случае, если у нас есть права на редактирование файлов в каталоге публикации, можно попробовать временно переименовать сам файл default.vrd. Это приведет к тому, что веб-сервер «потеряет» базу и может отпустить дескрипторы файлов.

Выясним, почему не помогает перезагрузка клиентского ПК

Частая ошибка — полагать, что перезагрузка компьютера бухгалтера поможет. В случае с веб-клиентом это бесполезно. Поскольку соединение с файлом .1CD устанавливает сервер, а не клиент, информация о сеансе хранится в оперативной памяти сервера и в таблицах базы данных. Для сервера клиент — это всего лишь набор HTTP-запросов. Пока сервер считает, что «клиент просто долго молчит», он будет держать базу открытой. Поэтому единственно верным направлением работы является воздействие на сторону сервера (через код 1С или настройки веб-публикации).

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

Подведем итог. Для борьбы с зависшими сеансами веб-клиента в условиях ограниченных прав:

← На главную