При работе пользователей в 1С через веб-клиент часто возникает крайне неприятная ситуация. Стоит пользователю обновить страницу в браузере (нажатием клавиши F5 или кнопки обновления), как его текущий сеанс «зависает» на сервере вместе со всеми открытыми и заблокированными документами. При этом браузер открывает новую сессию, которая требует еще одну клиентскую лицензию. В результате лицензии быстро заканчиваются, а пользователи не могут редактировать документы, так как они остаются заблокированными в их же предыдущих «призрачных» сеансах.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем её технические причины и рассмотрим по шагам все возможные способы её решения — от быстрой настройки параметров базы данных до тонкого конфигурирования веб-сервера IIS и кластера 1С.
Официальная техническая поддержка фирмы 1С подтверждает, что данное поведение веб-клиента связано со специализированной ошибкой платформы под номером 10224146. Суть ошибки заключается в том, что при определенных условиях (например, при резком обновлении или закрытии вкладки браузера) модуль веб-клиента не успевает отправить на веб-сервер корректное служебное сообщение о завершении работы. Веб-сервер и кластер 1С продолжают считать старый сеанс активным, удерживая под него лицензию и блокировки объектов.
Давайте подробно разберем, как минимизировать последствия этого сбоя и полностью устранить проблему на вашем сервере.
Если быстрое обновление платформы на сервере невозможно, мы можем значительно сократить время жизни зависших сеансов. По умолчанию в 1С установлены достаточно большие таймауты, из-за чего «призрачные» сессии могут висеть часами. Изменим эти параметры.
Выполним следующие шаги для настройки параметров информационной базы:
120 до 300 секунд (2–5 минут).120 до 300 секунд.После уменьшения этих параметров зависший из-за обновления страницы сеанс «уснет» уже через пару минут, вернув лицензию в пул, а затем быстро закроется, сняв блокировки с документов.
Веб-клиент 1С:Предприятия спроектирован так, чтобы поддерживать постоянное полнодуплексное соединение с сервером через технологию WebSocket. Если в операционной системе Windows Server на веб-сервере IIS не установлена соответствующая роль, веб-клиент вынужден использовать устаревший механизм длинных HTTP-запросов (long polling). При этом сервер гораздо хуже определяет факт закрытия или обновления страницы пользователем.
Для исправления ситуации выполним установку роли:
Часто все опубликованные информационные базы используют один стандартный пул приложений в IIS (DefaultAppPool). Если в одной из баз происходит массовое зависание сеансов или утечка памяти, это лавинообразно влияет на соседние базы. Мы рекомендуем изолировать каждую рабочую базу в индивидуальный пул.
Разберем процесс настройки по шагам:
False для предотвращения лишних блокировок системных ресурсов.Обратим внимание на то, как именно настроена выдача лицензий в свойствах информационной базы в консоли администрирования кластера 1С. Параметр Разрешить выдачу лицензий сервером 1С:Предприятия существенно влияет на расход лицензий:
Если вам требуется радикальное решение «здесь и сейчас», а стандартные таймауты не помогают, можно настроить автоматическое программное отключение дублирующихся сеансов одного и того же пользователя с помощью встроенного языка 1С.
Рассмотрим пример кода, который можно разместить в модуле управляемого приложения в обработчике события ПриНачалеРаботыСистемы. Код через COM-соединение или встроенные средства администрирования находит более ранние активные сеансы текущего пользователя и принудительно завершает их:
Процедура ПриНачалеРаботыСистемы()
#Если ТонкийКлиент Или ВебКлиент Тогда
// Получаем имя текущего пользователя системы
ИмяПользователя1С = ИмяПользователя();
// Получаем массив сеансов нашей информационной базы
СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы();
ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы();
Для Каждого Сеанс Из СеансыИнформационнойБазы Цикл
// Ищем сеансы того же пользователя, открытые ранее текущего сеанса
Если Сеанс.ИмяПользователя = ИмяПользователя1С
И Сеанс.НомерСеанса <> ТекущийСеанс.НомерСеанса
И Сеанс.ИмяПриложения = "WebClient" Тогда
Попытка
// Завершаем старый зависший сеанс веб-клиента
ОтключитьСеанс(Сеанс);
Исключение
// Запись в журнал регистрации при ошибке отключения
ЗаписьЖурналаРегистрации("ОчисткаСеансов",
УровеньЖурналаРегистрации.Предупреждение,,,
"Не удалось отключить старый сеанс №" + Сеанс.НомерСеанса);
КонецПопытки;
КонецЕсли;
КонецЦикла;
#КонецЕсли;
КонецПроцедуры
Этот простой механизм гарантирует, что при открытии нового веб-сеанса (в том числе при обновлении страницы браузера) все предыдущие незакрытые веб-сеансы этого же сотрудника будут автоматически уничтожены сервером, освобождая лицензии и снимая блокировки с документов.
Несмотря на то, что изменение параметров засыпания и настройка веб-сервера IIS отлично помогают нивелировать проблему, они являются лишь обходными путями (workaround). Для полного и окончательного исправления ошибки 10224146 необходимо обновить платформу «1С:Предприятие» на сервере до актуальных стабильных релизов (рекомендуется использовать современные сборки веток 8.3.18, 8.3.20 и выше). В новых версиях платформы разработчики оптимизировали работу модуля расширения веб-сервера, и проблема с зависанием лицензий при обновлении страниц была устранена.