Работа с веб-клиентом в 1С:Предприятие 8.3 предоставляет мобильность, но иногда оборачивается техническими сложностями, особенно в файловом режиме работы базы данных. Распространенная ситуация: пользователь корректно вышел из программы, закрыл браузер и даже перезагрузил компьютер, но его сеанс продолжает «висеть» в списке активных пользователей. В результате база оказывается заблокированной процессом веб-сервера (например, httpd.exe для Apache), что делает невозможным выполнение административных процедур, таких как обновление конфигурации или создание резервной копии.
Рассмотрим детально, почему это происходит и какие шаги мы можем предпринять для решения проблемы, даже если у нас ограничены права доступа к серверу.
Проанализируем механику работы веб-клиента. В отличие от тонкого или толстого клиента, веб-клиент взаимодействует с базой через модуль расширения веб-сервера. В файловом варианте этот модуль (библиотека wsap24.dll для Apache) сам выступает в роли клиента, который открывает файл 1Cv8.1CD.
Когда пользователь закрывает вкладку браузера или происходит сбой сети, веб-сервер не всегда мгновенно получает сигнал о разрыве соединения. Он продолжает удерживать сеанс открытым в течение времени, определенного внутренними тайм-аутами. Пока процесс веб-сервера держит «хендл» (дескриптор) файла базы данных, 1С считает сеанс активным. Ситуация усугубляется в версиях платформы 8.3.13–8.3.14, где наблюдались известные ошибки с утечкой сеансов, когда «спящие» соединения не завершались автоматически.
Если у нас есть доступ к Конфигуратору или мы можем запустить базу в режиме 1С:Предприятие под полными правами, мы попробуем принудительно «выбить» сеанс программным кодом. Стандартная кнопка «Завершить сеанс» в интерфейсе иногда игнорирует веб-соединения, поэтому воспользуемся методом ЗавершитьСеанс(). Чтобы не писать код вручную, можно воспользоваться готовой обработкой для автоматического закрытия зависших сеансов.
Разберем пример кода, который можно разместить во внешней обработке:
Процедура ЗавершитьСеансыВебКлиентов() Экспорт
// Получаем список всех активных сеансов информационной базы
МассивСеансов = ПолучитьСеансыИнформационнойБазы();
Для Каждого ТекущийСеанс Из МассивСеансов Цикл
// Проверяем, является ли сеанс веб-клиентом
// Можно также фильтровать по имени пользователя: ТекущийСеанс.Пользователь.Имя
Если ТекущийСеанс.ИмяПриложения = "WebClient" Тогда
Попытка
// Пытаемся принудительно закрыть соединение
ЗавершитьСеанс(ТекущийСеанс);
Сообщить("Сеанс пользователя " + ТекущийСеанс.Пользователь + " успешно завершен.");
Исключение
Сообщить("Не удалось завершить сеанс: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот метод обращается напрямую к менеджеру кластера (в серверном варианте) или к механизму управления блокировками (в файловом), что эффективнее простого ожидания.
Если программное завершение не помогает, проблема кроется в настройках самого веб-сервера. Посмотрим на файл конфигурации публикации 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 требуется время (обычно пару минут), чтобы веб-сервер перечитал файл и применил настройки к «повисшим» сеансам.
Иногда система не дает завершить сеанс, потому что считает его «активно выполняющим операцию». Попробуем применить небольшую хитрость. Если в базе разрешено использование нескольких сеансов для одного пользователя, попробуем зайти в базу под тем же самым логином, но через Тонкий клиент или другой браузер в режиме инкогнито.
В некоторых случаях 1С, обнаружив повторный вход, может корректно переинициализировать таблицу активных пользователей и «подцепить» старый зависший идентификатор, что позволит закрыть его при выходе из нового сеанса. Также можно попробовать установить в 1С признак Блокировка установки соединений через консоль управления, указав код разрешения. Это действие иногда принудительно обрывает связи, которые не заняты транзакциями. При необходимости управлять блокировками и сеансами в едином интерфейсе можно использовать комплексную обработку для администрирования баз данных.
Если программные методы внутри 1С бессильны, значит, файл базы данных жестко заблокирован процессом httpd.exe. Проанализируем ситуацию с правами доступа. Даже если у нас нет прав администратора для перезапуска службы, мы можем проверить наличие доступа к папке с базой данных.
1Cv8.cdn в каталоге базы. Это файл блокировки. Если он есть, попробуем его удалить (если система позволит).1Cv8.1CD и принудительно закрыть его для пользователя, под которым запущен веб-сервер.default.vrd. Это приведет к тому, что веб-сервер «потеряет» базу и может отпустить дескрипторы файлов.Частая ошибка — полагать, что перезагрузка компьютера бухгалтера поможет. В случае с веб-клиентом это бесполезно. Поскольку соединение с файлом .1CD устанавливает сервер, а не клиент, информация о сеансе хранится в оперативной памяти сервера и в таблицах базы данных. Для сервера клиент — это всего лишь набор HTTP-запросов. Пока сервер считает, что «клиент просто долго молчит», он будет держать базу открытой. Поэтому единственно верным направлением работы является воздействие на сторону сервера (через код 1С или настройки веб-публикации).
Подведем итог. Для борьбы с зависшими сеансами веб-клиента в условиях ограниченных прав:
ЗавершитьСеанс() через внешнюю обработку.sessionTimeout в файле публикации default.vrd для предотвращения подобных ситуаций в будущем.