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

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

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

Выясним причину: почему пропадает кнопка завершения сеансов?

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

  1. Потеря монопольного контекста: Начиная с версии 8.3.15, механизмы блокировки базы при обновлении стали более чувствительными. Если между конфигуратором и сервером произошел кратковременный разрыв связи или возникла ошибка в кэше метаданных, конфигуратор «считает», что он больше не контролирует состояние кластера. В этом случае он предлагает перезапуск для восстановления чистого сеанса связи.
  2. Спящие сеансы веб-сервисов: HTTP-сервисы используют механизм пула соединений. Даже если вы закрыли вкладку в браузере или остановили отладку, сеанс в консоли администрирования может оставаться в статусе «Спящий». Платформа иногда ошибочно интерпретирует такие сеансы как критические блокировки, которые невозможно устранить программно из интерфейса диалога обновления.
  3. Особенности расширений: Активное использование расширений конфигурации вносит свои коррективы. Если изменения затрагивают объекты, которые заимствованы в расширениях, механизм динамического обновления может блокироваться, вызывая требование полного перезапуска конфигуратора.

Решение 1: Настройка времени жизни сессий в веб-сервере

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

Найдем в файле default.vrd (обычно он находится в каталоге публикации на IIS или Apache) параметры управления сессиями. Нам интересен атрибут sessionMaxAge. Посмотрим на пример настройки:


<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="Srvr="ServerName";Ref="BaseName";">
    <httpServices publishByDefault="true">
        <sessionMaxAge>20</sessionMaxAge>
        <sessionReuse>DontUse</sessionReuse>
    </httpServices>
</point>

В данном примере мы устанавливаем sessionMaxAge в значение 20 секунд. Это означает, что после завершения запроса сессия будет храниться в пуле не более 20 секунд, после чего сервер 1С сможет её корректно завершить. Параметр sessionReuse со значением DontUse запрещает повторное использование сессий, что полезно именно в процессе активной разработки и отладки, чтобы каждое обращение создавало «чистый» контекст.

Решение 2: Очистка серверных данных и кэша

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

На сервере 1С необходимо выполнить следующие действия:

  1. Остановить службу 1C:Enterprise 8.3 Server Agent.
  2. Перейти в каталог описания кластера (по умолчанию это C:\Program Files\1cv8\srvinfo).
  3. Найти папку snccntxt. Именно здесь хранятся данные о сеансах и их контекстах.
  4. Удалить содержимое этой папки. Важно: это приведет к сбросу всех активных сеансов во всех базах данного кластера.
  5. Запустить службу заново.

После этой процедуры конфигуратор должен восстановить корректное взаимодействие с менеджером сеансов кластера.

Решение 3: Автоматизация завершения сеансов через COM-соединение

Чтобы не заходить каждый раз в консоль администрирования и не выполнять рутинные действия, мы можем использовать скрипт на языке VBScript или PowerShell, который будет принудительно завершать все сеансы в базе перед нажатием F7. Рассмотрим пример скрипта, использующего V83.ComConnector:


Dim Connector, Agent, Cluster, Process, Base, Sessions, Session
Set Connector = CreateObject("V83.ComConnector")
Set Agent = Connector.ConnectAgent("ServerName")
Clusters = Agent.GetClusters()

For Each Cluster In Clusters
    Agent.Authenticate Cluster, "", ""
    Processes = Agent.GetWorkingProcesses(Cluster)
    For Each Process In Processes
        ' Здесь можно добавить логику поиска нужной базы
        ' Завершаем сеансы для конкретной информационной базы
        Sessions = Agent.GetSessions(Cluster)
        For Each Session In Sessions
            If Session.InfoBase.Name = "MyBaseName" Then
                Agent.TerminateSession Cluster, Session
            End If
        Next
    Next
Next

Создайте такой файл с расширением .vbs и запускайте его перед обновлением конфигурации. Это гарантированно очистит список активных соединений, и конфигуратор не будет выдавать окно о необходимости перезапуска.

Решение 4: Настройка протокола отладки

Проанализируем настройки отладки в самом конфигураторе. В некоторых случаях использование старого протокола TCP при работе с веб-сервисами приводит к «залипанию» сессий в состоянии ожидания ответа от отладчика. Попробуем изменить протокол на HTTP.

Для этого перейдем в меню: Сервис — Параметры — Отладка. Выберем вариант «Использовать протокол HTTP». Также убедимся, что установлен флаг «Начинать отладку при запуске». Это позволяет платформе более гибко управлять сессиями отладки и корректно освобождать их при остановке процесса, что снижает вероятность блокировки обновления.

Решение 5: Блокировка регламентных заданий

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

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

Итог

Мы рассмотрели комплекс мер по борьбе с «неубиваемыми» сессиями и странным поведением конфигуратора. Основной вывод: появление кнопок «Перезапустить» вместо завершения сеансов — это следствие потери актуальной связи между конфигуратором и менеджером кластера. Использование настроек default.vrd, скриптов автоматизации и правильного протокола отладки позволяет минимизировать простои и сделать процесс разработки HTTP-сервисов значительно комфортнее.

← На главную