Почему веб-клиент 1С расходует лишние лицензии при обновлении страницы в браузере и как это исправить?

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

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

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем её технические причины и рассмотрим по шагам все возможные способы её решения — от быстрой настройки параметров базы данных до тонкого конфигурирования веб-сервера IIS и кластера 1С.

Причина проблемы: баг платформы 10224146

Официальная техническая поддержка фирмы 1С подтверждает, что данное поведение веб-клиента связано со специализированной ошибкой платформы под номером 10224146. Суть ошибки заключается в том, что при определенных условиях (например, при резком обновлении или закрытии вкладки браузера) модуль веб-клиента не успевает отправить на веб-сервер корректное служебное сообщение о завершении работы. Веб-сервер и кластер 1С продолжают считать старый сеанс активным, удерживая под него лицензию и блокировки объектов.

Давайте подробно разберем, как минимизировать последствия этого сбоя и полностью устранить проблему на вашем сервере.

Способ 1. Настройка времени «сна» пассивных сеансов в 1С

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

Выполним следующие шаги для настройки параметров информационной базы:

  1. Запустим конфигуратор нужной информационной базы от имени администратора.
  2. В главном меню перейдем в раздел Администрирование и выберем пункт Параметры информационной базы....
  3. Найдем в открывшемся окне два ключевых параметра:
    • Время засыпания пассивного сеанса (по умолчанию может быть равно 1200 секундам). Это время, через которое неактивный сеанс засыпает, освобождая занятую лицензию. Установим его в значение от 120 до 300 секунд (2–5 минут).
    • Время завершения спящего сеанса (по умолчанию может быть равно 86400 секундам). Это время, по истечении которого «спящий» сеанс полностью удаляется с сервера, снимая все блокировки данных. Установим его в значение от 120 до 300 секунд.
  4. Нажмем кнопку Применить для сохранения настроек.

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

Способ 2. Включение роли WebSocket в веб-сервере IIS

Веб-клиент 1С:Предприятия спроектирован так, чтобы поддерживать постоянное полнодуплексное соединение с сервером через технологию WebSocket. Если в операционной системе Windows Server на веб-сервере IIS не установлена соответствующая роль, веб-клиент вынужден использовать устаревший механизм длинных HTTP-запросов (long polling). При этом сервер гораздо хуже определяет факт закрытия или обновления страницы пользователем.

Для исправления ситуации выполним установку роли:

  1. Откроем Диспетчер серверов (Server Manager) на сервере IIS.
  2. Выберем Добавить роли и компоненты (Add Roles and Features).
  3. Дойдем до шага выбора ролей сервера и развернем дерево: Веб-сервер (IIS) -> Веб-сервер -> Разработка приложений (Application Development).
  4. Установим флажок напротив пункта Протокол WebSocket (WebSocket Protocol).
  5. Завершим установку мастера и обязательно перезапустим службу веб-сервера IIS.

Способ 3. Изоляция баз в пулах приложений IIS

Часто все опубликованные информационные базы используют один стандартный пул приложений в IIS (DefaultAppPool). Если в одной из баз происходит массовое зависание сеансов или утечка памяти, это лавинообразно влияет на соседние базы. Мы рекомендуем изолировать каждую рабочую базу в индивидуальный пул.

Разберем процесс настройки по шагам:

  1. Откроем консоль управления Диспетчер служб IIS.
  2. В левом дереве выберем раздел Пулы приложений (Application Pools) и нажмем в правой панели Добавить пул приложений....
  3. Укажем имя пула (например, имя вашей базы) и версию .NET (обычно оставляют без управляемого кода), нажмите ОК.
  4. Перейдем к разделу Сайты -> Default Web Site, найдем виртуальный каталог нашей опубликованной базы 1С.
  5. Нажмем на него правой кнопкой мыши и выберем Управление приложением -> Дополнительные параметры....
  6. В поле Пул приложений выберем только что созданный нами индивидуальный пул.
  7. В настройках самого пула приложений (через «Дополнительные параметры» пула) рекомендуется найти параметр Загрузить профиль пользователя (Load User Profile) и перевести его в значение False для предотвращения лишних блокировок системных ресурсов.

Способ 4. Изменение логики раздачи лицензий сервером

Обратим внимание на то, как именно настроена выдача лицензий в свойствах информационной базы в консоли администрирования кластера 1С. Параметр Разрешить выдачу лицензий сервером 1С:Предприятия существенно влияет на расход лицензий:

Способ 5. Программный контроль сеансов (для разработчиков)

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

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


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

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

Окончательное решение проблемы

Несмотря на то, что изменение параметров засыпания и настройка веб-сервера IIS отлично помогают нивелировать проблему, они являются лишь обходными путями (workaround). Для полного и окончательного исправления ошибки 10224146 необходимо обновить платформу «1С:Предприятие» на сервере до актуальных стабильных релизов (рекомендуется использовать современные сборки веток 8.3.18, 8.3.20 и выше). В новых версиях платформы разработчики оптимизировали работу модуля расширения веб-сервера, и проблема с зависанием лицензий при обновлении страниц была устранена.

← На главную